WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   C-Programm-fehlerhaft? (http://www.wcm.at/forum/showthread.php?t=116221)

Bastet 21.11.2003 16:21

C-Programm-fehlerhaft?
 
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?

hewlett 21.11.2003 16:39

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!");
}

Dieses Buch kann ich dir auch empfehlen:
http://www.amazon.de/exec/obidos/ASI...778533-6544051

Bastet 21.11.2003 16:52

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 :D

Biri 21.11.2003 18:30

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

kikakater 21.11.2003 21:13

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.

AlexanderFX 21.11.2003 21:45

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!");
}

mfg alex

Bastet 22.11.2003 09:55

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 :lol: ;)

Flink 22.11.2003 10:10

Zitat:

Original geschrieben von AlexanderFX
Code:

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 */


so muss das lauten:
Code:

ausgabe(2);  /* "" werden nur bei Strings (char []) verwendet */

kikakater 22.11.2003 10:41

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

~

Bastet 23.11.2003 18:01

Zitat:

Original geschrieben von kikakater
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.

stimmt, habe jetzt djgpp und die beispiele funktionieren anstandslos - naja bis auf eine klitztkleinigkeit - nach dem } endet das programm nicht - es hat ne schleife.

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag