Zum Inhalt springen

BCB5: Was stimmt nicht an diesem Programm?


LLpresident

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

***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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...