PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Function Pointer - Verständnissproblem



s.o.
25.04.2008, 16:14
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!

p_mork
25.04.2008, 17:29
Wie ist denn 'meinefunc' deklariert?

MfG Mark

s.o.
25.04.2008, 20:14
also void meinefunc(void);

p_mork
25.04.2008, 20:27
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?

s.o.
26.04.2008, 11:41
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..?

McJenso
26.04.2008, 19:21
Hallo,



void (*functiontoexecute)(void)=address;


Wo und wie ist adress deklariert? Das sollte dann auch eine Funktion sein.

Gruß

Jens

s.o.
26.04.2008, 19:32
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?

robocat
26.04.2008, 21:49
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

s.o.
27.04.2008, 11:16
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?

McJenso
27.04.2008, 13:03
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)();