Stack Problem?
-
Hallo zusammen.
Ich habe ein Programm zusammen klamüsert, was die ASCII Zeichen einmal auf dem Bildschrim und einmal in eine Datei ausgibt. Funktioniert auch, wenn man bei der Fehlermeldung auf Ignorieren klickt.Wenn ihr das Programm laufen lasst, müsst Ihr die Frage, ob er weitermachen soll, mit N beantworten, gebt dann einen neuen Dateinamen ein und drückt ENTER. Und promt kommt die Fehlermeldung "Run-Time Check Failure #2 - Stack around the variable 'Tmp' was corrupted."
Ich habe schon debuggt ohne Ende, aber ohne Ergebnis. Ich weiß nicht, wo der Fehler liegt.
Hier der Quelltext:
int ASCII( int Bildschirm, int Datei, char D_name[255], char D_endung[3] ) { if ( Bildschirm != 0 ) { for ( int i = 33; i <= 255; i++ ) { if ( i == 255 ) cout << i << "=" << (char) i <<"\t"; else { cout << i << "=" << (char) i <<"\t"; i++; cout << i << "=" << (char) i <<"\t"; i++; cout << i << "=" << (char) i <<"\t"; } } } if ( Datei != 0 ) { char Dateiname[255] = "C:\\ASCII."; char Tmp[255]; int pruef = 0; if ( D_name != NULL) { int laenge = strlen(D_name); if ( laenge > 8 ) { cout << endl; cout << "Vorsicht! Der Dateiname ist laenger als 8 Zeichen. Somit wird das DOS-Format\n nicht mehr unterstuetzt." << endl; cout << "Moechten Sie trotzdem Fortfahren? ( j / n )"; char auswertung = getche(); if ( auswertung != 'j' ) { do { int zeichen = 0; cout << "Bitte neuen Dateinamen eingeben:"; do { Tmp[zeichen] = getche(); zeichen++; }while ( Tmp[zeichen-1] != '\r' ); for ( int j = zeichen-1; j <= 255; j++ ) { Tmp[j] = NULL; } laenge = strlen(Tmp); }while ( laenge > 8 ); pruef = 1; } } if ( pruef == 1 ) { int zahl = 0; for ( int i = 3; i <= laenge+2; i++ ) { Dateiname[i] = Tmp[zahl]; zahl++; } } else { int zahl = 0; for ( int i = 3; i <= laenge+2; i++ ) { Dateiname[i] = D_name[zahl]; zahl++; } } int zwischenspeicher = laenge + 2; Dateiname[zwischenspeicher+1] = '.'; int zahl2 = 0; for ( int y = 2; y <= 4; y++ ) { Dateiname[zwischenspeicher+y] = D_endung[zahl2]; zahl2++; } } else { Dateiname[9] = D_endung[0]; Dateiname[10] = D_endung[1]; Dateiname[11] = D_endung[2]; } //cout << Datei << endl; FILE *f; f = fopen(Dateiname,"w+"); for ( int i = 33; i <= 255; i++ ) { for ( int y = 0; y <= 9; y++) { if ( i < 255 ) { fprintf(f,"%i=",i); fprintf(f,"%c\t",(char)i); i++; } else { fprintf(f,"%i=",i); fprintf(f,"%c\t",(char)i); break; } } if ( i != 255 ) { fprintf(f,"\n"); i--; } else { fprintf(f,"\n"); break; } } fclose(f); } return 0; }
Nur zur Info: Das ist eine Headerdatei und wird in der Funktion main() ganz normal aufgerufen.
Hier der Aufruf der Funktion mit den Übergabewerten:
int ausgabe = ASCII(1,1,"testmicheinfachduknackkanone","txt");
-
for (int j = zeichen-1; j <= 255; j++) { Tmp[j] = NULL; }
j läuft bis 255, das Array hat aber nur 255 Elemente, von 0 bis 254. BTW warum weist du dort NULL zu? NULL steht für den Nullpointer und sollte nicht bei jeder Gelegenheit, bei der man eine 0 braucht, verwendet werden.
-
ja richtig
stümmt. der beginnt ja bei 0. Hab ich ja gar nicht mehr dran gedacht.Das mit NULL hab ich gemacht, weil ich hinterher ja die Stringlänge bestimmen lasse und weil da vorher nur Speicherschrott drinsteht, wusste ich jetzt nicht, ob er das mitzählt. Desshalb hab ich die mit NULL belegt.
-
Nein, du mißverstehst mich, ich sage nichts gegen das Nullsetzen, sondern gegen die Verwendung von NULL. NULL steht für einen Nullzeiger, nicht für irgendwelche anderen Nullwerte. Du solltest besser Tmp[j] = 0 oder Tmp[j] = '\0' schreiben, das vermeidet Verwirrungen.
-
aso
ja gut; dann mach ich das sokannst du mir vielleicht noch sagen, wie ich die hexwerte rausbekomme? jetzt lass ich die zeichen ja mit dem typecast (char) umwandeln. gibt es sowas auch für die hexwerte?
-
... cout << i << "=" << hex << (char) i <<"\t"; ...
-
Bashar schrieb:
NULL steht für einen Nullzeiger, nicht für irgendwelche anderen Nullwerte.
Aber selbst das ist nicht mehr wirklich, NULL wird doch für die Zukunftssicherheit garnicht mehr empfohlen. Einfach 0 für Nullzeiger verwenden.
-
Und damit ist die Verwirrung komplett
-
cout << i << "=" << hex << (char) i <<"\t";
macht er mir net ganz *wein*
-
Artchi schrieb:
Bashar schrieb:
NULL steht für einen Nullzeiger, nicht für irgendwelche anderen Nullwerte.
Aber selbst das ist nicht mehr wirklich, NULL wird doch für die Zukunftssicherheit garnicht mehr empfohlen. Einfach 0 für Nullzeiger verwenden.
Dass NULL nicht wirklich brauchbar ist, ist ja bekannt. Ich würde trotzdem empfehlen es zu benutzen, denn sollte irgendwann mal null_ptr oä als Schlüsselwort kommen, dann ist das sicher einfacher zu ersetzen als 0.
-
groovemaster schrieb:
denn sollte irgendwann mal null_ptr oä als Schlüsselwort kommen
Schlüsselwort? null_ptr ist doch AFAIK eine Library Lösung.
-
MSS-Software schrieb:
cout << i << "=" << hex << (char) i <<"\t";
macht er mir net ganz *wein*
ohh, mein fehler:
std::cout << i << "=" << std::hex << i <<"\t";
-
kingruedi schrieb:
Schlüsselwort? null_ptr ist doch AFAIK eine Library Lösung.
Kann sein, keine Ahnung. Es gibt aber auch einen Vorschlag, null_ptr als Schlüsselwort in den nächsten Standard aufzunehmen. Wenn ich den Link wiederfinde, werde ich den mal posten.