Verbuggter VC++ 6.0 Compiler



  • Ne daran liegts nicht. aber nachdem du diesen charbuffer nicht mehr brauchst musst du ihn freigeben.



  • Ne daran liegts nicht. aber nachdem du diesen charbuffer nicht mehr brauchst musst du ihn freigeben.



  • was, wenn ich es nicht tue? Verschwende ich dann nur 3kb Arbeitsspeicher, oder wirkt sich das auf das ganze programm aus?



  • Wenn du die Variable danach nciht mehr benutzt, passiert glaub nix, aber wenn du sie wieder benutzt, könnte es sein, dass was passiert, weiss grad nimmer, was das war 😉



  • nee, also ich denke das ist es nicht. Habe jetzt den Release Buffer angewandt, gab aber keine besserung. Was mich so verwundert ist, dass zeichen [1] immer als 0 also als "" string gewertet wird. Ich verstehe einfach nicht warum. Das ist auch nur bei einer Großen zeichenfolge der fall. Was könnte das sein 😕 😕 😕



  • Es wäre wahrscheinlich ganz gut, wenn du mal ein konkretes, nicht funktionierendes Codebeispiel zeigen könntest. Bei mir klappt das alles prima.
    Wo nimmst du eigentlich IntToStr her?



  • also, ich hätte den switch so gemacht:

    iGesamt += iCode * ((iStelle%2) ? 1 : 3);
    


  • MFK schrieb:

    Es wäre wahrscheinlich ganz gut, wenn du mal ein konkretes, nicht funktionierendes Codebeispiel zeigen könntest.

    Kannst du haben:

    {
    	CString strChecksum="123456789012345678901234";
    
    	char* cChecksum = strChecksum.GetBuffer(24);
    	int iChecksum=0;
    	int iGesamt=0;
    	for(int iStelle=0;iStelle <24;iStelle++)
    	{
    		strChecksum = cChecksum[iStelle];
    		iChecksum = StrToInt(strChecksum);
    		switch (iStelle)
    		{
    		case 0: iGesamt += iChecksum * 3; break;
    		case 1: iGesamt += iChecksum * 1; break;	
    		case 2: iGesamt += iChecksum * 3; break;
    		case 3: iGesamt += iChecksum * 1; break;
    		case 4: iGesamt += iChecksum * 3; break;
    		case 5: iGesamt += iChecksum * 1; break;
    		case 6: iGesamt += iChecksum * 3; break;
    		case 7: iGesamt += iChecksum * 1; break;
    		case 8: iGesamt += iChecksum * 3; break;
    		case 9: iGesamt += iChecksum * 1; break;
    		case 10: iGesamt += iChecksum * 3; break;
    		case 11: iGesamt += iChecksum * 1; break;
    		case 12: iGesamt += iChecksum * 3; break;
    		case 13: iGesamt += iChecksum * 1; break;
    		case 14: iGesamt += iChecksum * 3; break;
    		case 15: iGesamt += iChecksum * 1; break;
    		case 16: iGesamt += iChecksum * 3; break;
    		case 17: iGesamt += iChecksum * 1; break;
    		case 18: iGesamt += iChecksum * 3; break;
    		case 19: iGesamt += iChecksum * 1; break;
    		case 20: iGesamt += iChecksum * 3; break;
    		case 21: iGesamt += iChecksum * 1; break;
    		case 22: iGesamt += iChecksum * 3; break;
    		case 23: iGesamt += iChecksum * 1; break;
    		}
    	}
    		strChecksum=cChecksum;
    		return strChecksum+=IntToStr(iGesamt%10);
    		strChecksum.ReleaseBuffer();
    }
    

    Wo nimmst du eigentlich IntToStr her?

    IntToStr ist eine von mir selbst geschriebene und includierte Funktion, die eine Integer Zahl in einen CString umwandelt.



  • ähh, int2string isse nicht notwending, da die klasse CString bereits eine Methode namens Format für solch sachen zur verfügung stellt.

    @bbb - Sehr gute lösung, mit dem kann man das ganze switch einsparen !!!!



  • Hinweis:

    Das return erfolgt VOR dem Release von deinem CString-Object !



  • Huhu !

    Boah ey, was ist wenn Du ne 100-Stellige Zahl prüfen willst ?
    Oder wenn Du die Anzahl der Stellen vorher gar nicht kennst ?

    Hier ein Vorschlag:

    CString strZahl = "3456789012098";
    int iSumme=0;

    for(int i = 0; i < strZahl.GetLength(); i++)
    {
    // wenn der Index einer Zahl gerade ist, also durch 2 ohne Rest teilbar,
    // dann wird diese Zahl mit 3 multipliziert, sonst mit 1
    if( i % 2 == 0 ) iSumme += (strZahl.GetAt(i) - '0') * 3 ;
    // Multiplikation mit 1 kann man sich natürlich schenken
    else iSumme += (strZahl.GetAt(i) - '0');
    }

    // Berechnung der Prüfziffer
    int iPruefZiffer;

    int iRest = iSumme % 10;
    if( iRest == 0) iPruefZiffer = 0;
    else iPruefZiffer = 10 - iRest;

    // Ausgabe zur Kontrolle
    CString strMsg;
    strMsg.Format("Prüfziffer: %i", iPruefZiffer);
    AfxMessageBox(strMsg);

    Gruß, Joe



  • {
    	CString strChecksum="123456789012345678901234";
    
    	char* cChecksum = strChecksum.GetBuffer(24);
    	int iChecksum=0;
    	int iGesamt=0;
    	for(int iStelle=0;iStelle <24;iStelle++)
    	{
    		strChecksum = cChecksum[iStelle]; // hier ist das Problem
    

    An der kommentierten Stelle weist du strChecksum neu zu. Das ist dieselbe CString-Instanz, deren Inhalt du oben mit GetBuffer geholt hast. Die Folge ist, dass sich der Inhalt von cChecksum ändert.

    Dein erstes Beispiel hatte dieses Problem nicht - da waren es zwei CStrings: Code und strCode.

    Also: Nicht immer gleich auf den Compiler schimpfen. 😉



  • Ahh danke, hattest recht!
    Wollte ne variable sparen :p
    Nu funktionierts endlich! 🙂 🙂 🙂


Anmelden zum Antworten