Zeichenkeete casten



  • ...was ist jetzt nochmal das problem? 😉

    MSVC warnt da nichts:

    if (l=='BLA!')
    

    was nicht unbedingt heisst, dass es da nichts zu warnen gaebe...



  • Ganz einfach: der korrekt arbeitende Vergleich

    long l;
    ...
    if (l=='BLA!')
    

    liefert eine Warnung, die an sich nur unschön, funktional aber kein Problem ist. Meine Frage war, durch welchen Cast ich die wegbekomme, sprich ich muss dem Compiler beibringen dass er 'BLA!' in sein ASCII-Zahlenäquivalent umwandelt bzw. es als solches ansieht.

    if (l==(long)'BLA!')
    

    funktioniert nicht.



  • Ach ja, die Warnung kommt nur beim GCC, BCB und MSVC++ übergehe ndie Stelle schweigend.



  • gcc macht's richtig.
    die warnung bedeutet 'du wolltest doch bestimmt ein char-array haben, oder?'
    damit das warning verschwindet, musste den code umschreiben:

    long l = *(long*)"123";
    

    das ist wenigstens einigermassen portabel, ein 'l = 'BLA' dagegen nicht...



  • Danke net, das sieht gut aus, ich werde es mal probieren.

    Ich dachte ja schon, auf den "schneller als Zeichenweise geht es nicht"-Schwachsinn kommt gar nichts mehr (hallo? seit wann ist ein 32-Bit-Vergleich langsamer als ein Zeichen-für-Zeichen-Gemurkse?).



  • Benutzer schrieb:

    Danke net, das sieht gut aus, ich werde es mal probieren.

    ...aber beachte dass auf 'ner little-endian pc-kiste '1234' nicht (long)"1234", sondern alles rückwärts ist 😉



  • Auf C-Ebene sind "XYZW" und longs eben grundverschiedene Dinge,
    die nicht direkt vergleichbat sind.

    Du mußt schon bitweise mit maskieren und shiften arbeiten, um einen
    String mit einem long zu vergleichen.



  • Benutzer schrieb:

    Es funktioniert korrekt weil der in "l" eingelesene Wert eigentlich eine lesbare Zeichenkette ist, nur wie muss ich den String 'BLA!" korrekt casten damit diese Meldung nicht mehr kommt UND ich die Zeichenkette trotzdem noch leserlich im code stehen habe?

    Erstmal solltest du Typ int verwenden, denn diesem entspricht eine solche "multi-character constant". Abschalten kannst du diese Warnung beim GCC mit -Wno-multichar.
    Trotzdem, du solltest beachten, dass solche Konstanten implementationsspezifisch sind, und dadurch Probleme entstehen können, zB weil ein int nicht gross genug ist, oder die Vorzeichen von char und int unterschiedlich sind. Little- und big-endian kann ebenfalls zum Problem werden.



  • Zorg-- schrieb:

    wenn man plattformübergreifend einen 32-Bit-Datentyp haben möchte nimmt man eben long oder unsigned long, die sind überall 32 Bit.

    mindestens, ne?
    wenn'se zu gross sind kann's aber auch zu komischen bugs führen.
    besser man nimmt selbstgemachte typen. etwa so:

    #ifdef PROCESSOR_A
    typedef unsigned short UINT16;
    #elif PROCESSOR_B
    typedef unsigned int UINT16;
    ...
    

    das kennt ihr bestimmt...



  • strcmp ist doch bei den meisten libraries schon auf diese weise optimiert.


Anmelden zum Antworten