Forum: Compiler & IDEs Funktionspointer für unterschiedliche Plattformen


von Kanzler Gorkon (Gast)


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

von Uhu U. (uhu)


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);

von Kanzler Gorkon (Gast)


Lesenswert?

Vielen Dank!
Der Code compiliert schon mal, ich hoffe heute Nachmittag auf die 
Hardware, dann kann ichs testen/debuggen!

mfg

von Rolf Magnus (Gast)


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.

von Andreas K. (a-k)


Lesenswert?

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.

von Kanzler Gorkon (Gast)


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.

von Kanzler Gorkon (Gast)


Lesenswert?

@Uhu Uhuhu:

Dein Code funktioniert prima.
Vielen Dank!

mfg

von Frank (Gast)


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

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.