Char - Zeiger subtrahieren



  • Hallo Community,

    gegeben:
    int len;
    char *p1, *p2
    ...
    len = (int) (p2 - p1); // Fehler*

    Fehler:
    mit gcc 4.1.2 : invalid operands to binary -
    vc2005 : kein Fehler

    len = (int)p2 - (int)p1; // Fehler*
    mit gcc 4.1.2 : kein Fehler
    vc2005 : Warnung, Zeigerverkürzung von 'char *' zu 'int'

    ( 32bit: char* ist doch 4 byte breit :S, was wird hier verkürzt ? )

    Wie kann ich das Problem lösen, ohne bedingte Kompilierung ?
    Wie sieht das bei 64 bit aus ? Das sollte so nicht funktionieren,
    wenn 64bit zeiger 64Bit breit sind die in ein 'int' quetschen zu
    wollen. ok ich könnte auch gleich in __int64 konvertieren oder ?
    Aber das löst mein obiges Problem auch nicht 😞

    Vielen Dank für Hilfestellungen.



  • ^^nimm für 'len' ptrdiff_t und dann sollte es gehen.
    🙂



  • danke Dir 🙂

    nebenher habe ich auch noch weiter gesucht und auch was gefunden 🤡

    /Wp64 ist eingeschaltet, was die Warnung hervorbringt

    len = (__int64)p1 - (__int64)p2 ; // keine Warnung.

    ptrdiff_t probiere ich auch gleich mal aus, wenn ich die Definition
    dafür gefunden habe, was sich dahinter verbirgt.

    Edit:
    hm
    obiges Bsp, geht nur bei MSC. Der gcc kennt __int64 nicht, ich nehme
    daher (long long). Ergebnis: warning: cast from pointer to integer of different size

    irgendwie auch klar. Der gcc kennt zwar ptrdiff_t, liefert aber dennoch
    obige Fehlermeldung bei len = p1-p2; // error: invalid operands to binary -

    Edit:
    gelöst:
    hatte übersehen, unsigned char* p1 und char* p2, nun beide vom gleichen
    Typ macht der gcc auch kein Ärger mehr 🤡



  • RED-BARON schrieb:

    Der gcc kennt zwar ptrdiff_t, liefert aber dennoch
    obige Fehlermeldung bei len = p1-p2; // error: invalid operands to binary -

    ptrdiff_t sollten die meisten compiler kennen. ach, so: ptrdiff_t len = (ptrdiff_t)p1 - (ptrdiff_t)p2;
    🙂


Anmelden zum Antworten