IntToHex() Fehlerhaft bei BCB? Hilfe!



  • folgendes funzt:

    byte die = char('§');
    ShowMessage(IntToHex(die,2));
    


  • promicha schrieb:

    .
            .
            char* die = new char[1];
            die = "§"; 
            .
            .
            die = 0;
            delete die;
            .
            .
    

    ????????????????????????
    Wer macht denn sowas ???????????????

    1. Speichr reservieren
    2. Zeiger kaputt machen ???????????? (durch zuweisen einer Adresse
    3. KAPUTTEN Zeiger für delete nehmen ???

    PS: Auf welche RAM- Adresse zeigt Variable 'die' nach

    die="§";

    Das solltest Du mal klären!!!(Nachlesen der Grundlagen!!!)



  • promicha schrieb:

    Woran kann das liegen???

    Zwei Anmerkungen dazu:

    1. Es liegt an der Umwandlung von char auf int.
    Wenn man mal spaßeshalber den Code folgendermaßen abändert

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            char die = '§';
            int iDie = die;
            ShowMessage(IntToHex(iDie,2));
    }
    

    und mal debuggt, kann man sehen, daß iDie den Wert -89 anstatt 169 hat.
    Das liegt daran, daß char vorzeichenlos ist und bei der Umwandlung das
    höchste Bit als Vorzeichen interpretiert wird.

    2. Man bekommt mit dem ursprünglichen Code einen Speicherleck, da "die"
    per delete freigegeben wird, nachdem es zuvor auf 0 gesetzt wurde.

    Gruß,

    Alexander



  • Und so wäre es richtig (wenn auch überumständlich), und liefert das was du erwartest:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            unsigned char* die = new unsigned char[2]; 
            strcpy(die, "§");  
            ShowMessage(IntToHex(die[0],2)); 
            delete[] die; //editiert
    }
    


  • Alexander Kempf schrieb:

    promicha schrieb:

    Woran kann das liegen???

    [...]kann man sehen, daß iDie den Wert -89 anstatt 169 hat.
    Das liegt daran, daß char vorzeichenlos ist

    ...äh, falsch.

    Alexander Kempf schrieb:

    und bei der Umwandlung das
    höchste Bit als Vorzeichen interpretiert wird.

    Das wiederum ist richtig.

    äh geo... an deiner angeblich richtigen lösung... fehlt da nicht ne Kleinigkeit in der delete-zeile?

    -junix



  • junix schrieb:

    Alexander Kempf schrieb:

    [...]
    Das liegt daran, daß char vorzeichenlos ist

    ...äh, falsch.

    Tja, stimmt. Es gibt auch signed char.
    Wenn man den Ausdruck im Debugger untersucht, zeigt er halt 169 an,
    was die Interpretation nahe legt, daß char unsigned ist (oder zumindest
    hier so interpretiert wird).
    Mag sein, daß ich da was falsch verstehe. Wenn's mir jemand erklären
    könnte, wäre ich aber dankbar.

    Gruß,

    Alexander



  • Leider interpretiert der Debugger bzw. das WatchWindow auch nur die Daten so wie du ihm sagst, solle er sie interpretieren. Siehe dazu auch die BCB Hilfe zum Thema "char":

    By default, signed char is assumed

    -junix



  • junix schrieb:

    Leider interpretiert der Debugger bzw. das WatchWindow auch nur die Daten so wie du ihm sagst, solle er sie interpretieren. Siehe dazu auch die BCB Hilfe zum Thema "char":

    By default, signed char is assumed

    -junix

    Darauf hätte ich ja eigentlich auch selbst kommen können. 🙂

    Danke,

    Alexander



  • Hi Leute,

    so mal abgesehen von dem kaputten Zeiger, war natürlich nicht richtig 👎
    lag darann das ich mir nen Code-Schnippel kopiert habe, von jemanden der
    mal einen HEX-Editor schrieb, beim Löschen einiger zeilen und umschreiben
    lies ich das umüberlegt so stehen.

    Wie auch immer, also das mit dem Vorzeichen ist mir schon klar, aber
    warum nur bei diesem Zeichen und vieleicht ein paar andere, merkwürdig ist
    doch das andere Zeichen Funktionieren die auch höher als 127 liegen?

    Ich prüfe gleich noch mal einige Zeichen, die gestern gingen ob die wirklich
    drüber liegen, aber ich meine schon.

    Das Beispiel von Geo ist wohl am besten mit strcpy()

    unsigned char* die = new unsigned char[2];  
    strcpy(die, "§");   
    ShowMessage(IntToHex(die[0],2));  
    delete[] die;
    

    Nun gut, ich will ja kein Hex-Editor, sondern ich will nur einige Zeichen, welche nicht in eine URL dürfen als HEX wandeln, wie es der Browser macht,
    da genügt mir strcpy() variante.

    bis denne



  • Hi,
    oder einfach so ...

    char die = '§';
    String hex = IntToHex((unsigned char)die, 2);
    

    ... unabhängig von irgend welchem Zeiger-Gewurschtel. Das lenkt nur ab.


Anmelden zum Antworten