Architekturspezifische Codeerstellung



  • Hallo,
    ich wollte für einen kleinen Test ein Programm erstellen, dass auch auf verschiedenen Rechnerarchitekturen lauffähig ist.

    Hiefür habe ich mal ein Beispiel, was nicht funktioniert.
    Meine Frage ist nun, wie muss ich den Code ändern, damit der gewünschte Effekt eintritt.

    bool big_endian()
    {
    	unsigned short int iVar, *piVar;
    	unsigned char *pcVar;
    	piVar = &iVar;
    	pcVar = (unsigned char *)&iVar;
    	iVar = 0xff00;
    	if (*pcVar == 0xff)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    union ieee_float
    {
    	float a;
    	if(big_endian()) //FEHLER
    	{
    		struct
    		{
    			unsigned s : 1;
    			unsigned e : 8;
    			unsigned m :23;
    		} b;
    	}
    	else
    	{
    		struct
    		{
    			unsigned m :23;
    			unsigned e : 8;
    			unsigned s : 1;
    		} b;
    	}
    };
    

    Danke



  • binaer wird dein prog glaub ich niemals plattformunabhaengig sein ^^
    der code und die clib gegen die gelinkt werden muss iss ja jedesmal ne andere ...

    und wenn es fuer deine platform jedesmal neu uebersetzen musst, warum dann nicht gleich praeprozessor direktiven nutzen ...
    unter linux kompilierst es ja fast eh fuer jede distrie neu ...

    Was mich aber auch echt intressieren wuerd, ob dein Ansatz funktioniert, wenn man das auf som Linux fuer mac laufen laesst ... hab nur kein mac hier ^^

    Ciao ..



  • Du kannst Anweisungen wie if() nicht in einer Typdeklaration einbringen - das beste, was du machen kannst, wäre die Entscheidung dem Präprosessor zu überlassen:

    union ieee_float
    {
        float a;
    #if big_endian
        struct
        {
            unsigned s : 1;
            unsigned e : 8;
            unsigned m :23;
        } b;
    #else
        struct
        {
            unsigned m :23;
            unsigned e : 8;
            unsigned s : 1;
        } b;
    #endif
    };
    

    (allerdings bin ich nicht sicher, ob und wie die big_endian-Überprüfung durch den Präprozessor läuft)



  • Danke erstmal.
    Wenn ich eine Lösung finden sollte, melde ich mich nochmal.



  • daishi schrieb:

    Hallo,
    ich wollte für einen kleinen Test ein Programm erstellen, dass auch auf verschiedenen Rechnerarchitekturen lauffähig ist....

    Hi,

    warum machst Du Dir das eigentlich so schwer ?
    Ein float ist auf jeder Architektur ein float und Compiler/Co sorgen schon dafür, dass das richtig im Speicher steht. Erst, wenn Du selbst Hardware ansprechen willst, wird das relevant, aber
    a) das würde ich nur in entsprechenden Schnittstellen berücksichtigen und
    b) da weiß der Compiler das dann auch und bietet Dir vermutlich entsprechende "Präprozessor-Schalter" an (habe ich jetzt nicht nachgesehen, welche):

    Zur Not kannst Du zur Laufzeit einen Test machen..

    // Nur zu Demozwecken !!! Reines C ... ohne "++"
        int i = 1;
        char* pc = (char*) i&;
        if(pc[0]) printf("little endian");
        else printf("big endian");
    

    AAAAABER: Du mußt dann auch unterschiedliche Längen im Speicher (mit sizeof()), Genauigkeiten ("limits") etc. berücksichtigen (weißt Du vermutlich, aber ich wollte es erwähnt haben).

    Letztlich sollte man das Plattformunabhängigkeit, was C/++ bietet, nutzen und mit den eingebauten Datentypen solange rechnen, wie es geht.....

    Gruß,

    Simon2.


Anmelden zum Antworten