Hallo, ich suche nach einem Weg für unterschiedliche Plattformen eine Funktion zu schreiben, die einen Zählerstand ausliest. Dabei soll zur Laufzeit ermittelt werden um welche Plattform es sich handelt, aber aus Performancegründen nur einmal. Das stell ich mir so vor: long LeseWertPlattform1( long* wert ) { //was auch immer } long LeseWertPlattform2( long* wert ) { //was auch immer } long LeseWert( long* wert ) { wert = 0; return 0; } Bei der Initialisierung gehe ich dann wie folgt vor: if( Plattform1 ) *( long* )&LeseWert = ( long )&( LeseWertPlattform1 ); else *( long* )&LeseWert = ( long )&( LeseWertPlattform2 ); Und in weiterer Folge sollten dann alle Aufrufe von LeseWert( &t ) auf die tatsächliche Funktion der Plattform zeigen. Geht das überhaupt? Oder bin ich grad nur zu blöd im das hinzubekommen? mfg
Kanzler Gorkon wrote: > Bei der Initialisierung gehe ich dann wie folgt vor: > > if( Plattform1 ) > *( long* )&LeseWert = ( long )&( LeseWertPlattform1 ); > else > *( long* )&LeseWert = ( long )&( LeseWertPlattform2 ); > Das casten ist keine gute Idee.
1 | typedef long (*Plattformleser)(long* wert); |
2 | |
3 | Plattformleser LeseWert; |
4 | |
5 | if( Plattform1 ) |
6 | LeseWert = LeseWertPlattform1; |
7 | else
|
8 | LeseWert = LeseWertPlattform2; |
oder etwas kürzer:
1 | typedef long (*Plattformleser)(long* wert); |
2 | |
3 | Plattformleser LeseWert = Plattform1 ? LeseWertPlattform1 : LeseWertPlattform2; |
Der Aufruf sieht dann so aus:
1 | long W = (*LeseWert)(&Wert); |
Vielen Dank! Der Code compiliert schon mal, ich hoffe heute Nachmittag auf die Hardware, dann kann ichs testen/debuggen! mfg
> ich suche nach einem Weg für unterschiedliche Plattformen eine Funktion > zu schreiben, die einen Zählerstand ausliest. Dabei soll zur Laufzeit > ermittelt werden um welche Plattform es sich handelt, aber aus > Performancegründen nur einmal. Das heißt, daß ein und dasselbe Kompilat auf allen Plattformen funktionieren soll? > Bei der Initialisierung gehe ich dann wie folgt vor: > > ( Plattform1 ) > *( long* )&LeseWert = ( long )&( LeseWertPlattform1 ); > else > *( long* )&LeseWert = ( long )&( LeseWertPlattform2 ); > > Und in weiterer Folge sollten dann alle Aufrufe von LeseWert( &t ) auf > die tatsächliche Funktion der Plattform zeigen. Wozu sind die Casts nach long gut? > Geht das überhaupt? Kommt drauf an. Wenn ein Zeigerwert sich verlustlos in einen long und zurück konvertieren läßt (plattformabhängig), dann sollte es gehen.
Rolf Magnus wrote:
> Wozu sind die Casts nach long gut?
Sieht eher so aus, als ob der Kanzler nicht wusste, dass es in C ganz
offiziell Zeiger auf Funktionen gibt.
>Das heißt, daß ein und dasselbe Kompilat auf allen Plattformen >funktionieren soll? Ja, genau. >> Wozu sind die Casts nach long gut? >Sieht eher so aus, als ob der Kanzler nicht wusste, dass es in C ganz >offiziell Zeiger auf Funktionen gibt. ...ganz offiziell nur zu Debugzwecken, nachdems den ausführbaren Code nicht ändert ist das auch kein Problem.
@Uhu Uhuhu: Dein Code funktioniert prima. Vielen Dank! mfg
Uhu Uhuhu wrote:
> Der Aufruf sieht dann so aus:
1 | > long W = (*LeseWert)(&Wert); |
Es funktioniert ja auch
1 | long W = (LeseWert)(&Wert); |
(habs getestet) 1. Wieso eigentlich? 2. Warum nimmst Du Deine Form? Gruß Frank
Frank wrote: > Es funktioniert ja auch >
1 | > long W = (LeseWert)(&Wert); |
2 | >
|
> (habs getestet) > > 1. Wieso eigentlich? Weil LeseWert ein Funktionspointer ist und zweiteres immer noch für den Compiler ein Funktionsaufruf ist. Was sollte es sonst sein? Einem Pointer kann man nur was zuweisen oder ihn verwenden. Welches der beiden vorliegt ist aber leicht zu unterscheiden. Auch
1 | long W = LeseWert(&Wert); |
sollte funktionieren.
> 2. Warum nimmst Du Deine Form?
nehm ich auch. Ich nehme sie, weil mich die Schreibweise
(*LeseWert)(&Wert);
daran erinnert, dass es sich hier um einen Funktionspointer
handelt und dass dieser Pointer dereferenziert werden muss
bevor die Funktion aufgerufen werden kann. Ich finde das
kommt in dieser Schreibweise klarer zum Ausdruck.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.