Fehler im Code Checksum



  • Hallo,
    ich bin gerade dabei im meinem Praktikum ein C-Programm zu schreiben. Ich verwende Visual C++ 6.0.
    Ich habe nun in das Programm in der Klasse CTestDlg eine Funktion Namens int Checksum (char File[255]) hinzugefügt. Diese Funktion habe ich von meinem Betreuer bekommen und soll verwendet werden, um die Checksumme einer Binärdatei zu berechnen. Der Dateiname inklusive Pfad wird als Parameter (File[255]) der Funktion übergeben.

    Mein Problem ist jetzt, das beim Funktionsaufruf sich das Programm aufhängt bzw. folgenden Fehler bringt:
    Thread 0x3B8 wurde mit Code 0 (0x0) beendet.
    Thread 0xE28 wurde mit Code 0 (0x0) beendet.

    Das einzige das ich an dem Code geändert habe ist folgendes:
    ulFileSize = GetFileSize(hFile); IN ulFileSize = GetFileSize(hFile, NULL); WEIL ich eine Fehlermedlung bekommen habe.

    Zusätzlich bekomm ich eine Fehlermeldung wenn ich folgendes in der Funktion stehen habe:
    MessageBox("Quelldatei kann nicht geöffnet werden!", "Fehler", MB_OK);

    Fehermeldung:
    error C2660: 'MessageBoxA' : Funktion akzeptiert keine 3 Parameter

    Wenn ich allerdings nur einen oder zwei Parameter verwende, kommt dieselbe Fehlermeldung mit der entsprechenden Parameterzahl.

    Kann mir jemand bei meinem Problem helfen?

    Hier noch der Code:

    int Checksum(char szFile[255])
    {
    	int		iRetVal;	// return value (checksum)
    	unsigned short  *pBuffer,	// pointer to buffer
                           	Byte1,		// hex numbers
                            Byte2;
    	unsigned int    uiLoop;		// loop counter
    	FILE            *hFile;		// file handle
    	unsigned short  buffer[500000]; // buffer for file contents
    	long		lArrayAdr;
    	unsigned long   ulFileSize;	// size of source file
    
    	// initialize buffer
    	memset(buffer, 0, 256);
    
       	// open file read-only and binary
       	if((hFile = fopen(szFile,"rb")) == NULL)
       	{
       		MessageBox("Quelldatei kann nicht geöffnet werden!", "Fehler", MB_OK);
          		iRetVal = -1;
       	}
       	else
       	{
       		// get file size
          		ulFileSize = GetFileSize(hFile, NULL);
          		// read 16-bit values into array
    	      	fread(buffer, sizeof(short), ulFileSize, hFile);
          		// swap bytes and add them
          		for(uiLoop = 0; uiLoop <= (ulFileSize>>1); uiLoop++)
          		{
          			Byte1 = buffer[uiLoop] & 0x00ff;
             		Byte2 = buffer[uiLoop] & 0xff00;
    		        Byte2 >>= 8;
             		buffer[uiLoop] = Byte2 + (Byte1 * 0x0100);
          		}
    
          		// set pointer to address of first element in array
          		pBuffer = &buffer[0];
          		lArrayAdr = (long)pBuffer;
    
          		iRetVal = CalcCRC(pBuffer, ulFileSize, lArrayAdr);	
    
          		fclose(hFile);
       }
       return iRetVal;
    }
    

    Gruß Zizou

    Mod-Edit: Ich war mal so frei, deinen Quelltext vernünftig zu formatieren. mfG CStoll



  • Verwende Code Tags.
    MessageBox braucht 4 Parameter, guck das in der MSDN nach.



  • Um MessageBox() in dieser Funktion zu verwenden, musst du entweder die gesamte Funktion als Member deiner CTestDlg Klasse deklarieren oder du übergibst der MessageBox auch einfach so das Handle.



  • Sorry,
    aber ich bin Anfänger.
    Was sind Code Tags bzw. wie würden die mir helfen?

    Gruß Zizou



  • Code Tags sorgen dafür, dass dein Code hier im Forum zumindest ordentlich dargestellt wird.



  • Hallo,
    alles klar. Werd nächstes mal Code Tags verwenden.

    Kann mir jemand bei meinem eigentlichen Problem helfen, warum die Funktion nicht funktioniert?

    Gruß Zizou



  • Also dann zitiere ich mich mal selbst:

    dfgidga schrieb:

    Um MessageBox() in dieser Funktion zu verwenden, musst du entweder die gesamte Funktion als Member deiner CTestDlg Klasse deklarieren oder du übergibst der MessageBox auch einfach so das Handle.



  • Hallo,
    dann zitier ich mich halt auch mal selbst:

    Zizou schrieb:

    Mein Problem ist jetzt, das beim Funktionsaufruf sich das Programm aufhängt bzw. folgenden Fehler bringt:
    Thread 0x3B8 wurde mit Code 0 (0x0) beendet.
    Thread 0xE28 wurde mit Code 0 (0x0) beendet.

    Das einzige das ich an dem Code geändert habe ist folgendes:
    ulFileSize = GetFileSize(hFile); IN ulFileSize = GetFileSize(hFile, NULL); WEIL ich eine Fehlermedlung bekommen habe.

    Kann das an der Methode GetFileSize liegen?

    Gruß Zizou



  • Nein, es liegt nicht an deiner Änderung, es liegt vermutlich daran dass du den Code aus einer Klasse rauskopiert hast die von CWnd abgeleitet ist.

    Lies es bitte einfach in der MSDN nach.
    Falls du Visual Studio verwendest drück einfach mal F1, falls du nen anderen Compiler verwendest: http://msdn.microsoft.com/



  • Es könnte auch problematisch sein, daß ein FILE* etwas anderes ist als ein HANDLE 😉 (GetFileSize() erwartet letzteres).

    PS: Was die Mitteilungen "Thread xyz wurde beendet" mit deinem Problem zu tun haben, bin ich leider überfragt - vermutlich gar nichts.



  • Hallo,

    bin immer noch an meinem Problem mit der Dateigröße.
    unsigned long ulFileSize = GetFileSize(hFile, NULL);

    Hab herausgefunden bzw. bemerkt, dass hier immer der gleiche Wert übergeben wird: 4294967295

    Dadurch das der Wert so groß ist, hängt sich das Programm auf.

    Aber warum bekomme ich da einen falschen Wert? (meine Dateien sind max. 6KB groß)

    Es kann nur noch an diesem Befehl liegen, denn mit einem konstanten Wert funktioniert das Programm.

    Gruß Zizou



  • Ja, es liegt an diesem Befehl - genauer gesagt daran, daß du ihm die falschen Parameter übergibst. GetFileSize() erwartet ein Datei-Handle (das bekommst du z.B. von CreateFile()), keinen FILE*. (und wenn ich raten müsste, würde ich sagen, daß GetLastError() sowas wie "Invalid Handle" ausspucken dürfte)



  • Bau mit fseek und ftell ein "kompatibles" GetFileSize.
    🙂


Anmelden zum Antworten