Fehler beim Speichern bzw. beim Lesen
-
ich habe ein Programm geschrieben, welches eine input-Datei einliest, diese auswertet und bearbeitet. Dieses input-file besteht aus durchgehendem Text der durch '|' getrennt ist. Dieses Programm gibt dann eine formatierte liste aus. Jedoch sind in den input-File auch Kommentare, die entfernt werden sollen. Jedes Kommentar beginnt mit einer # und endet mit "<-bla". Es kann auch sein, dass nach einem Kommentar kein "<-bla" folgt, dieses Kommentar soll nicht entfernt werden. Auf jeden Fall habe ich (mit der Hilfe von AJ) ein Tool geschrieben, welches sich auch einwandfrei compilieren lässt, bei der Ausführung aber folgenden Fehler zurückgibt: "Die Anweisung in ... verweist auf Speicher in ... . Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden." Woran kann das liegen? Habe auch schon verschiedene Mgl. ausprobiert, hoffe jemand kann mir weiter helfen... Bisher habe ich es so versucht...
char* del(char *neu, char *string) { int laenge_neu = 0; char *a; char *b; char *h; // Neuinitialisierung der Variablen laenge_neu = strlen(neu); if(laenge_neu) { a = strchr(string, '#'); b = strstr(string, neu); h = strchr(pchar+1, '#'); if(!h || b < h) { strcpy(a, b + laenge_neu); } } return in; }
-
vielleicht solltest du testen, ob strchr immer etwas passendes zurück gibt...
und einen debugger gibt es ja auch noch
-
komme mit dem debugger nicht wirklich klar...
auf jeden Fall bleibt er immer bei:str_misaligned: ; simple byte loop until string is aligned --> mov cl,[edx] inc edx
...stehen und es kommt der Fehler Access Violation...
-
Geh step-by-step durch (natürlich mit debuginformationen kompilieren) und dann wirst du sehen in welcher Zeile er abstürtzt.
Ansonsten benutze doch simple debug ausgaben, ala
puts("betrete funktion");
printf("suche %c in %s\n", a,b);
char* p=strchr(a, b);
printf("ergebnis %s pointer\n", (p?"valid":"invalid"));etc.
so kann man ganz simpel an jedes problem herangehen.
dennoch solltest du lernen, wie du deinen debugger benutzt.
uU hilft eine IDE bzw. ein grafisches Frontend für den debugger (falls du nicht schon eins benutzt)PS:
Access Violation heisst, dass du auf Speicher zugreifst, der dir nicht gehört.
zB:
char* p=0;
*p='x';
oder
char c[2];
c[2]='x';
etc.
-
str_misaligned: ; simple byte loop until string is aligned --> mov cl,[edx] inc edx
kann immer noch keinen Fehler finden... und der debugger gibt auch wenig auskunft über den fehler. (führt zu dem oben geschilderten ergebnis) Kann es sein, dass man das entfernen anders umsetzen muss? bin schon (fast) am verzweifeln...
-
char* del(char *neu, char *string) { int laenge_neu = 0; char *a; char *b; char *h; // Neuinitialisierung der Variablen laenge_neu = strlen(neu); if(laenge_neu) { a = strchr(string, '#'); if(a) { b = strstr(string, neu); h = strchr(pchar+1, '#'); if(b && (!h || b < h)) { strcpy(a, b + laenge_neu); } } } return in; }
Du hast die Abprüfung von a und b weggelassen. Die hatte ich in den vorherigen Thread nicht umsonst rein ;).
Das mit der Länge kannst du dir übrigens sparen, denn wenn der string neu nichts enthält wird strstr() auch nichts finden, also 0 zurückgeben.
-
danke, jetzt klappt es (fast) perfekt.
die fehlermeldung kommt nicht mehr. jetzt werden aber lediglich die ersten beiden Kommentare wirklich sauber entfernt. Wie oder besser gesagt was kann ich für eine Schleife noch darum machen, damit wirklich alle Kommentare (die mit # beginnen und mit <-bla enden) beseitigt werden?
Ich habe es bisher ähnlich wie die Lösung, die AJ gepostet hat... Danke
-
An der Schleife darfst du jetzt selber mal ein bisschen basteln :D. Nur ein kleiner Tipp: Du musst die Schleife solange durchgehen solange noch einen '#' im Text ist. Dabei solltest du allerdings nicht immer von vorne weg den '#' suchen ;). Viel Erfolg!