![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Elite
![]() Registriert seit: 07.09.2000
Beiträge: 1.036
|
![]() hab gerade mit c-einführung angefangen und da gibts ein übungsbeispiel:
------ #include <stdio.h> main() { ausgabe(2); } ausgabe(wert) int wert; { printf("Mein %d.", wert); printf("C-Programm!"); } ----- witzig daran ist, dass ich damit folgende errors habe: wert+ausgabe - nicht deklarierter bezeichner. main - ergebnistyp wird void angenommen (ok- des hab ich schon kapiert) <unbekannt> funktionsstil-initialisierung scheint eine funktionsdefiniton zu sein. also ich hab einfach mal das übungsbeispiel geändert und es hat anstandslos funktioniert, jetzt schauts so aus: ----- #include <stdio.h> void main() { int ausgabe; ausgabe=2; printf("Mein %d.", ausgabe); printf("C-Programm!"); } ----- jetzt bin ich aber ein bisserl konfus. wieso funktioniert das übungsbeispiel nicht, sondern meine eigene version? oder hab ich irgendwas daran nicht behirnt?
____________________________________
Bye Bastet |
![]() |
![]() |
![]() |
#2 |
Inventar
![]() Registriert seit: 08.11.2000
Alter: 42
Beiträge: 1.524
|
![]() so sollte es funktionieren:
Code:
#include <stdio.h> void ausgabe (int wert); void main (void) { ausgabe(2); } void ausgabe (int wert) { printf("Mein %d.", wert); printf("C-Programm!"); } http://www.amazon.de/exec/obidos/ASI...778533-6544051
____________________________________
H.E.W.L.E.T.T.: Hydraulic Electronic Worker Limited to Exploration and Terran Troubleshooting |
![]() |
![]() |
![]() |
#3 |
Elite
![]() Registriert seit: 07.09.2000
Beiträge: 1.036
|
![]() ja thx, aber ich kapier einfach nicht wieso das übungsbeispiel fehlerhaft ist, eigentlich sollten die beispiele doch korrekt sein!
bin eh stolz auf mich, dass ich selbst ne andere lösung gefunden hab, schliesslich weisst du ja das wievielte programm es ist ![]()
____________________________________
Bye Bastet |
![]() |
![]() |
![]() |
#4 |
Hero
![]() Registriert seit: 04.09.2001
Beiträge: 894
|
![]() obiges funktioniert nicht, weil das c-programm von "oben nach unten" abgearbeitet wird.
die main funktion "kennt" daher die Funktion <ausgabe> nicht. lösungen: ausgabe funktion vor der main-funktion definieren (schlechte lösung, weil nicht möglich, wenn es mehrere funktionen werden) bessere lösung: die von hewlett - d.h. vor der main funktion einen sog. prototypen der verwendeten funktion(en) definieren. fg + viel spaß noch beim lernen. -hannes |
![]() |
![]() |
![]() |
#5 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Das Übungsbeispiel zeigt die ursprüngliche Schreibweise von C Code.
Ohne Prototyp und ohne Angabe eines Datentyps im Funktionskopf ist der Rückgabetyp einer Funktion immer vom Typ int (Compilerannahme). Früher (vor dem Prototyping) hat man die Datentypen von Parametern nach dem Funktionskopf aufgelistet int funktion(p1,p2) int p1; long p2; { ... } Es handelt sich hier um eine alte Schreibweise, die neueren Compilern u.U. Probleme macht. |
![]() |
![]() |
![]() |
#6 |
Veteran
![]() |
![]() Code:
#include <stdio.h> /* nach den includes musst du alle funktionen deklarieren die du in deiner c oder cpp datei verwenden willst */ // --> Forwärtsdeklarationen void ausgabe (int wert); /* wenn du diese vorwärtsdeclaration nicht hast kannst du diese funktion nicht verwenden und bekommst eine fehlermeldung außerdem solltest du immer den variablen typ schon im funktionskopf zu deklarierne z.B. "void ausgabe(int var1, int var2); der ";" is acuh wichtig bei forwärtsdeklaration */ void main() /* am besten immer den rückgabe wert der funktion dazuschreiben sonst übersieht ma leicht was */ { ausgabe("2"); /* da ich mi nimmer so mit c beschäftige bin ich mir nicht sicher ob die "" bei der übergabe von zahlen nötig sind aber ich mach sie immer dazu um bessere übersicht zu bewahren */ } void ausgabe(int wert) //int wert; { printf("Mein %d.", wert); printf("C-Programm!"); } |
![]() |
![]() |
![]() |
#7 |
Elite
![]() Registriert seit: 07.09.2000
Beiträge: 1.036
|
![]() herzlichen dank an alle, ihr habt mir sehr geholfen - wieder was kapiert hab.
![]() vorallem als neuling ist es zwar noch ein bisschen verwirrend, wenn ma mal alle beispiele betrachtet und eigentlich doch immer aufs selbe ergebnis kommt. da stellt sich nur eine frage - welches beispiel sollte als richtig gelten? ja ich weiss - die logik des programmierens ist zeitweilig unergründlich ![]() ![]()
____________________________________
Bye Bastet |
![]() |
![]() |
![]() |
#8 | |
Hero
![]() |
![]() Zitat:
Code:
ausgabe(2); /* "" werden nur bei Strings (char []) verwendet */
____________________________________
Bibel |
|
![]() |
![]() |
![]() |
#9 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() C Programme haben keine Empathie. Das heißt, Code zu schreiben ist technisch richtig oder nicht. Etwas hineinzugeheimsen spielt es nicht.
Die Emotion kommt mit dem Designergedanken, mit den Techniken herumzuspielen, im übrigen Bibliotheken zu verwenden. Wichtig sind die Wertebereiche von Datentypen. Sowie die Unterscheidung von Datentypen zu Zeigervariablen, die Adressen beinhalten und EBEN NICHT Daten. Zeigervariablen können auch wiederum auf Zeiger - im Englischen "Pointer" - verweisen (z.B. char **argv <-- Zeiger oder char *argv[] <-- Array (=Feld)). Unterschiedlich zu einem Zeiger ist ein Array. Das Array stellt eine Anfangsadresse von gleichlautenden Elementen oder Kapselschlüssen (Objekte) dar. Einem Arraybezeichner kann keine neue rsp. andere Adresse im Programmlauf zugewiesen werden. Einer Zeigervariablen schon. char c; /* -128 bis +127 */ char *pc; /* Zeigervariable auf ein char Zeichen */ char yc[10]; /* Array mit 9 + 1 Elementen bei Verwendung als C String, sonst 10 Elemente. keine Überlaufprüfung ! */ Dynamische Anforderung von Speicher: pc= malloc(10); /* 10 Bytes anfordern und die Anfangsadresse dieses 10 Byte großen Speicherblocks der Variablen pc zuweisen, pc sollte tunlichst als char *pc; deklariert sein. Alles andere ist unsaubere Programmierung. */ void *pv; pv= pc; Umtypisieren von Daten oder Zeigern: int i; char c; i= (int) c; oder i= c; int *pi; char *pc; pi= (int *)pc; /* Vorsicht ! Dies ist bereits unsaubere Programmierung, und nur erlaubt, wenn man ein zweites (bzw. 3 weitere) Byte(s) hinter *pc (=dem Zeichen auf das die Adresse, die pc speichert, verweist) vorrätig hält. Portabilität: Zeichensatz (Umfang und Sortierreihenfolge) Wertebereich von Datentypen Reihenfolge der Stackargumente bei Funktionsaufrufen Big vs. Little Endian (Lowbyte vor Highbyte und umgekehrt) Interface Schnittstellen (Hüllfunktionen) zur Korrektur bzw. Anpassung von inkompatiblen Daten ~ |
![]() |
![]() |
![]() |
#10 | |
Elite
![]() Registriert seit: 07.09.2000
Beiträge: 1.036
|
![]() Zitat:
auch wenn ich noch ein exit hinzufüge lt. c compaktreferenz (hab so ziemlich alle exitarten ausprobiert) , dann bekomm ich immer die fehlermeldung : prase error at end of input
____________________________________
Bye Bastet |
|
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|