Archiv verlassen und diese Seite im Standarddesign anzeigen : Function Pointer - Verständnissproblem
Angenommen, ich weise einem function pointer eine Funktion zu und führe sie aus, also quasi so
void (*new_function)(void) = meinefunc;
(*new_function)();
Wieso gibt er mir dann folgende Warnung aus?
./taskcaller/taskcaller.c:73: warning: initialization from incompatible pointer type
Vielen Dank für eure Hilfe!
Wie ist denn 'meinefunc' deklariert?
MfG Mark
also void meinefunc(void);
Komisch, bei mir lässt sich der Code ohne Warnungen compillieren. Kannst Du eventuell den ganzen Code posten, vllt steckt das Problem woanders.
MfG Mark
SprinterSB
25.04.2008, 23:28
Hast du die Deklaration (Prototyp) von meinefunc auch *vor* der Zuweisung stehen?
Hallo zusammen, ich hänge nun mal meinen gesammten Code an, auch wenn er noch nicht fertig ist.
Das ganze ist ein Taskcaller, der immer verschiedene Funktionen aufrufen soll.
Edit: Nochwas: Ich verwende nicht WinAvr sondern avr-gcc(4.2.1) für Linux.
Ich hätte noch eine paar Fragen:
1. Wie sage ich dem Gcc dass er alle Variablen "zentral" speichern soll. Wenn der Caller nun das mit icall aufruft, werden in den Funktionen local die Variablen gesichert. Ich möchte das ganze aber zentral, dass er alle Register vor dem icall sichert, die er noch braucht.
2. Wie sage ich dem Gcc, dass er nichtverwendete Funktionen nicht ins Flash mitnehmen soll..?
Hallo,
void (*functiontoexecute)(void)=address;
Wo und wie ist adress deklariert? Das sollte dann auch eine Funktion sein.
Gruß
Jens
address ist der pointer auf eine Funktion. Die Funktionsaddresse wird bei taskf_addtask mit übergeben.
Das krasse ist ja, ersetzt man address durch eine reale funktion und keinen pointer, sei es z.b. meinefunc, die existiert, kommt die gleiche Fehlermeldung. Kompiliere ich es mit AvrStudio (also WinAVR) kommt bei mir keine Fehlermeldung.
Wie kann ich die Fehlermeldung unterdrücken?
uint16_t* address;
mir erscheint das seltsam, dass address nicht als void* deklariert ist. wäre ich ein compiler, würde ich da ohne explizites cast auch meckern. kann aber sein dass ich mich täusche.
gruesse
Dumme frage, aber ein pointer auf void was heißt das? Für mich heißt void kein Argument... Könnte mir das bitte jemand erklären?
Hallo,
ein void Pointer ist auch 'nur' ein Zeiger auf eine Adresse. Es ist zur compiler Zeit noch nicht festgelegt, welcher Type sich an der Adresse befindet. Wenn du einen Zeiger mit dem Wert 54 hast, sagt das nur aus, dass sich an Speicheradresse 54 das gesuchte befindet. Das kann dann ein 8 Bit oder auch ein 16 Bit-Wert sein genauso wie eine Funktion.
Zur Verwirrung, void* ist kein Zeiger auf void, es ist ein Zeiger auf einen zur Zeit unbekannten Type.
Ich kann es nicht besser erkären.
HTH
Jens
SprinterSB
01.05.2008, 10:34
Address wird auf einen passenden Typ gecastet und aufgerufen:
((void(*)(void)) address) ();
Falls es über eine eigene Variable gehen soll:
void (*func)(void) = (void(*)()) address;
func();
oder etwas besser lesbar
void (*func)(void) = (typeof(func)) address;
oder
typedef void (*func_t)(void);
...
func_t func = (func_t) address;
func();
// oder direkt
// ((func_t) address)();
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.