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.
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.
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
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.
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.
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.
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Auch für ein leeres Stringliteral wird ein abschließendes Nullbyte erstellt.
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]
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.
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.
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?
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.
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?
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden