LLpresident Geschrieben 26. November 2002 Geschrieben 26. November 2002 heir ist mein quelltext: char Zeichen; char Fehler_code[] = "\t1\t"; char Zeile[] = ""; char Zeichenkette[4] = ""; char Abfrage; char Tabulator[] = "\t"; char EndOfLine[] = "\n"; bool Zeilenende = false; int Fehler = 0; int Tab = 0; int test = 0; long int i = 0; void __fastcall TfrmMain::FormCreate(TObject *Sender) { ifstream application("application.txt", ios::in); while(!application.eof()) { application.get(Zeichen); Zeile = Zeichen; Zeichenkette[0] = Zeile[i-2]; Zeichenkette[1] = Zeile[i-1]; Zeichenkette[2] = Zeile; if(Zeichen == *Tabulator && i != 0) { Tab++; } if(Zeichen == *EndOfLine) { Tab = 0; test++; } if((strcmp(Zeichenkette,Fehler_code) == 0) && (Tab == 3)) { Fehler++; } i++; } } wenn ich das programm starte in dem der quelltext vorkommt kommt eine fehlermeldung mit diesem inhalt: Im Projekt proLogAuswertre.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei adresse 40003c4c. Lesen von Adresse 322f3031'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. Zitieren
gugelhupf Geschrieben 26. November 2002 Geschrieben 26. November 2002 Originally posted by LLpresident heir ist mein quelltext: char Zeile[] = ""; Zeile = Zeichen; [\B][\QUOTE] Zeile ist ein leeres Feld. Dann willst Du über einen Iterator darauf zugreifen, was nicht möglich ist. Zitieren
Guybrush Threepwood Geschrieben 26. November 2002 Geschrieben 26. November 2002 ***edit** verdammt zu langsam getippt:D Hi, du schreibst Zeile = Zeichen, ohne der Variablen Zeile speicher dafür reserviert zu haben, denn Zeile[] kannst du nur verwenden wenn du direkt danach = "Irgendwas" schreibst, weil dann automatisch der benötigte Platz mit reserviert wird. Wenn du nur char Zeile[]; schreibst, weiß ich nicht genau was er macht, ob er zufällig viel Speicher reserviert oder nur ein char. Auf jeden Fall nichts richtiges. Am besten weißt du Zeile direkt eine gewisse anzahl an Stellen zu oder du legst einen Zeiger an und initialisierst ihn im Programm mit new. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Originally posted by LLpresident char Zeile[] = "";Das reserviert Dir genau ein Byte, und zwar Zeile[0]. char Tabulator[] = "\t";Ist kein Fehler, aber char Tabulator = '\t'; wäre besser, denn dann sparst Du dir auch die Dereferenzierung. Zeile = Zeichen; Zeichenkette[0] = Zeile[i-2]; Zeichenkette[1] = Zeile[i-1]; Zeichenkette[2] = Zeile;Du schreibst und liest hier in Speicher herum, den Du nicht reserviert hast. Nur Zeile[0] ist erlaubt (siehe oben). Mit hoher Wahrscheinlichkeit überschreibst Du andere Variablen. Zitieren
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Wenigstens sind wir uns einig Zitieren
LLpresident Geschrieben 26. November 2002 Autor Geschrieben 26. November 2002 problem ist das ich die grösse von zeile nicht genne. ich hab eine txt-datei und will in dieser nach Fehler_Code suchen. beim finden soll halt Fehler um 1 erhöt werden um rauszufinden wie viele fehler ich in der txt-datei gefunden hab. wie kann ich die grösse von Zeile rausfinden? dann könnt ichs in eine for-schleiffe schreiben. Zitieren
gugelhupf Geschrieben 26. November 2002 Geschrieben 26. November 2002 Originally posted by Klotzkopp Das reserviert Dir genau ein Byte, und zwar Zeile[0]. Hmmm...wo könnte man das erkennen ?! Ich hätte jetzt spontan geglaubt, dass überhaupt nichts reserviert wird. Hab auch noch net im Compilat geschaut...wär aber interessant´, ob es dfür ne ISO gibt dass ein Pointer auf eine leere Zeichenkette einen gültigen Wert besitzt. Zitieren
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Auch für ein leeres Stringliteral wird ein abschließendes Nullbyte erstellt. Zitieren
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Originally posted by LLpresident problem ist das ich die grösse von zeile nicht genne.Die brauchst Du auch nicht. Vorschlag: char Zeichen; char Fehler_code[] = "\t1\t"; char Zeile[4]; char Tabulator = '\t'; char EndOfLine = '\n'; int Fehler = 0; int Tab = 0; int test = 0; long int i = 0; void __fastcall TfrmMain::FormCreate(TObject *Sender) { memset( Zeile, 0, 4 ); ifstream application("application.txt", ios::in); while(!application.eof()) { application.get(Zeichen); Zeile[0] = Zeile[1]: Zeile[1] = Zeile[2]; Zeile[2] = Zeichen; if(Zeichen == Tabulator && i != 0) { ++Tab; } if(Zeichen == EndOfLine) { Tab = 0; ++test; } if((strcmp(Zeile,Fehler_code) == 0) && (Tab == 3)) { ++Fehler; } ++i; } } [/CODE] Zitieren
LLpresident Geschrieben 27. November 2002 Autor Geschrieben 27. November 2002 thx klotzkopp. genau so wie dus gesagt hast hats funktioniert. wozu dient das memset? und wie sieht die sache mit dem 'i' aus. das wird doch teoretich nicht mehr benötigt oder? kann man doch auch rauslassen. Zitieren
Klotzkopp Geschrieben 27. November 2002 Geschrieben 27. November 2002 Originally posted by LLpresident wozu dient das memset?Das dient dazu, die vier Bytes des Arrays Zeile mit 0 zu initialisieren. Es enspricht dem hier:Zeile[0] = Zeile[1] = Zeile[2] = Zeile[3] = 0; und wie sieht die sache mit dem 'i' aus. das wird doch teoretich nicht mehr benötigt oder? kann man doch auch rauslassen. Ja, das kann jetzt weg. Hatte ich übersehen. Zitieren
LLpresident Geschrieben 27. November 2002 Autor Geschrieben 27. November 2002 cool. thx. mit anderen worden bei memset gibst du erst die variable, dann den wert der initialiesirung und dann die anzahl der zu initaliesierenden byts ein. richtig? Zitieren
Klotzkopp Geschrieben 27. November 2002 Geschrieben 27. November 2002 Originally posted by LLpresident mit anderen worden bei memset gibst du erst die variable, dann den wert der initialiesirung und dann die anzahl der zu initaliesierenden byts ein. richtig? Nicht ganz. Der erste Parameter ist die Adresse der Variablen. Bei einem Array muss da nur deshalb kein Adressoperator (&) hin, weil der Arrayname ohne Indexklammern der Adresse des ersten Elements entspricht. Zitieren
LLpresident Geschrieben 27. November 2002 Autor Geschrieben 27. November 2002 ach so.wieder was dazu gelernt. thx dann wird bei: if((strcmp(Zeile,Fehler_code) == 0) && (Tab == 3)) { ++Fehler; } also auch die adresse und nicht der variablenname benutzt. richtig? 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.