Fehler in einfacher Funktion....



  • Hallo,
    in einer ganz einfachen Überprüfungsfunktion bekomme ich beim Return einen Fehler.
    Schaut euch doch mal bitte diese Fkt an:

    UINT CDateneingabe::ChkEingabeInt(UINT wert, UINT maxWert, UINT minWert)
    {
    	if ( wert  > maxWert )
    	{
    		TRACE ("Eingabewert zu groß!!");
    
    		wert = maxWert;
    
    		char  message[]	=	MAXIMUM_SET;
    
    		//*********************************************************
    		//sprintf(message, "%s Maximum = %i", message , maxWert);
    		//*********************************************************
    
    		AfxMessageBox(message);
    
    	}
    	else if ( wert < minWert )
    	{
    		TRACE ("Eingabewert zu klein!!");
    
    		wert = minWert;
    
    		char message[] = MINIMUM_SET;
    		//*********************************************************
    		//sprintf(message, "%s Min. value = %i", message, minWert);
    		//*********************************************************
    
    		AfxMessageBox(message);
    	}
    
    	return wert;
    }
    

    Der dazugehörige Aufruf sieht wie folgt aus:

    m_nPrescaler	=	m_pChkDateneingabe->ChkEingabeInt(m_nPrescaler, MAX_PRESCALER, MIN_PRESCALER);
    

    So wie die Funktion oben abgedruckt ist (mit auskommentiertem sprintf) funktioniert einwandfrei.

    Modifiziere ich die message noch mit -sprintf- wird diese auch korrekt in der Box angezeigt und auch die Returnvariable (wert) hat den richtigen Wert...allerdings bekomme ich dann eine Fehlermeldung:
    -Unbehandelte Ausnahme: ....0x00000005 Access Violation-

    Warum?
    mit sprintf verändere ich ja nicht den Rückgabewert oder sonst etwas. 😕

    Danke für die Hilfe.

    Gruss
    S.



  • Nimm bitte mal einen CString statt des char[], ich vermute, du hast da einen Zeigerfehler.

    CString  message    =    MAXIMUM_SET;
            message.Format("%s Maximum = %i", message , maxWert);
            AfxMessageBox(message);
    

    🙂



  • Hallo,
    bei CString.Format darf der aufrufende CString nicht als Parameter vorkommen.
    Aber so funktionierts:

    CString  message, tmpMessage;
    		tmpMessage	=    MAXIMUM_SET;
            message.Format("%s Maximum = %i", tmpMessage, maxWert);
    		 AfxMessageBox(message);
    

    Danke für den Tipp....!

    Allerdings habe ich jetzt noch immer nicht verstanden warum es sprintf() nicht klappt?!? 😕

    Gruss
    S.



  • Hmm, dann hättest du eben

    CString  message;
            message.Format("%s Maximum = %i", MAXIMUM_SET, maxWert);
            AfxMessageBox(message);
    

    gemacht. Sorry, da hatte ich nicht aufgepasst. 🙄

    Aaaalso, nehmen wir mal an, MAXIMUM_SET ist "MAXIMUM_SET" auch als Inhalt.
    Demnach stehen hinter message dann 12 Byte reservierter Speicher, als letztes eine 0.
    Nun schreibst du was dahinter (und über die abschließende 0) und das gibt Speicherfehler, weil du dich in Speichergebieten rumgetrieben hast, die dich (salopp gesagt) nix angehen. 🙂

    CString verhindert solche Fehler. 🙂



  • so funktionierts.
    Deine Erklärung klingt logisch....
    wir schreiben 15:32 Uhr und ich habe wieder mal was dazu gelernt! 👍

    Danke und bis zum nächsten Problem 😃

    Gruss
    S.


Anmelden zum Antworten