Was ist falsch bei dieser eigenen Funktion?

mamarulez

Mitglied
C++ Was ist falsch bei dieser eigenen Funktion?

Erstmal Sorry wegen dem langen Betreff.

So, jetzt aber zur Sache:

Ich habe eine Funktion selbstgeschrieben, die in einer Konsolenanwendung Animationen möglicht macht - und zwar im "TXT"-Format.

Folgend ist die Funktion aufgebaut:

Code:
void LoadAnimation (char Name[40], int Frames);

Mit Name ist der Name der Animation und mit Frames die Anzahl an Frames bezeichnet.

Hier die Beschreibung und die Definition der Funktion:

Code:
void LoadAnimation (char Name[40], int Frames)
{
	FILE	*CurrentFile;
	char	*CurrentFilename[40];
	int		ActualFrame;


	
	for (ActualFrame = 0; ActualFrame < Frames; ActualFrame++)
	{
		strcat(Name, (const char *)ActualFrame);
		strcat(Name, ".txt");

		if ((CurrentFile = fopen(Name, "rb")) == NULL)
		{
			ClearScreen ();
			cout	<<"********************************\n";
			cout	<<"ERROR: Bad Animation ("<<Name<<")\n";
			cout	<<"********************************\n";
			break;
		}

		while (!feof (CurrentFile))
			putchar (fgetc (CurrentFile));

		fclose (CurrentFile);
	}
}

Also, es soll für jeden Frame eine Datei mit folgendem Namen geöffnet und angezeigt werden: "[Animationsname][Frame].TXT" - also rufe ich die Funktion in meiner Win Main Funktion folgendermaßen auf:

Code:
LoadAnimation ("TestAnimation", 5);

Und habe selbstverständlich auch im Ordner der erstellten ".EXE"-Datei die Dateien: "TestAnimation0.TXT" bis "TestAnimation4.TXT" erstellt.

Aber wenn ich die Funktion aufrufe, dann bricht der Explorer mit dem "Programm reagiert nicht!"-Fehler von WIndows XP ab.

Was ist falsch?

Schonmal ein großes "Danke!" im Vorraus!
 
Zuletzt bearbeitet:
Hier ist die aktuelle Version der Funktion die ich grade geupdatet habe - diesmal kommentiert:

Code:
void LoadAnimation (char Name[40], int Frames)
{
	FILE		*CurrentFile;
	int			ActualFrame;
	
	
	for (ActualFrame = 0; ActualFrame <= Frames; ActualFrame++)			// In every frame...
	{	
		char		CurrentFilename[40];								// Define CurrentFilename new

		(char *)CurrentFilename = strcat((char *)Name, (const char *)ActualFrame);		// Add the frame number to the animation name
		strcat((char *)CurrentFilename, ".txt");						// And add the extension to the frame number and the animation name

		if ((CurrentFile = fopen((const char *)CurrentFilename, "rb")) == NULL)	// open the CurrentFilename
		{
			ClearScreen ();
			cout	<<"********************************\n";
			cout	<<"ERROR: Bad Animation ("<<Name<<")\n";
			cout	<<"********************************\n";
			break;
		}

		while (!feof (CurrentFile))
			putchar (fgetc (CurrentFile));

		fclose (CurrentFile);
	}
}

Jetzt gibt es einen "Linker Operand muss ein L-Wert sein"-Compiler Fehler in der Zeile "// Add the frame number to the animation name"!

Was ist jetzt falsch?
 
Bei strcat wird dem ersten Argument die Zeichen des zweiten Argumentes angehängt. Zudem wird das erste Argument wieder zurückgegeben.

Daher liefert strcat den Zeiger auf das fertig editierte erste Element.
Natürlich kannst Du einem vordefinierten Array keinen neuen Zeiger zuweisen, dafür müsstest Du schon einen richtigen Zeiger nehmen.

In Deinem Beispiel aber kannst Du das auch so machen, dann bleibt Name auch Name und wird nicht verändert:
Code:
		char		CurrentFilename[40];
		strcpy(CurrentFilename,Name);

		strcat(CurrentFilename, (const char *)ActualFrame);
		strcat(CurrentFilename, ".txt");
 
Sorry, gibt zwar keine errors aber das programm stürzt einfach so an der Stelle mit LoadAnimation ab!

Hier nochmal die komplette Funktion:

Code:
void LoadAnimation (char Name[40], int Frames)
{
	FILE		*CurrentFile;						// TODO: Fix the whole function
	int			ActualFrame;
	
	
	for (ActualFrame = 0; ActualFrame <= Frames; ActualFrame++)			// In every frame...
	{	
		char		CurrentFilename[40];
		strcpy(CurrentFilename,Name);

		strcat(CurrentFilename, (const char *)ActualFrame);
		strcat(CurrentFilename, ".txt");


		if ((CurrentFile = fopen((const char *)CurrentFilename, "rb")) == NULL)	// open the CurrentFilename
		{
			ClearScreen ();
			cout	<<"********************************\n";
			cout	<<"ERROR: Bad Animation ("<<Name<<")\n";
			cout	<<"********************************\n";
			break;
		}

		while (!feof (CurrentFile))
			putchar (fgetc (CurrentFile));

		fclose (CurrentFile);
	}
}

Trotzdem ein Dankeschön wegen der Hilfe.

Also jetzt bin ich am Ende mit meinem Latein sozusagen...
 
actual frame darf natürlich kein integer sein.
Dann würdest Du mit dem Wert von der Variablen die Speicheradresse an genau dieser Position anspringen...das wollen wir doch nicht ;)

itoa kann integer in chars umwandeln!
 
Ich habe die Funktion jetzt so eingebaut:

Code:
void LoadAnimation (char Name[40], int Frames)
{
	FILE		*CurrentFile;						// TODO: Fix the whole function
	char		*ActualFrameChar;
	int			ActualFrame;
	
	
	for (ActualFrame = 0; ActualFrame <= Frames; ActualFrame++)			// In every frame...
	{	
		char		CurrentFilename[40];
		strcpy(CurrentFilename,Name);
		itoa(ActualFrame, ActualFrameChar, 0);
		strcat(CurrentFilename, (const char *)ActualFrame);
		strcat(CurrentFilename, ".txt");


		if ((CurrentFile = fopen((const char *)CurrentFilename, "rb")) == NULL)	// open the CurrentFilename
		{
			ClearScreen ();
			cout	<<"********************************\n";
			cout	<<"ERROR: Bad Animation ("<<Name<<")\n";
			cout	<<"********************************\n";
			break;
		}

		while (!feof (CurrentFile))
			putchar (fgetc (CurrentFile));

		fclose (CurrentFile);
	}
}

Stürzt aber immer noch ab!

Und mit dem "(const char *)" Vorsatz aus der vorherigen Version wird der Datentyp doch auch schon zu const char *, oder?
 
Zurück