char* eine 0 zuweisen? - unter WinCE



  • Hallo ...

    ich habe ein kleines Problem mit char* und der Zahl 0.
    Ich möchte die Zahl 0 einem char* zuweisen.
    Der Code läuft auch unter einer normalen Windows-Umgebung,
    aber nicht unter WinCE.
    Ich kann so jede andere Zahl zuweisen, nur nicht die 0. Warum?

    Hier mein Code-Stück um das es geht:

    unsigned char* mData = new unsigned char[1024];
    unsigned short us = 0;
    usigned char temp = (unsigned char) us; // im debugger zeigt er in temp immer 0" statt 0 an
    mData[0] = temp;

    Danke...



  • Willst Du eine Zahl in einen String umwandlen, oder was hast Du vor?



  • Im Prinzip ja...

    Und zwar möche ich z.B. eine short-Zahl (16 Bit) auf char's abbilden...
    insgesamt dann halt 2 chars.

    unsigned char* mData = new unsigned char[1024]; 
    short value = 2;
    
    short temp1 = ((value & 0xFF00) >>  8);    // oberen 8 bits 
    mData[0] = (unsigned char) temp1;
    
    short temp2 = (value& 0x00FF));	      // unteren 8 bits
    mData[1] = (unsigned char) temp2;
    

    Funktioieren tut der Code bestens, wenn ich einen größere Zahl
    als die Zahl 2 wie hier in dem Beispiel nehme. Die 2 belegt
    ja bekanntlich nur die unteren 8 Bits. D.h. das die oberen 8 Bits
    (als short) 0 sind. Diese 0 soll halt jetzt im Array an erster Stelle
    stehen.
    Unter wince will aber der cast nicht klappen mit der 0.

    Wenn ich dann mal als Bsp. die Zahl 4711 (also auch die oberen Bits
    mit benutze), klappt alles...



  • Ist es eigentlich Absicht, daß du beide Hälften des short-Wertes in das selbe Element deines char-Arrays kopierst? Oder ist das ein Tippfehler?

    (PS: CPP-Tags sind durchaus nützlich für die Übersicht ;))



  • Nee, keine Absicht... habe hoffentlich jetzt alle Tippfehler behoben...
    danke ... 😉



  • Dann solltest du noch dazusagen, wie sich dieses "klappt nicht" in der Praxis äußert.

    (das einzige "Problem" könnte sein, daß du auf dieses Gebilde mit Stringfunktionen anrennen willst - die interpretieren eine '\0' (=0) als Stringende)



  • Um Zahlen in Strings zu konvertieren benutze lieber sprintf() oder itoa() denn der Compiler denkt bei 0 , dass der Zeiger ungültig gemacht werden soll.



  • qasdfgh schrieb:

    Um Zahlen in Strings zu konvertieren benutze lieber sprintf() oder itoa() denn der Compiler denkt bei 0 , dass der Zeiger ungültig gemacht werden soll.

    Hi .. danke, genau das wird wohl das Problem sein! Denke auch mal, dass der Zeiger damit ungültig wird.

    Ich fülle dieses char-array aus einem ziemlich komplexen algorithmus heraus. Ich muss immer schrittweise die zeichen einfügen. D.h. bei der Zahl 2 und 16 Bit muss erst die 0 für die oberen Bits und dann die 2 für die unteren Bits eingefügt werden. Den Algorithmus kann ich nicht mehr ändern. Das muss jetzt so ablaufen. (Der tiefere sinn sei diskussionswürdig 🙂 !)
    Momentan iteriere ich halt immer mit dem zeiger einen schritt weiter im array.

    unsigned char* mData = new unsigned char[1024];
    int mDataIndex = 0;
    
    void addValue(unsigned char value) {
         mData[mDataIndex++] = value;
    }
    

    Wie kann ich das denn jetzt mit einem sprintf umsetzen...?

    Ich bin gerade so wirr, wäre nett wenn mir da nochmal jmd. helfen könnte...



  • Naja sprintf() und itoa() sind nur für Strings und nicht einzelne Zeichen gedacht...
    Also kannst du mit deiner früheren fortfahren und dabei prüfst du, ob die Zahl 0 ist.
    Wenn ja, dann soll mData[i] das Zeichen '0' bekommen.

    Etwa so:

    mData = temp ? ((unsigned char) temp) : ('0');
    


  • qasdfgh schrieb:

    Etwa so:

    mData = temp ? ((unsigned char) temp) : ('0');
    

    Danke ... warum in die Ferne schweifen ... 🙂
    Manchmal steht man echt auf dem Schlauch .. 🙂

    Funzt bestens ...



  • qasdfgh schrieb:

    Naja sprintf() und itoa() sind nur für Strings und nicht einzelne Zeichen gedacht...
    Also kannst du mit deiner früheren fortfahren und dabei prüfst du, ob die Zahl 0 ist.
    Wenn ja, dann soll mData[i] das Zeichen '0' bekommen.

    Etwa so:

    mData = temp ? ((unsigned char) temp) : ('0');
    

    Ist auch nicht gerade eine optimale Lösung - damit kannst du später nicht mehr zwischen 0 und 48 (='0') unterscheiden.

    @Marcus: Wenn du deine Zahlen wirklich binär speichern willst, lass die Finger von den Stringverarbeitungsfunktionen der C-Bibliothek und merk' dir gesondert die Länge des Arrays.


Log in to reply