Portabler Code ?!?



  • Shade Of Mine schrieb:

    Nein, du hast dort ein typedef für int32_t für einen int mit 32 bit. Ein unit16_t für einen unsigned mit 16 bit, etc.

    Diese Datei ist dann Plattformabhängig. Du weisst ja, dass auf dieser Plattform ein int immer 4 Byte hat und auf jener immer 2.

    Siehe zB stdint.h

    ok, aber was soll ich machen, wenn die plattform einen bestimmten typ überhauptnicht unterstützt?

    soweit ich das jetzt verstanden habe, soll ich sowas machen:

    typedef int my_int32_t // wenn ich einen int brauche, der 4 byte groß ist, und ich weiß, dass auf diesem system int = 4 byte ist
    

    aber was soll ich machen, wenn ich einen 4 byte int brauche, das system aber überhaupt keinen "vorgefertigten" 4 byte typ bereitstellt?

    sagen wir mal, ich bräuchte einen typen, der genau 3 byte (= 24 bit) bereitstellt. auf meinem system gibt es KEINEN typen, der 3 byte hat.

    typedef <???> my_int24_t
    

    was müsste in diesem fall bei <???> stehen?



  • typedef char my_int24_t[3];
    // oder
    typedef struct
    {
    	char t24[3];
    }MyInt24_t;
    
    my_int24_t t1;
    // oder
    MyInt24_t t2;
    
    t1[0] = 0, t1[1] = 1 ...
    t2.t24[0] = 0 ...
    


  • CJosef schrieb:

    typedef char my_int24_t[3];
    // oder
    typedef struct
    {
    	char t24[3];
    }MyInt24_t;
    
    my_int24_t t1;
    // oder
    MyInt24_t t2;
    
    t1[0] = 0, t1[1] = 1 ...
    t2.t24[0] = 0 ...
    

    das wäre natürlich eine möglichkeit. aber ich kann dann variablen nicht so einfach deklarieren (??? - ist das das richtige wort?).
    einen int initialisiere und deklariere ich ja so:

    int variablen_name=1234;
    

    bei deinem beispiel geht das aber nicht so:

    my_int24_t t1=123;
    

    sondern mit array ?!? ich find das ein bissl mühsam.

    gäbe es noch eine andere möglichkeit?



  • Stimmt, ein Wert lässt sich nicht so einfach wie bei einem int zuweisen, das ginge umständlicher z.B. über Bitshift.
    Das gilt auch für Rechenoperationen (+/-*), Parameterübergabe an Standardfunktionen, etc.
    Dafür müsstest du dir eigene Funktionen bauen, ob sich der Aufwand lohnt ... ?



  • ...mhh... schrieb:

    ok, aber was soll ich machen, wenn die plattform einen bestimmten typ überhauptnicht unterstützt?

    Dann wirst du langsam aber sicher merken, dass die portability-Junkies eigentlich Schwachköpfe sind. Weil alles seine Grenzen hat. Wer Code portabel für eine x64-CPU und einen 24Bit-DSP und einen 8Bit-µC schreiben will, der sollte vielleicht doch lieber auf Marketing+Design umschulen.



  • DirkB schrieb:

    Es gibt/gab aber Rechner mit CHAR_BIT = 9

    es ist etwas offtopic, aber ich finde, es passt trotzdem ein wenig. welche rechner benutzen bzw. benutzten solch eine architektur ? könnt ihr mir da beispiele, links, o.ä. liefern ?



  • Hier einige Rechner mit 7 und 9bit char:
    http://en.wikipedia.org/wiki/36-bit_word_length



  • f.-th. schrieb:

    Hier einige Rechner mit 7 und 9bit char:
    http://en.wikipedia.org/wiki/36-bit_word_length

    perfekt 👍 🙂



  • In C ist CHAR_BIT aber mindestens 8. (Siehe die Links in http://www.c-plusplus.net/forum/300567)



  • In Bezug auf den portablen Code ob da ein char 8 bit gross ist oder eine andere Grösse hat, sollte man das ein wenig pragmatisch angehen.

    Es reicht das man weiss, das es solche "Exoten" gibt. Im Quelltext würde ich mir da nur einen Kopf machen, wenn das Programm real auf so einer Kiste laufen muss.



  • ...mhh... schrieb:

    aber was soll ich machen, wenn ich einen 4 byte int brauche, das system aber überhaupt keinen "vorgefertigten" 4 byte typ bereitstellt?

    Indem du liest, was hier vorgeschlagen wurde und es umsetzt.
    Wenn es keinen "vorgefertigten" Typ gibt, dann definierst du dir eben deinen eigenen.

    typedef unsigned long Typ32Bit;
    
    ...
    
    int main()
    {
      Typ32Bit x;
      assert( CHAR_BIT*sizeof(long)==32 );
      /* ab hier ist sichergestellt, dass dein neuer Typ genau 32 Bit enthält */
      ...
    }
    

    Bei dieser Implementierung kannst du alle Funktion/Operatoren, die für unsigned long definiert sind, benutzen, z.B. strtoul,printf("%lu",scanf("%lu",...
    Das befreit dich aber nicht von Maßnahmen zu Sicherstellung der Bytereihenfolge innerhalb deiner 4 Bytes, falls dein Programm solche Daten mit externen Quellen (Dateien,Netzwerk,...) tauscht.


Anmelden zum Antworten