mikrocontroller.net

Forum: Compiler & IDEs Funktionspointer für unterschiedliche Plattformen


Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.
typedef long (*Plattformleser)(long* wert);

Plattformleser LeseWert;

if( Plattform1 )
  LeseWert = LeseWertPlattform1;
else
  LeseWert = LeseWertPlattform2;

oder etwas kürzer:
typedef long (*Plattformleser)(long* wert);

Plattformleser LeseWert = Plattform1 ? LeseWertPlattform1 : LeseWertPlattform2;


Der Aufruf sieht dann so aus:
long W = (*LeseWert)(&Wert);

Autor: Kanzler Gorkon (Gast)
Datum:

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

mfg

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uhu Uhuhu:

Dein Code funktioniert prima.
Vielen Dank!

mfg

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu wrote:

> Der Aufruf sieht dann so aus:
> long W = (*LeseWert)(&Wert);

Es funktioniert ja auch
long W = (LeseWert)(&Wert);
(habs getestet)

1. Wieso eigentlich?
2. Warum nimmst Du Deine Form?

Gruß Frank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank wrote:

> Es funktioniert ja auch
>
> long W = (LeseWert)(&Wert);
> 
> (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
   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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.