[gelöst] Problem mit long long bei 32bit

  • ich hab hier im pvr350-Plugin eine Stelle

    Code
    osdbuf_aligned = (unsigned char *)((int)osdbuffer + (PAGE_SIZE - 1)); 
    osdbuf_aligned = (unsigned char *)((int)osdbuf_aligned & PAGE_MASK);


    die, wenn man für 64bit kompiliert, so aussehen muss:

    Code
    osdbuf_aligned = (unsigned char *)((long long)osdbuffer + (PAGE_SIZE - 1)); 
    osdbuf_aligned = (unsigned char *)((long long)osdbuf_aligned & PAGE_MASK);


    leider kompiliert es so dann nicht mehr mit allen gcc-Versionen unter 32-bit.


    Mir würde jetzt nichts besseres einfallen, als bei Bedarf (Kompilieren für 64bit) ein #define zu aktivieren, und den Code dann so zu gestalten:

    Code
    #ifdef 64_BIT
    osdbuf_aligned = (unsigned char *)((long long)osdbuffer + (PAGE_SIZE - 1));
    osdbuf_aligned = (unsigned char *)((long long)osdbuf_aligned & PAGE_MASK);
    #else
    osdbuf_aligned = (unsigned char *)((int)osdbuffer + (PAGE_SIZE - 1));
    osdbuf_aligned = (unsigned char *)((int)osdbuf_aligned & PAGE_MASK);
    #endif


    fällt jemandem was besseres ein? kann man direkt per Code bestimmen, ob gerade für 64bit kompiliert wird?

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    2 Mal editiert, zuletzt von Dr. Seltsam ()

  • Zitat

    Original von Dr. Seltsam


    die, wenn man für 64bit kompiliert, so aussehen muss:

    Code
    osdbuf_aligned = (unsigned char *)((long long)osdbuffer + (PAGE_SIZE - 1)); 
    osdbuf_aligned = (unsigned char *)((long long)osdbuf_aligned & PAGE_MASK);


    leider kompiliert es so dann nicht mehr mit allen gcc-Versionen unter 32-bit.


    Warum muß das 'long long' sein? Reicht da nicht ein 'long'? Beides ist 64Bit bei x86_64. Probiers mal mit 'intptr_t' bzw 'uintptr_t'. Die beiden Typen sollen numerische Operationen mit Pointern erlauben und sind für 32/64-bit unterschiedlich definiert.


    Gruß
    e9hack

  • Wie schon gesagt, die für solche Zeigeroperationen gedachten Datentypen sind intptr_t, uintptr_t und ptrdiff_t. Die sollen nach Definition immer Pointer-Größe haben. Dafür tauchen sie leider erst im C99-Standard offiziell auf, könnten also auf älteren exotischen Compilern fehlen.


    In diesem Fall würde folgendes aber auch gehen:


    Code
    unsigned char *osdbuffer = ...;
    unsigned char *osdbuf_aligned;
    
    
    osdbuf_aligned = osdbuffer + PAGE_SIZE - 1 - (((int)osdbuffer - 1) & ~PAGE_MASK);


    - ungetestet.



    Zitat

    Warum muß das 'long long' sein? Reicht da nicht ein 'long'?


    Laut Wikipedia verwenden 64-Bit Compiler überwiegend 64-bit für long. Ausnahme sind LLP64-Compiler, wofür aber nur Micosofts Visual C++ als Beispiel aufgeführt wird. long long ist dagegen immer 64-Bit, selbst auf 32-Bit Compilern, wenn vorhanden.



    Gruß,


    Udo

  • Zitat

    Original von Urig
    Dafür tauchen sie leider erst im C99-Standard offiziell auf, könnten also auf älteren exotischen Compilern fehlen.


    es muss nur bis gcc 2.95.4 kompatibel sein, und das scheint der Fall zu sein. Mit intptr_t kompiliert es unter 2.95.4, 3.3 und 4.2.
    Ich lass jetzt mal testen, ob es auch unter 64-bit problemlos kompiliert

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • Zitat

    Original von Urig



    Laut Wikipedia verwenden 64-Bit Compiler überwiegend 64-bit für long. Ausnahme sind LLP64-Compiler, wofür aber nur Micosofts Visual C++ als Beispiel aufgeführt wird. long long ist dagegen immer 64-Bit, selbst auf 32-Bit Compilern, wenn vorhanden.


    ich habe selbst kein 64-bit-System laufen und konnte es daher nie testen. Von mehreren Leuten, u.a. e-tobi kam aber der Hinweis, dass es mit long unter 64-bit nicht kompiliert.

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • so, laut e-tobi kompiliert es mit intptr_t auch unter 64-bit
    Akte geschlossen, danke für die Hilfe :)

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!