Warum bei cast Fehler?



  • Hallo,
    warum stürtzt mein Programm bei folgender Zeile ab?

    #define CHIFFRE 1
    
    void DecryptVariable(char *str,int len) {
    	int ansii,i;
    
    	for(i=0; i<len; i++) {
    		ansii = str[i]; //asciiiwert des zeichen
    		ansii = ansii - CHIFFRE; //verschiebung
    		str[i] = (char)ansii; //das i zeichen des strings ersetzten
    	}
    

    Leider stürtzt das Programm direkt bei erst Aufruf der Funktion ab und zwar bei dieser Zeile:

    str[i] = (char)ansii;
    

    Die Funktion wird wie folgt aufgerufen:

    char crypt[] = "Text";
    int len;
    
    len = strlen(crypt);
    
    DecryptVariable(crypt,len)
    

    Ich komm echt nicht drauf warum das Programm abstürtzt.
    Kann vielleicht mal jemand über den Codeabschnitt gucken und mir sagen warum das nicht so klappt wie ich will?
    Bin für jede Hilfe dankbar.



  • Was für ein Fehler kommt denn? Und bist du sicher, daß du nicht versehentlich ein String-Literal in die Funktion gegeben hast?

    (so, wie du es geschrieben hast, sollte es eigentlich funktionieren)



  • Ich kann ebenfalls keinen Fehler entdecken. Du kannst die Funktion jedoch etwas typsicherer machen und dir den cast sparen.

    char* decrypt(
        __inout char*  s,
        __in    size_t len
    )
    {
        size_t i = 0;
        for (; i < len, s[i]; ++i)
            s[i] = s[i] - 1;
        return s;
    }
    

    Ich weiß nicht direkt, wofür du das brauchst. Was hier aber sehr problematisch ist, ist die Tatsache, dass du den string terminieren wirst, wenn s[i] == 1 ist.



  • FrEEzE2046 schrieb:

    char* decrypt(
        __inout char*  s,
        __in    size_t len
    )
    ...
    

    Sind __inout und __in Makros? Wenn ja: wärst du so freundlich, sie zu expandieren, damit ich's auch versuchen kann? Wenn nicht: wärst du freundlich, uns zu erklären, was das heissen soll?



  • mngbd schrieb:

    Sind __inout und __in Makros?

    Das sind lediglich leere Defines, die dir beim Lesen der Funktionssignatur helfen zu verstehen, wie die Funktion mit ihren Argumenten umgeht; es handelt sich also um logische Input Modifier.

    Hier bringe ich einfach zum Ausdruck, dass "s" sowohl gelesen als auch beschrieben wird, und "len" nur gelesen wird. Mehr Sinn machen tut das natürlich z.B. bei "__out_opt", für optionale Out-Parameter.

    Die MSVC-Header definieren diese Makros immer. Man muss das nicht mögen, ich tue es jedoch, da es an der ein oder anderen Stelle zum besseren Verständnis beiträgt.



  • @FrEEzE2046:
    Zusätzlich werden die auch für Static-Code-Analysis verwendet, wenn man mit dem /analyze Switch compiliert.

    http://msdn.microsoft.com/en-us/library/ms235402.aspx
    http://msdn.microsoft.com/en-us/library/ms173498.aspx

    Der Compiler der mit dem Studio mitkommt verweigert das zwar wenn man nicht die Enterprise Version hat. Die Platform SDK Versionen des Compilers können es aber (zumindest einige Versionen konnten es, hab es schon länger nicht mehr probiert) - und die kann man genau so gut auch mit Visual-Studio verwenden.



  • @hustbaer

    Nun, ich verwende das nicht und kann daher nicht viel qualifiziertes dazu sagen. Meines Wissens nach (und so entnehme ich es auch der von dir verlinkten Seite) sind das wiederum andere Defines, als die die ich hier verwende.



  • Ok also scheint wirklich an der oben genannten Zeile zu liegen.
    Das Programm stürtzt immer ab mit "Crypt.exe funktioniert nicht mehr..".
    Die folgende Meldung habe ich im Debugger erhalten:

    0xC0000005: Access Violation.

    Habe jetzt den Code schon mehrmals überprüft und er stürtzt immer da ab.



  • Kannst du lesen?
    Hast du den Ratschlag aus der 1. Antwort befolgt?
    Gebe den kompletten Code an und nicht nur die deiner Meinung nach relevanten Teile, sonst wird das hier nie was mit dir.


Anmelden zum Antworten