Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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.

:(

Geschrieben

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.

Geschrieben

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.

Geschrieben

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ß

Geschrieben

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>

Geschrieben

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!

Geschrieben

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 !

Geschrieben

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>

Geschrieben

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

Geschrieben


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>

Geschrieben

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?

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