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.

READ Fehler

Empfohlene Antworten

Veröffentlicht

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.

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.

:(

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.

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

SUPAAA!!!

@Käptn: Was meinst Du mit delete/free ???

Gruss Volkaman

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.

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ß

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>

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!

hab' mit ------<!>----- markiert....

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 !

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>

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


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 :D

<FONT COLOR="#a62a2a" SIZE="1">[ 24. Oktober 2001 15:02: Beitrag 2 mal editiert, zuletzt von captain haddock ]</font>

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?

:o

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:

Merci!

Klappt jetzt wunderbar...

Super, hoffe du weißt auch in etwa wie/warum ;)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

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.