Verbuggter VC++ 6.0 Compiler



  • dEUs schrieb:

    lol.
    Das hat nix mit nem verbuggten Kompiler zu tun ...

    Tip:
    Guck dir mal die Abbruchbedingung deiner for-schleife an ...
    Und auch dein GetBuffer ...

    BTW: Zu jedem GetBuffer gehört auch ein ReleaseBuffer!

    hmm, also die abbruch bedingung ist schon in Ordnung. Bei den kleinen Zahlenketten klappt das ja. Bloß wenn ich dann die "Große" Prüfzahl berechnen will (so um die 20 ziffern) tritt der oben genannte fehler auf. Jede zahl wird berechnet. stelle 0, stelle 1 wird komischerweise ausgelassen, dann gehts mit 2,3,4... usw ohne probleme weiter.

    Wie war das mit dem release Buffer? Ich dachte Get Buffer ist dazu da, um einen in einem CString enthalten string, char kompatibel zu machen 😕
    Kann ja sein das es daran liegt.



  • 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