Problem mit CodeGuard!!!



  • Hi Leute,

    ich habe mal angefangen mit dem Debuggen. Hmm naja

    CodeGuard gibt mir ein Fehler aus

    Ein falsches Datei-Handle (0xEA) wurde an die Funktion übergeben.
      0x00456820 Aufruf von fgetc(0x32DC1A2C)
    

    Das Programm läuft trotzdem.

    Er bleibt an der Stelle stehen

    datei.getline(D, 255);
    

    Der vollständige Code ist

    void __fastcall TMainForm::LoadConfig(TObject *Sender)
    {
      TStringList *worte = new TStringList();
      TStringList *worte2 = new TStringList();
    
      AnsiString sFile2 = GetRegistryValue("MainPath") + "\\Maschine.ini";
    
      ifstream f(sFile2.c_str(),ios::binary);
      if (f) {
    	char D[256];
    
    	while (f.getline(D,255)) { // <-- Da kommt die Fehler Meldung
    	  if (AnsiPos(worte->Strings[3], D) != 0) {
    		worte2->Clear();
    		split(wort2,D,'=');
    		sMachine = worte2->Strings[1];
    	  }
    	}
    
    	if (!f.eof()) {
    	  MessageDlg("Fehler beim Lesen der 'Maschine.ini' Datei!",mtError,TMsgDlgButtons() << mbOK,0);
    	  Close();
    	}
      } else {
    	if (FileExists(sFile2))
    	  MessageDlg("Fehler beim Öffnen der 'Maschine.ini' Datei!",mtError,TMsgDlgButtons() << mbOK,0);
    	else
    	  MessageDlg("'Maschinen.ini' Datei nicht vorhanden!",mtError,TMsgDlgButtons() << mbOK,0);
    
    	Close();
      }
    
      f.close();
    

    Ich weiss nicht warum.
    Die Version von CodeGuard ist 5.1.3



  • Rave173 schrieb:

    Der vollständige Code ist

    ...
    

    Ich weiss nicht warum.
    Die Version von CodeGuard ist 5.1.3

    Hi,

    ich seh da jetzt auch keinen Fehler. Aber mir ist schon ab und an mal aufgefallen, daß CodeGuard Fehler meldet wo keine sind.

    mfg Martin



  • Was soll der Code überhaupt machen? Wofür sind die beiden StringList-Variablen?
    Du greifst z.B. mit

    if (AnsiPos(worte->Strings[3], D) != 0)
    

    auf nicht-allokierten Speicher zu (denn die Liste ist ja leer).

    Und fehlt bei

    split(wort2,D,'=');
    

    ein 'e' (worte2)?



  • Hi,

    die Sachen habe ich versehen hier gelöscht

    AnsiString sFile = ExpandFileName(ParFileName);
    
      TStringList *worte = new TStringList();
      TStringList *worte2 = new TStringList();
    
      split(worte,sFile,'\\');
    
    ...
    

    Die Sachen mit worte/worte2 sind nicht leer

    @mgaeckler

    Das habe ich mir schon fast gedacht, weil ich auch kein Fehler finde 😞
    Kann man da irgend was machen ?



  • habe was vergessen zu schreiben
    Die Fehler Meldung ist in #include <fstream>

    ...
    
    		// TEMPLATE FUNCTION _Fgetc
    template<class _Elem> inline
    	bool _Fgetc(_Elem& _Ch, _Filet *_File)
    	{	// get an element from a C stream
    	return (fread(&_Ch, sizeof (_Elem), 1, _File) == 1);
    	}
    
    template<> inline bool _Fgetc(char& _Byte, _Filet *_File)
    	{	// get a char element from a C stream
    	int _Meta;
    	if ((_Meta = fgetc(_File)) == EOF) <--- Hier kommt der erste Fehler
    		return (false);
    	else
    		{	// got one, convert to char
    		_Byte = (char)_Meta;
    		return (true);
    		}
    	}
    ...
    

    Der Fehler wird dadurch ausgelöst

    datei.getline(D, 255);
    

Anmelden zum Antworten