Funktionen definieren in VisualC++2008
-
Hallo, mein Problem ist folgendes. Ich bin in meinem Buch Vorgestern in einem Kapitel angelangt in dem man sich eigene Funktionen definiren soll. Dies soll vor main() geschehen. Leider Funktioniert von den Aufgaben nicht eine. Ich bekomme immer folgende Fehlermeldungen:
1>c:\users\erikson\documents\visual studio 2008\projects\new_line\new_line\new_line.cpp(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\erikson\documents\visual studio 2008\projects\new_line\new_line\new_line.cpp(13) : warning C4508: 'new_line': Funktion sollte einen Wert zurückgeben; Ergebnistyp 'void' angenommen
Habe Gestern schon einige Stunden dazu gegoogelt aber ich kahm trotzdem auf keinen Grünen zweig. Die Fehlermeldung hatte wohl schon einige Leute auf dem Bildschirm aber meist im anderem Zusammehang. Ich denke dass das Problem nicht am Quellcode liegt sondern vieleicht an Visual C++ oder vieleicht an einer ausgelassenen wichtigen Erklärung in dem Buch. Wäre Nett wenn ihr mir helft ich will schließlich verstehen was ich da tue. Danke
Hier noch eine Beispielcode:
#include "stdafx.h" #include "windows.h" new_line (int x) { int zaehler; for(zaehler=1;zaehler<=x;zaehler++) printf("\n"); } int main () { printf("TEST"); new_line (3); printf("TEST"); system("PAUSE"); }
SORRY FÜR DIE RECHTSCHREIBUNG
-
Wenn du nichts zurückgeben möchtest, musst du als Rückgabetyp void angeben, ansonsten wird per default int angenommen. Da du keinen Rückgabetyp angegeben hast, ist genau dies geschehen (erste Zeile der Meldung), doch dann hast du eben doch nichts zurückgegeben (zweite Zeile) wodurch der Compiler total verwirrt ist.
edit: Und du hast dein Programm mit einem C++-Compiler übersetzt. In C++ ist default int nicht mehr erlaubt.
-
Ach so Dankse! Dann bin ich ja voll aufm Holzweg dachte C++ compiler können auch C compilieren.
-
Können sie auch.
Eine Hilfe für den Compiler wäre schon mal das Programm mit der Endung .c zu benennen (also new_line.c).Du kannst auch in den Projektoptionen einstellen ob der Compiler C oder C++ übersetzt.
Wie heißt den das Buch?
-
Erikson schrieb:
Ach so Dankse! Dann bin ich ja voll aufm Holzweg dachte C++ compiler können auch C compilieren.
In der Regel ja, bis auf einige kleine Ausnahmen. Schwierigkeiten machen eher genau diese Hacks wie du sie hier verwendest. Default int zu benutzen (und das auch noch falsch) ist eher etwas für den IOCCC und nicht für ein modernes C-Programm.
-
Ach so das Buch heisst "C programmierung von Anfang an" vom rororo Verlag. Finde mich da ja gerade erst richtig rein. Hatte mal C programmierung in der Ausbildung das lag mir aber nicht. Assembler ging da schon besser. Auf Grund meines bevorstehenden Studiums wollte ich mich aber im Vorfeld schonmal damit beschäftigen und bis jetzt finde ichs auch sehr interesant.
-
Wenn das da so drin steht, werden auch noch andere Macken drin sein. Dann taugt das Buch nichts.
Das ist noch das C von K&R*. Das ist seit 1989 vorbei. 'Damals' wurde C als C89 oder ANSI-C genormt. Aus Kompatibilität kann man auch Heute noch int als Default annehmen.
Aber guter Stil ist das nicht.
*Bei K&R sieht aber die Paramterliste anders aus.
-
Da du ja wohl mit Visualstudio arbeitest, solltest du, wenn du wirkliches C und nicht C++ programmieren willst, dies dem Compiler auch bekanntgeben:
- Projekteigenschaften / C/C++ / Erweitert / Kompilierungsart / /TC
oder
- die cpp-Dateien in c-Dateien umbenennenDamit erreichst du wirklichen C Code und tappst nicht in diverse Fallen wie hunderte Leute vor dir.
-
Ich dachte es ist vieleicht sinnvoll mit C anzufangen und später auf C++ umzusteigen. Ich arbeite mit visual c++ 2008 express so wies aussieht ist das voll auf c++ ausgelegt. Hat bisher aber alles reibungslos geklappt. Bis auf Fehler die ich mir selbst zuzuschrieben hatte!?
-
Erikson schrieb:
Ich dachte es ist vieleicht sinnvoll mit C anzufangen und später auf C++ umzusteigen.
Ist durchaus möglich, aber nicht sinnvoll. Auf diese Weise sammelst du nur massenhaft Programmiertaktiken, die in C notwendig sind, aber in C++ als schlechter Stil (oder schlimmeres) angesehen werden.
-
Habe auch noch icc win 32 aufm Rechner da hab ich den code von oben mal reincopiert und der zeigt mir dann an defaulting to int. Der compiler scheint das also zu verstehen aber dafür zeigt er mir immer folgenden Fehler:
syntax error; missing semicolon before 'end of input'
diesen fehler zeigte mir der compiler früher schonmal. Da ich beim besten willen kein Fehlendes semicolon entdecken konnte wechselte ich damals auf visual c++.
Weiss echt nich was ich machen soll iwie muss dass doch funktionieren. Würde gerne bei visual c++ bleiben komme damit gut klar.
-
Erikson schrieb:
Ich arbeite mit visual c++ 2008 express so wies aussieht ist das voll auf c++ ausgelegt.
Meine (ANSI-) C Programme von 1993 kann ich damit übersetzten.
Bei jeder neuen VS Version meckert der Compiler aber immer etwas neues von wegen unsicheren Funktionen an. Die Warnungen kann man aber abschalten.
-
Erikson schrieb:
Weiss echt nich was ich machen soll iwie muss dass doch funktionieren.
Gehe davon aus, dass der Compiler immer Recht hat.
Alternativ kannst du deinen Code auch mit Onlinecompilern austesten, z.B.
http://codepad.org
http://ideone.comErikson schrieb:
Würde gerne bei visual c++ bleiben komme damit gut klar.
Dann mache das doch. Und zu Beginn jedes Projektes bietet sich an:
#undef UNICODE #undef _UNICODE #pragma warning( disable:4996 )
nebst des o.g. Schalters /TC.
-
Erikson schrieb:
syntax error; missing semicolon before 'end of input'
Schau mal nach, ob du in der letzten Zeile (die mit der } ) auch die Enter-Taste gedrückt hast.
Es muss dann noch eine Zeile 19 geben, die aber leer ist.
-
Der icc ist auch wieder ein reinrassiger C Compiler, mit dem funktioniert das mit dem default int.
Falls du weiterhin einen C++ Compiler benutzen möchtest, sei dir im klaren, dass C keine Untermenge von C++ ist, auch wenn das oft gesagt wird. Ein paar Dinge gehen eben nicht. Und Sachen aus dem C99-Standard meistens erst recht nicht. Oftmals kann man C++-Compilern aber auch beibringen, sich wie ein C Compiler zu benehmen (wenn man auf C99-Kompatibilität verzichtet). Wie dir schon gesagt wurde, kannst du mal ausprobieren, der Datei einfach eine .c Endung zu geben.
-
So zur Rückmeldung es Funktioniert jetzt in Visual C++ durch umbennnen der datei auf datei.c Finde die Lösung nicht gerade gut den das scheint nur zu funkitonieren wenn man vorher ein Jungfräuliches Projekt öffnet. Also müsste ich daran immer denken. Es muss doch gehen , dass von Visual C++ von Anfang an eine .c und keine.cpp Datei angelegt wird!? Die Option zum umstellen auf TC finde ich leider nicht.
Ach so und was genau (Bitte für Dumme
) versteht denn der compiler nicht das er überhaupt int als default annhemen muss. Ich müsste ihm ja auch sagen können verwende int und dann wär gut oder nicht? Wenn ja wo? Wie? An welcher Stelle muss da int stehen?
-
Bei einer Funktionsdefinition mußt du normalerweise einen Rückgabetyp angeben, d.h. mit
int new_line()
odervoid new_line()
ist auch ein C++ Compiler zufrieden. Du hattest dort oben keinen Rückgabetyp angegeben und deshalb den Compiler verwirrt.
-
Wenn du aber einen anderen Rückgabetyp als void angibst, musst du auch einen Wert mit return zurückgeben.
Den Rückgabewert brauchst du aber nicht auswerten.
Z.B. gibt printf die Anzahl der geschriebenen Zeichen zurück oder im Fehlerfall eine negative Zahl.
-
Danke jetzt hab ichs verstanden. Einfach Typ des Rückgabewertes vor meine definierte Funktion schreiben. Dann klappts auch. Steht ein paar seiten weiter auch in dem Buch. Das hätte man dort allerdings früher erwähnen können. Wenn man schon ein Buch schriebt müsste ja bekannt sein das es da mit einigen compilern probleme geben kann. Na ja ich kann jetzt jedenfalls in Ruhe weiter dran arbeiten.
Nur das dauerhafte umstellen von Visual C++ 2008 Express gelingt mir immernoch nicht. Ich finde die option einfach nicht wo ich auf TC umstellen kann. Wenn einer hier auch damit arbeitet wäre es echt nett wenn er mir das nochmal genau erläutern konnte. Den von Wutz erklärten Weg scheint es nicht zu geben. Oder ich bin zu dumm es zu finden.
DANKE!
-
Dann taugt der Erlenkötter also auch nichts, naja, wieder mal ein Streichkandidat.