bozoo Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Ha Ha Hallo, ich ma wieder..... Warum krieg ich hier ein Acess-Violation: char delblanks(char array[]) { int j = -1; char mod_array[1000]; //zählt die blanks und slash's bis zum ersten vernünftigen zeichen do { j++; } while (array[j] == ' ' || array [j] == '/'); int n = 0; //löscht die zeichen bis stelle j for (int y=1; y <= j; y++) { mod_array[n] = array[j]; j++; n++; } mod_array[n] = '\0'; return *mod_array; } Zur Erklärung: Ich übergebe ein Array an die Fkt. Diese zählt die ersten Leerzeichen (, die ich dann löschen will) bis zum ersten vernünftigen Zeichen. Dann will ich die Leerzeichen löschen. Greetz Volkaman. Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 deklarier erstmal deine Funktion als char* und gib einfach mod_array zurück. So wie's da steht gibst du nämlich nur das erste Zeichen von mod_array zurück, wenn du jetzt da mit standard-string-Funktionen drangehst, gibst Fehler weil der Rückgabewert nicht der Konvention eines nullterminierten char-Arrays entspricht. Zitieren
maddin Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 der fehler liegt in der for- schleife. hier hast du eine laufvariable - y -, die nach jedem schleifendurchlauf um 1 erhöht wird. die schleife soll nun solange laufen, wie y < j ist. j allerdings wird auch am ende des schleifenkörpers erhöht. angenomen j wird in der ersten schleife bis auf 2 erhöht und die schleife beginnt, ist beim ersten durchlauf ist die bedingung y < j also 1 < 2. bei der zweiten prüfung der bedingung wurden vorher beide werte erhöht. also lautet die bedingung 2 < 3. und so weiter. irgendwann sind die werte über die grenzen eines der beiden array hinausgelaufen. dadurch gibt es dann beim leseversuch einen READ - Fehler. Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von maddin: <STRONG>der fehler liegt in der for- schleife.</STRONG> Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 SUPAAA!!! @Käptn: Was meinst Du mit delete/free ??? Gruss Volkaman Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 Hi Käpt'n, hab Deine Vorschläge berücksichtigt. Beim Kompilieren krieg ich jetzt aber diese Fehler: C:\WINNT\Profiles\bohn\Desktop\main4.cpp(50) : warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben C:\WINNT\Profiles\bohn\Desktop\main4.cpp(106) : error C2440: '=' : 'char *' kann nicht in 'char' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat C:\WINNT\Profiles\bohn\Desktop\main4.cpp(125) : error C2440: '=' : 'char *' kann nicht in 'char' konvertiert werden usw. Zitieren
DBO Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Damit man dir am besten Helfen kann soltest du folgendes schicken: Den Aufruf deiner funktion von der mainfunktion(mit Context) Den Prototyp deiner funktion Deine Ausgeschriebenefunktion(ist ja schon da)! So wie sich das anhört hast du einen flaschen Variablentyp in der mainfunktion welcher das Ergebnis der Funktion auffängt(Hast du vielleicht vergessen in der Mainfunktion den Typ der Empfangsvarialbe von char auf char* umzustellen) Genaueres kann ich dir aber erst sagen wenn du das obengennatne schickst Gruß Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 na gut: #include <iostream> #include <conio.h> #include <string.h> #include <fstream> using namespace std; void druckzeile(int zeile, char string[]) { if (zeile < 10 && zeile > 0) cout << "Zeile " << " " << zeile << string << endl; if (zeile < 100 && zeile > 10) cout << "Zeile " << " " << zeile << " >" << string << endl; if (zeile > 100) cout << "Zeile "<< zeile << " >" << string << endl; } char* delblanks(char array[]) { int j = -1; char mod_array[1000]; //zählt die blanks und slash's bis zum ersten vernünftigen zeichen do { j++; } while (array[j] == ' ' || array [j] == '/'); int n = 0; int a = j; //löscht die zeichen bis stelle j for (int y=1; y <= j; y++) { mod_array[n] = array[a]; a++; n++; } mod_array[n] = '\0'; return mod_array; } //++++++++++++++++++++++++ MAIN ++++++++++++++++++++++++++++++++++++++ int main(int argc, char *argv[]) { bool flag = false; char p[1000]; //Für die Prozeduren char suchstring[]="CALL"; char suchstring2[]="DO"; //Für die Batch-Jobs char suchstring3[]="ENTER"; char suchstring4[]=" E "; //was wir nicht haben wollen char filter[]="W-T"; // die zähler int result = 0; int result2 = 0; int result3 = 0; int result4 = 0; int line=1; //jetzt geht's los for (int i=1;i<argc; i++) { ifstream inFILE; inFILE.open(argv[i]); cout << "************** " << argv[i] << " **************" << endl << endl; while(!inFILE.eof()) { inFILE.getline(p,1000); if(flag) { ------<!>-----p = delblanks(*p); druckzeile(line,p); } flag = false; //Kommentarzeilen werden gekillt if (p[1] == '"') p[0] = '\0'; //Zeilen mit Ausgaben werden gekillt if (strstr(p, filter)) p[0]= '\0'; if (strstr(p, suchstring)) { flag = true; ------<!>-----p = delblanks(*p); druckzeile(line, p); result++; } if (strstr(p, suchstring2)) { flag = true; ------<!>-----p = delblanks(*p); druckzeile(line, p); result2++; } if (strstr(p, suchstring3)) { flag = true; ------<!>-----p = delblanks(*p); druckzeile(line,p); result3++; } if (strstr(p, suchstring4)) { flag = true; ------<!>-----p = delblanks(*p); druckzeile(line, p); result4++; } line++; } cout << "----------------------------------------------------------" << endl; cout << suchstring << " wurde "<< result <<" * gefunden" << endl; cout << suchstring2 << " wurde "<< result2 <<" * gefunden"<< endl; cout << suchstring3 << " wurde "<< result3 <<" * gefunden"<< endl; cout << suchstring4 << " wurde "<< result4 <<" * gefunden" << endl; cout << "----------------------------------------------------------" << endl << endl << endl << endl; inFILE.close(); } getch(); return 0; } :mad: :mad: :mad: :mad: :mad: <FONT COLOR="#a62a2a" SIZE="1">[ 24. Oktober 2001 13:28: Beitrag 2 mal editiert, zuletzt von volkaman ]</font> Zitieren
DBO Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Zu den warning: Das liegt daran das dein Array char mod_array[1000]; innerhalb deiner Funktion definiert wurde und damit das array nur innerhalb der Funktion gültig ist! Müsste aber normalerweise nichts ausmachen! Zu den 2 Fehlern: Es wäre sehr hilfreich wenn du deinen Beitrag nochmal dahingehend editieren würdest, das du die Zeilen in denen die Fehler auftreten markieren würdest! Thx! Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 hab' mit ------<!>----- markiert.... Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Lies nochmal die neueren threads, da war der Zusammenhang char - char[] - char* dargestellt. char p[23] -> Typ von p ist p* !!! -> Aufruf also auch p = delblank(p); !!! änder deine Funktion so: char* mod_array; if( (mod_array = new char[1000]) == 0) return 0; Und nicht zuletzt: Vergiß nicht, das ursprüngliche p freizugeben ! Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Oder, einfacher: ermittel in delblank den offset/index des ersten gültigen Zeichens. Dann kopier die Zeichen innerhalb des char-Arrays um offset - wenn dieser >0 ist - nach vorne, inklusive Terminator. So mußt du nicht neue arrays allozieren etc. Dann legst du einmal dein char[] im prg auf dem Stack an, von wo es automatisch wieder abgeräumt wird, das spart viel Kummer <FONT COLOR="#a62a2a" SIZE="1">[ 24. Oktober 2001 13:35: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font> Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 Sorry bin ziemlicher Newbie... if( (mod_array = new char[1000]) == 0) return 0; Wozu brauche ich das? <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR> Und nicht zuletzt: Vergiß nicht, das ursprüngliche p freizugeben ! ________________________________ Dann legst du einmal dein char[] im prg auf dem Stack an, von wo es automatisch wieder abgeräumt wird, das spart viel Kummer Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 char* dync = new char[123]; // tuwas... delete [] dync; 2. In deinem Fall viel einfacher: nehmen wir an, du willst alle führenden 'x' entfernen: aus "xxxtralala" wird "tralala" -> der index von 't', also dem ersten Zeichen das ich will ist 3. also: int ziel = 0; int quelle = index; // vorher ermitteln if(quelle > ziel) // sonst unnötig while(array[ziel++] = array[quelle++]); Oja, blutigstes C, aber kurz, und kopiert den Terminator gerade noch mit <FONT COLOR="#a62a2a" SIZE="1">[ 24. Oktober 2001 15:02: Beitrag 2 mal editiert, zuletzt von captain haddock ]</font> Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 Also mein Aufruf sieht jetzt so aus: p = delblanks(p); Die Funktion: char *delblanks(char array[]) { int j = -1; //zählt die blanks und slash's bis zum ersten vernünftigen zeichen do { j++; } while (array[j] == ' ' || array [j] == '/'); int index = j; int ziel = 0; int quelle = index; // vorher ermitteln if(quelle > ziel) // sonst unnötig /*Zeigeroperation ungueltig---->*/while(*array[ziel++] = *array[quelle++]); return *array; } Kompiliert aber leider immer noch nicht siehe Fehlermeldung :confused: Was hab' ich wieder falsch gemacht? Zitieren
haddock Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Du nix- ich war's, sorry, es muß heißen: while(array[ziel++] = array[quelle++]); Natürlich dereferenziert der [] Operator schon, ich editiers auch noch im Beispiel :eek: Zitieren
bozoo Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 Merci! Klappt jetzt wunderbar... Zitieren
haddock Geschrieben 25. Oktober 2001 Geschrieben 25. Oktober 2001 Super, hoffe du weißt auch in etwa wie/warum Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.