Fehler im Code



  • Hallo zusammen,

    ich hab merkwürdige Abstürze in meinem Programm und mittlerweile bin ich mir sicher, dass es an folgender Funktion liegt. Es wäre cool wenn ihr mal drüberschauen könntet, ignoriert einfach den ganzen Com-Spezifischen-Kram.

    Das Programm (ein Thread) stürzt an den merkwürdigsten Stellen ab und die STL gibt mir immer Meldungen wie "__OK() corrupted" usw. Kommentiere ich diese Funktion aus, so scheint alles zu gehen. Als ob irgendwo unbeabsichtigt auf Speicher zugegriffen.

    COMSTAT     ComStat;
    		DWORD       dwErrorFlags;
    		DWORD       cnt;
    		DWORD       dwEvtMask; 
    		DWORD       dwError;
    		std::string	tmp; 
    
    		dwError = WaitForSingleObject(os.hEvent,10);
    		if((dwError&WAIT_OBJECT_0) != WAIT_OBJECT_0) 
    		{
    								return 1; 
    		}
    
    		WaitCommEvent(hCom,&dwEvtMask,&os);
    		if((dwEvtMask&EV_RXFLAG) != EV_RXFLAG)
    		{
    												return 1; 
    		}
    
    		ClearCommError(hCom,&dwErrorFlags,&ComStat);
    		cnt = min(10000,ComStat.cbInQue); 
    		if(!cnt)
    		{
    									return 2; 
    		}
    
    		if(!ReadFile(hCom,buff,cnt,&cnt,&os))
    		{									return 3; 
    		}
    
    		if(!cnt)
    		{
    						return 4; 
    		}
    
    		char  ch;
    		char* src;			
    		char* dst;			
    		char  erg[100];		
    
    		src = buff;
    		while(src<buff+cnt)
    		{
    			dst=erg;
    			while(dst<erg+99 && src<buff+cnt)
    			{
    				ch = *src++;
    				if(ch)
    				{
    					*dst++=ch;
    					if(ch==0x0a) 
    						break;
    				}
    			}
    			*dst=0;
    
    			msglist.push_back(erg); 
    		}
    


  • neeeeeeerv schrieb:

    Das Programm (ein Thread) stürzt an den merkwürdigsten Stellen ab und die STL gibt mir immer Meldungen wie "__OK() corrupted" usw.

    Ein Thread? Oder in mehrere Threads aufgeteilt? Wenn ja - welche Daten werden denn von mehreren Thread benutzt?

    neeeeeeerv schrieb:

    Kommentiere ich diese Funktion aus, so scheint alles zu gehen. Als ob irgendwo unbeabsichtigt auf Speicher zugegriffen.

    Ist bei threaded Programmen kein Anhaltspunkt... Kann auch sein, dass er dann nur eher mit einem Thread fertig ist und deshalb nicht gleichzeitig in nem anderen Thread die map (oder ne andere stl-klasse) manipuliert und dann merkt, dass die struktur dieser kaputt ist...

    ...
    

    na dann gib uns doch wenigstens mal den funktionsrumpf mit... hättest dir ja auch wenigstens mal die mühe machen können, die 2 tabs vorn wegzumachen...

    COMSTAT     ComStat;
    DWORD       dwErrorFlags;
    DWORD       cnt;
    DWORD       dwEvtMask; 
    DWORD       dwError;
    std::string	tmp;
    

    Es ist in C++ nicht üblich, zu erst alle Variablen zu deklarieren...

    dwError = WaitForSingleObject(os.hEvent,10);
    		if((dwError&WAIT_OBJECT_0) != WAIT_OBJECT_0) 
    		{
    								return 1; 
    		}
    

    =>

    const DWORD waiting = WaitForSingleObject (os.hEvent, 10); //warum ausgerechnet 10?
    if (waiting == TIMED_OUT) //kA mehr, wie das makro war...
    	return 1;
    

    etc - wenn du deinen(?) quellcode verstehst, dann kannst du es ja mal ein wenig sinnvoll strukturieren und uns vll auch noch nen paar kommentare hinterlassen...

    bb



  • Es lag tatsächlich an

    dwError = WaitForSingleObject(os.hEvent,10); 
            if((dwError&WAIT_OBJECT_0) != WAIT_OBJECT_0) 
            { 
                                    return 1; 
            }
    

    Ich weiß nicht wie ich dir danken kann...der fehler hat mich wahnsinnig gemacht, das programm istdann irgendwo abgestürzt, wo man nichts deuten konnte.

    Und ja, der code istnicht von mir



  • Glaub ich noch nicht so recht, dass es daran lag...
    Du solltest dir aber mal die Zeit nehmen und den Quellcode in C++ ändern und vor allem versuchen zu verstehen... Gebilde á la a&b != c finde ich in diesem Zusammenhang auch einfach mal doof... Wieso auch, wenn ein a == d das gleiche tut? Naja... Kannst dich ja wieder melden, wenn der Fehler wieder auftritt - und das wird er...


Anmelden zum Antworten