compiler will nicht, finde aber keinen fehler! plz help!
-
hi!
hoffe ich nerve mal wieder nicht zu sehr...
ich arbeite gerade die tutorials von win-api.de durch.
da mache ich jetzt ein exercise.
aber wenn ich das ding mit BCC551 compilen will, schreit der compiler dauernd folgendesC:\Borland\BCC55\Bin>bcc32 -tW C:\myc\err\err.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland c:\myc\err\err.c: Warning W8065 c:\myc\err\err.c 16: Call to function 'progress' with no prototype in function WinMain Warning W8060 c:\myc\err\err.c 24: Possibly incorrect assignment in function Win Main Error E2121 c:\myc\err\err.c 34: Function call missing ) in function progress *** 1 errors in Compile ***
der code, den er nicht mag, sieht so aus:
#define STRICT #include <windows.h> int progress (); int x; int iClicks_yes = 0; int iClicks_no = 0; int errorcount = 0; int WINAPI WinMain () { do { while (IDCANCEL != x) { progress (); } if (IDYES == x) {iClicks_yes++; } else if (IDNO == x) {iClicks_no++ ;} else {errorcount++ ;} } while (errorcount = 0); if (errorcount !=0) { MessageBox (NULL, "An error occured\nbad function detected...", "Error!", MB_ICONSTOP | MB_OK | MB_DEFBUTTON1); } return 0; } int progress () { x = MessageBox (NULL, "Please choose your destiny\n\nYou have chosen [YES] %d times.\nYou have chosen [NO] %d times" iClicks_yes iClicks_no, "Choice statistics", MB_ICONINFORMATION | MB_YESNOCANCEL | MB_DEFBUTTON1); return x; }
sieht jemand einen fehler???
thanx im voraus
---loki
-
Hallo,
folgendes habe ich entdeckt:
1. Sicherheitshalber wird die globale Variable x mit IDOK initialisiert.
2. der große if-Block muß wohl in die erste do-while-Schleife, wenn das Programm richtig zählen soll
3. die while-Bedingung sollte wohl eher so lauten (statt einer Zuweisung(=) in der Bedingung sollte es ein Vergleich(==) sein)
4. in der Funktion progress wird MessageBox falsch eingesetzt, MessageBox kann mit einem Format-String (mit %d usw...) nichts anfangen, du mußt vorher in einen String formatieren, z.B. mit wsprintf:
zusammengefaßt:
#define STRICT #include <windows.h> int progress (); int x = IDOK; int iClicks_yes = 0; int iClicks_no = 0; int errorcount = 0; int WINAPI WinMain () { do { while (IDCANCEL != x) { progress (); if (IDYES == x) { iClicks_yes++; } else if (IDNO == x) { iClicks_no++; } else { errorcount++; } } } while (errorcount == 0); if (errorcount !=0) { MessageBox (NULL, "An error occured\nbad function detected...", "Error!", MB_ICONSTOP | MB_OK | MB_DEFBUTTON1); } return 0; } int progress () { char pszText[255]; wsprintf(pszText, "Please choose your destiny\n\nYou have chosen [YES] %d times.\nYou have chosen [NO] %d times", iClicks_yes, iClicks_no); x = MessageBox (NULL, pszText, "Choice statistics", MB_ICONINFORMATION | MB_YESNOCANCEL | MB_DEFBUTTON1); return x; }
MfG
-
loki1985 schrieb:
Warning W8065 c:\myc\err\err.c 16: Call to function 'progress' with no prototype in function WinMain
Könnte daran liegen, dass du für progress keinen Prototyp angegeben hast :p Mal sehen ...
int progress ();
Das ist kein Prototyp. Nur der Rückgabetyp wird deklariert, die Argumentliste bleibt offen! Um auszudrücken, dass progress keine Argumente annimmt, muss nur wenig verändert werden:
int progress(void);
Das macht aus der Deklaration einen Prototyp und erlaubt dem Compiler, auch bei den Argumenten einen Typencheck durchzuführen.
-
ja, Bashar, die Warnung ist mir durch die Lappen gegangen
MfG
-
boah!
vielen dank!
jetzt klappt fast alles, und den kleinen rest kann ich alleine zum laufen bringen!
ich muss mich echt bedanken, ich habe vor etwa 2 monaten angefangen, ANSI C zu lernen, und dank eurer hilfe bin ich immer noch total motiviert!
den aufbau habe ich bis auf eure hilfe alleine gemacht, glaubt ihr dass ist für 2 monate lernen (neben dem job) OK, oder sollte ich da schon weiter sein?
nochmal danke für den tollen support,
---loki
-
daß du diese Fragen zu den Warnungen und Fehlermeldungen hier gestellt hast, läßt nicht den Schluß zu, daß du mit zwei Monaten Erlernen von ANSI-C (und auch noch nebenbei, so daß es effektiv nicht mal zwei Monate sind) auf einem schlechten Stand bist. Vielmehr solltest du es so sehen:
Man muß Fehlermeldungen/Warnungen vom Compiler erst einmal "kennenlernen", dann weiß man, wo das Problem liegt.
Die Warnung
Warning W8060 c:\myc\err\err.c 24: Possibly incorrect assignment in function WinMain
bekommt man ja schon dann, wenn man etwas unkonzentriert ist (passiert auch mir hin und wieder mal).
die andere Warnung:
*Warning W8065 c:\myc\err\err.c 16: Call to function 'progress' with no prototype in function WinMain
*hat man sich auch schnell eingehandelt, denn es gibt tatsächlich Compiler, die das ohne Warnung durchgehen lassen, und vielleicht gibt es auch Bücher/Tutorials/Code, in denen diese Ungenauigkeit (fehlende Angabe der Parameter-Typen im Prototypen bei einer Funktion, die keine Parameter erwartet) vorhanden ist. Korrekt ist es allerdings nicht, die Parameterliste leer zu lassen, wenn man die Typprüfung sicherstellen will
der Compiler-Fehler:
Error E2121 c:\myc\err\err.c 34: Function call missing ) in function progress
war wohl auch nur ein Schreibfehler von dir. Und daß du bei den Parametern für MessageBox etwas danebengelegen hast, ist auch nicht so tragisch, denn das ist auch kein ANSI-C-Problem, sondern in der MSDN dokumentiert (und das gehört dann zum Thema "Windows-Programmierung", und nicht zum Verständnis von ANSI-C)
Viel bedenklicher hätte mich gestimmt, wenn du hier eine Frage zu etlichen Compiler-Fehlern gestellt hättest, die du in das Programm (unfreiwillig) "eingebaut" hast, das wäre dann für zwei Monate nicht ok gewesen, aber so ist es ok..
ich denke, diese Anmerkungen sollten Motivation genug darstellen...
in diesem Sinne: weiter so
MfG