Funktionspointer für unterschiedliche Plattformen

Gast #705882
Lesenswert?

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
#705908
Lesenswert?

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);
Gast #706157
Lesenswert?

> 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.
Gast #706217
Lesenswert?

>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.
Gast #707512
Lesenswert?

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
#707548
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren