Programm stürt beim Schliessen einer Else Abfrage ab



  • moin

    bin grad etwas am verzweifeln ...
    ich hab nen programm das beim schliessen einer else-abfrage abstürzt...

    if(cmd.CompareNoCase("WOLKE_I2")==0){
    		int len=0;
    		CString cmd="";
    		CString cmd_return="";
    		CString cmd_return_soll="";
    		CString cmd_return_soll2="";
    		CString var="";
    		int stelle=0;
    		int stelle_wert=0;
    
    		if(anz_param==1){
    			cmd_return_soll=param[0];
    		}	
    		if(anz_param==2){
    			cmd_return_soll=param[0];
    			cmd_return_soll2=param[1];
    		}	
    		if(anz_param==3){
    			var=param[0];
    			stelle=atoi(param[1]);
    			stelle_wert=atoi(param[2]);
    		}
    		cmd="I2";
    
    		CString cmd_erg;
    		cmd_erg=cmd+""+ConvertStringHexToChar("04");
    		len=cmd.GetLength()+2;
    		char * buf = new char[len];
    		memcpy(buf,cmd_erg, len);
    
    		ret=SendBlock(s, buf,len);
    
    		char *recvbuffer=NULL;
    		recvbuffer = new char[1024];
    		rc=recv(s,recvbuffer,1024,0);
    		if(rc==SOCKET_ERROR) {
    			CString str;
    			str.Format("%d",WSAGetLastError());
    			ausg.Format("(WOLKE_I2)-%s %s",txt->ausgabe53, str);
    			SetAnzeigeText(ausg,0);
    			SetErrorText(ausg);
    			delete[] recvbuffer;
    			delete[] buf;
    		}else{
    			recvbuffer[rc]='\0';
    			CString tmp="", tmp2="";
    
    			for(int xx=1; xx<rc; xx++){
    				tmp.Format("%x", recvbuffer[xx]);
    				if(tmp.GetLength()<2){
    					tmp="0"+tmp;
    				}
    				if(tmp.GetLength()>2){
    					CString tmp3="";
    					for(int iy=tmp.GetLength()-2; iy<tmp.GetLength(); iy++){
    						tmp3=tmp3+tmp.GetAt(iy);
    					}
    					tmp=tmp3;
    				}
    				if(xx<(rc-1)){
    					tmp=tmp+" ";
    				}
    				tmp2=tmp2+tmp;
    			}
    			delete[] recvbuffer;
    			delete[] buf;
    
    			if(anz_param==1){
    				if(tmp2.CompareNoCase(cmd_return_soll)==0){
    					ret=TRUE;
    				}else{
    					ret=FALSE;
    				}
    			}
    			if(anz_param==2){
    				if(tmp2.CompareNoCase(cmd_return_soll)==0 || tmp2.CompareNoCase(cmd_return_soll2)==0){
    				}else{
    					ret=FALSE;
    				}
    			}
    
    			ret=FALSE;
    			if(anz_param==3){
    				if(var.CompareNoCase("BIN")==0){
    
    SetAnzeigeText(tmp2,0);
    
    					//char erg=ConvertStringHexToChar(tmp2);
    					char erg_1=ConvertStringHexToChar("04");
    
    					int verg=0;
    					verg=erg_1&(int)pow((double)2,(double)stelle);
    
    CString ausg_tmp;
    ausg_tmp.Format("%i %i %c", verg, stelle, erg_1);
    SetAnzeigeText(ausg_tmp,0);
    
    					if(verg>=0){
    SetAnzeigeText("1",0);
    						if(verg==0){
    SetAnzeigeText("2",0);						
    							if(stelle_wert==0){
    SetAnzeigeText("3",0);						
    								ret=TRUE;
    SetAnzeigeText("3_1",0);						
    							}else{
    SetAnzeigeText("4",0);						
    								/*CString meldung;
    								meldung.Format("Fehler: %s",tmp2);
    								AfxMessageBox(meldung);*/
    								ret=FALSE;
    							}
    						}else{
    SetAnzeigeText("5",0);						
    							if(stelle_wert==0){
    SetAnzeigeText("6",0);						
    								/*CString meldung;
    								meldung.Format("Fehler: %s",tmp2);
    								AfxMessageBox(meldung);*/
    								ret=FALSE;
    							}else{
    SetAnzeigeText("7",0);						
    								ret=TRUE;
    							}
    						}
    					}else{
    SetAnzeigeText("8",0);
    						ret=FALSE;
    					}
    SetAnzeigeText("9",0);
    				}
    SetAnzeigeText("10",0);
    			}
    SetAnzeigeText("11",0);
    		}
    SetAnzeigeText("12",0);
    	}
    

    zur kurzen erklärung:
    SetAnzeigeText = ausgaben in nem extra fenster...
    ausgegeben wird:
    1
    2
    3
    3_1
    9
    10
    11
    <-- dann kommt der absturz...
    und das is eben genau das was ich net versteh...
    zwischen 11 und 12 schliess ich nur den else zweig den ich mit

    if(rc==SOCKET_ERROR) {
    			CString str;
    			str.Format("%d",WSAGetLastError());
    			ausg.Format("(WOLKE_I2)-%s %s",txt->ausgabe53, str);
    			SetAnzeigeText(ausg,0);
    			SetErrorText(ausg);
    			delete[] recvbuffer;
    			delete[] buf;
    		}else{
    

    aufmache ... wie kann mein programm da abstürzen???
    wenn ich das debugge (das debuggen is mir leider unter visual studio 8.0 nen arges rätsel daher mein ich den debuggknopf bei der windwos meldung kommt als meldung das der absturz bei nem unzulässigen schreibzugriff passiert is )
    nur da schreib ich doch gar nix ...

    also mir echt nen arges rätsel
    ich würde mich über ansatzpunkte freuen (bitte net so einfache wie kontrollier mal die auf und zu klammern ... sowas is natürlich alles schon gecheckt)

    vielen dank für eure hilfe
    LT



  • 1. Das ist kein C, sondern C++. Wahrscheinlich sogar noch besser bei MFC aufgehoben.
    2. Was funktioniert beim Debugger nicht?
    3. Nimm statt char*, lieber vector<char> für deine Buffer. Und greife dann zumindest beim Debuggen über at() auf die Elemente zu.



  • LordTerra schrieb:

    if(rc == SOCKET_ERROR)
    {
                ...
                delete[] recvbuffer;
                delete[] buf;
    }
    else{
    ...
    }
    delete[] recvbuffer;
    delete[] buf;
    

    Falls rc == SOCKET_ERROR ist, dann löscht du den buffer 2 mal -> fehler!
    Setze noch delete[] recvbuffer; und delete[]buf in else{}

    Kann dir aber nicht sagen ob das die lösung zu deinem Problem ist !!!

    Gruss Sheldor



  • Das Problem lässt sich ganz elegant umgehen, wenn man ungültige Zeiger NULL setzt und vor der Dereferenzierung prüft. Noch eleganter wäre in dem Buffer-Fall aber die Variante mit dem vector.
    Und am Elegantesten wäre es gleich mit smart-pointern zu arbeiten. 😉
    Falls du das vor hast mal zu probieren, nimm den shared_ptr.



  • Nick Unbekannt schrieb:

    1. Das ist kein C, sondern C++. Wahrscheinlich sogar noch besser bei MFC aufgehoben.
    2. Was funktioniert beim Debugger nicht?
    3. Nimm statt char*, lieber vector<char> für deine Buffer. Und greife dann zumindest beim Debuggen über at() auf die Elemente zu.

    1.) hmmm jo kann sein
    2.) ganz ehrlich: keine ahnung der funktioniert nicht ...
    wenn ich auf debuffen klicke bekomm ich fehlermeldung:

    Für "AVS2FW.exe" können keine Debuginformationen gefunden werden oder sie stimmen nicht überein. Die Binärdaten wurden nicht mit Debuginformationen erstellt.

    Möchten sie den Debugvorgang fortsetzen?

    Wenn ich da dann auf ja klicke beendet er mir das Programm und wenn ich auf nein klicke auch ... von daher keinen plan wie ich das beheben soll ...

    3.) kannste mir das kurz zeigen ?

    Anderes: habe festgestellt: wenn ich alle SetAnzeigeText auskomentiere bis auf
    SetAnzeigeText(tmp2,0);
    und dann
    char erg_1=ConvertStringHexToChar(tmp2);
    mache dann geht es ... wenn ich SetAnzeigeText(tmp2,0); weg lasse stürzt er ab
    liegt das vielleicht an der funktion?

    char ConvertStringHexToChar(LPCTSTR Data)
    {
          char Number;
          _stscanf(Data,"%x",&Number);
          return Number;
    }
    


  • Für "AVS2FW.exe" können keine Debuginformationen gefunden werden oder sie stimmen nicht überein. Die Binärdaten wurden nicht mit Debuginformationen erstellt.

    Dann compilier das Programm doch mit Debuginformationen.
    Schalt mal von Release auf Debug.



  • DirkB schrieb:

    Für "AVS2FW.exe" können keine Debuginformationen gefunden werden oder sie stimmen nicht überein. Die Binärdaten wurden nicht mit Debuginformationen erstellt.

    Dann compilier das Programm doch mit Debuginformationen.
    Schalt mal von Release auf Debug.

    doofe frage: aber wie mach ich das in visual studio c++ 8.0
    also ich kann hier nur zwischen den konfigurationen hin udn her schalten und da gibts nur fwrelease und demo, was in dem fall nur zur folge hat das in demo die kamera geschichten aussen vor gelassen werden

    aber wo stell ich auf debug?



  • 3.) kannste mir das kurz zeigen ?

    #include <vector>
    
    std::vector<char> buffer(1024);    // 1024 Elemente
    buffer.resize(1200);               // Größe ändern auf 1200, Inhalt bleibt gültig
    for (int i = 0; i < buffer.size(); i++)  // jedes Element ansprechen
    {
        buffer.at(i);    // oder Alternativ => buffer[i];
    }
    

    Der Vorteil von at() ist, dass das Programm es merkt, wenn du einen ungültigen Index hast.

    Die Adresse des Elementes kannst du dir mit dem Adressoperator holen:

    &buffer[0]   // also so wie beim Feld auch
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply