Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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.

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

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.

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.

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.

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]

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.

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.

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?

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.

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?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.