merkwürdige fehler bei vergleich / grösser
-
muss ich noch ausprobieren. bin auf der arbeit, kann es daher gerade nicht ausprobieren.
wenn ich zu hause bin versuche ich es mal, kann auch den echten problematischen teil ausschneiden und mal posten...
-
hohesC schrieb:
(die ints sind alles globals)
Ich dachte globale variablen spricht man so an:
int GlobaleVariable; void main() { ::GlobaleVariable=2; }
mfg hohesC
Erstmal ist das C++. Und zweitens spricht man so explizit Variablen aus dem globalen Namespace an. Das macht aber meistens nur Sinn, wenn es im aktuellen Namespace einen Bezeichner mit dem gleichen namen gibt.
loki1985 schrieb:
btw: gibt es da eigentlich eine möglichkeit die auch in einer header-datei zu initialisieren?
Ja, gibt es. Aber das sind hässliche Workarounds, also lass es bleiben.
-
groovemaster schrieb:
Ja, gibt es. Aber das sind hässliche Workarounds, also lass es bleiben.
naja, 80% / ca. 50 lines meiner main.c bestehen aus initialisierung der globalen, und das macht das ganze etwas unüberischtlich....
was sind denn die drawbacks von so einem ausgelagerten initialisieren (was macht es "hässlich") ?mfg,
---loki
-
@loki
Da du in der globals.h die Deklarationen deiner Variablen schreibst, solltest du in der globals.c deine Initialisierungen vornehmen.Zum eigentlichen Problem:
Zeig mal die Deklaration und Initialisierung von current_digit.
-
AJ schrieb:
Zum eigentlichen Problem:
Zeig mal die Deklaration und Initialisierung von current_digit.super, mach ich sofort wenn ich nach hause komme...
-
loki1985 schrieb:
naja, 80% / ca. 50 lines meiner main.c bestehen aus initialisierung der globalen, und das macht das ganze etwas unüberischtlich....
Übersichtlichkeit und Lesbarkeit hängen ja in erster Linie nicht von der Menge des Codes ab, sondern vom Codestil. Vielleicht solltest du auch mal darüber nachdenken, ob du nicht einige globale Variablen eliminieren kannst.
loki1985 schrieb:
was sind denn die drawbacks von so einem ausgelagerten initialisieren (was macht es "hässlich") ?
Hässlich einfach deshalb, weil Header dafür nicht gemacht sind. Variablen mit externer Bindung dürfen pro ÜE nur einmal definiert werden. Das kannst du zwar mit Include-Guards erreichen, bleibt aber trotzdem noch das Problem bei mehreren ÜE. IIRC gab es hier im Forum mal einen Beitrag, wo jemand erläutert hat, was man dann genau machen muss. Aber das rechtfertigt imo den Aufwand nicht. Und ich bin mir auch nicht sicher, ob dabei nicht doch irgendeine Verletzung einer ODR als Seiteneffekt auftreten kann.
-
ok, hier mal ein extrem zusammengeschnittener code....
globals.h:
#ifndef _GLOBALS_H_ #define _GLOBALS_H_ extern int encrypt_digit1; extern int encrypt_digit2; extern int encrypt_digit3; extern int current_dec_asc_digit; extern int current_dec_asc_digit_num; #endif
main.c:
#include <stdio.h> #include "globals.h" void enc_line(char linestring[]); int encrypt_digit1; int encrypt_digit2; int encrypt_digit3; int current_enc_asc_digit; int current_enc_asc_digit_num = 0; char debugstring_temp[255]; int main(int argc, char *argv[]) { encrypt_digit1 = 'a'; encrypt_digit2 = 'b'; encrypt_digit3 = 'c'; FILE *log_output; log_output=fopen("debug.log", "ab"); if(log_output==NULL) { fprintf(stdout, "ERROR: cannot create debug.log\n"); return 0; } enc_line("test-test-test"); fprintf(log_output, "%s", debugstring_temp); return 0; } void enc_line(char linestring[]) { char tempstring[255] = ""; int currentbyte = 0; while(currentbyte < strlen(linestring)) { if ((linestring[currentbyte] + current_enc_asc_digit) > 256) { sprintf(tempstring, "%s%c", tempstring, linestring[currentbyte] + current_enc_asc_digit - 256); } else { sprintf(tempstring, "%s%c", tempstring, linestring[currentbyte] + current_enc_asc_digit); } current_enc_asc_digit_num++; if(current_enc_asc_digit_num > 2) {current_enc_asc_digit_num = 0;} // <-- das böse!!! if(current_enc_asc_digit_num == 0) {current_enc_asc_digit = encrypt_digit1;} if(current_enc_asc_digit_num == 1) {current_enc_asc_digit = encrypt_digit2;} if(current_enc_asc_digit_num == 2) {current_enc_asc_digit = encrypt_digit3;} currentbyte++; } strcpy(debugstring_temp, tempstring); return; }
das blöde ist das der bei mir funktioniert. die sache mit dem original ist die, das es die ersten ca. 20 aufrufe von "enc_line(string);" auch funktioniert, der fehler kommt also nicht gleich beim ersten mal, bzw. nicht immer.
//EDIT: hab das forum gesprengt, sah schlecht aus...
-
loki1985 schrieb:
ok, hier mal ein extrem zusammengeschnittener code....
...
das blöde ist das der bei mir funktioniert.Dann liegt der Fehler in dem Teil des Codes, den du hier weggelassen hast. Das meinte ich mit Minimalbeispiel, das den Fehler reproduziert. Solange du das nicht lieferst, können wir dir hier nicht helfen.
Außer, du findest jemanden, der dein ganzes Programm für dich debugt.
-
das problem ist, dass der komplette quellcode über 30 kB gross ist, und den komplett zu posten dürfte etwas schwierig sein.
ich kann auch nur schwer ein minimalbeispiel das den fehler reproduziert liefern, da die eingabe in "enc_line(string);" immer unterschiedlich ist. das einzige was ich probieren kann, ist, die eingabe zu loggen, und dann damit versuchen es zu reproduzieren.
ich werde schauen dass ich, wenn ich etwas zeit habe, einen neuen code bringe, OK?
-
hab mal eine ZIP mit den dateien die das problem (oder ein identisches) verursachen hochgeladen.
wäre super wenn sich das jemand anschauen könnte um mir bei dem problem zu helfen.
compilen tu ich mit der aktuellen version von MinGW. zum compilen kann man einfach die datei "compile" im ZIP benutzen (in msys)...hier ist die datei:
http://da41d.port5.com/prob2.zip
-
while(c != EOF) {
c = fgetc(infile);
c = dec_byte(c); // hier wird das byte decoded... wenn man das auskommentiert funktioniert es problemlos...Ist ja schön, dass du auf EOF prüfst, aber das solltest du nach fgets machen, nicht davor. Sonst decodierst du die eof-markierung (-1). Dabei kommt 255 raus, und das schreibst du dann immer wieder in scriptlines[currentline]. Die Schleife bricht nie ab, weil 255 ja nicht -1 ist. Das geht so lange, bis du so weit über den reservierten Speicher hinaus geschrieben hast, dass das Programm abstürzt.
-
@loki
Noch ein kleiner Tipp: Initialisiere deine Variablen, bevor du sie benutzt!
-
@MFK: vielen dank, ich glaube das ist wirklich das problem!
werde das später ausprobieren@AJ: stimmt, aber wo siehst du eine uninitialisierte variable
habe keine gefundenaber trotzdem danke!
-
loki@school schrieb:
@AJ: stimmt, aber wo siehst du eine uninitialisierte variable
habe keine gefundenint c;
-
stimmt. wusste nicht das das sein muss...
heisst das es sollte gehen wenn ich statt "int c;" "int c = 0;" schreibe?hmm, hab das grade ausprobiert, und es zeigt auch keinen anderen effekt.
@MFK: hab deine theorie nochmal durchgedacht, und ich denke daran kann es nicht liegen... denn dann dürfte es nur am ende des files abstürzen, aber so wie es aussieht stürzt es entweder nach dem ersten char ab, oder nach dem ersten binären '\n'....
-
loki@school schrieb:
@AJ: stimmt, aber wo siehst du eine uninitialisierte variable
habe keine gefundenDeine globale Variable current_enc_asc_digit ist nicht initialisiert in deinem Code, bevor du sie benutzt, d. h. es steht da irgendeine Zahl drin, die du abprüfst in deiner Funktion enc_line().
-
jo, stimmt. liegt daran das ich die gepostete version schlecht zusammengeschnitten hab. aber da war der fehler auch nicht direkt reproduzierbar. deshalb habe ich die ZIP hochgeladen (siehe 4 posts höher), darin ist das problem direkt reproduzierbar...
-
AJ schrieb:
Deine globale Variable current_enc_asc_digit ist nicht initialisiert in deinem Code, bevor du sie benutzt, d. h. es steht da irgendeine Zahl drin, die du abprüfst in deiner Funktion enc_line().
Globale Variablen werden automatisch mit 0 initialisiert, genau wie bei static.
-
loki1985 schrieb:
@MFK: hab deine theorie nochmal durchgedacht, und ich denke daran kann es nicht liegen...
Das ist keine Theorie. Ich habe das mit dem Debugger getestet. Probieren geht über Studieren, wie man so schön sagt.
denn dann dürfte es nur am ende des files abstürzen, aber so wie es aussieht stürzt es entweder nach dem ersten char ab, oder nach dem ersten binären '\n'....
Wie es aussieht? Woraus ziehst du deine Schlüsse? Mein Debugger sagt, dein Programm stürzt am Ende der Datei ab, weil du zum falschen Zeitpunkt auf EOF testest.
-
Daniel E. schrieb:
AJ schrieb:
Deine globale Variable current_enc_asc_digit ist nicht initialisiert in deinem Code, bevor du sie benutzt, d. h. es steht da irgendeine Zahl drin, die du abprüfst in deiner Funktion enc_line().
Globale Variablen werden automatisch mit 0 initialisiert, genau wie bei static.
Stimmt, hab ich ganz verdrängt :(.