funktionszeiger problem
-
hi zusammen,
ich bitte euch ganz dringend um hilfe.
ich bin ganz neu in C-programmierung und hab grad problem mit funktionspointer.
Ich hab ein code und nicht verstanden wieso man das macht,Kann jemand mir erklären?In header file:
/--------beispiel.h-----------------
typedef struct { float32 K;
void (calc)();
} ADC;
#define ADC_DEFAULTS {1,*(void ()(Uint32))const_calc**}void const_calc(ADC);*
----------end beispiel.h-----------------*/In Sorce file:
/*--------beispiel.c-----------------
#include "beispiel.h"
void const_calc(ADC p)
{
...
}
---------end beispiel.c-------------------//--------main.c-----------------
#include "beispiel.h"
ADC adc = ADC_DEFAULTS;
void main(){
adc.calc(@adc);//funktionsaufruf
}
---------end main.c-------------------/Es funktioniert perfekt!
Frage ist, in beispiel.h was ist eigentlich diese syntax: (void (*)(Uint32))const_calc??? also was für eine Typumwandlung ist das?(P.s typedef unsigned int Uint32;)Ich hab nach meiner art so gemacht,nur in headerfile geändert:
/*--------beispiel.h-----------------
typedef struct _ADC{ float32 K;
void (*calc)(struct _ADC*);
} ADC;
#define ADC_DEFAULTS {1,const_calc}void const_calc(ADC*);
----------end beispiel.h-----------------*/Aber dann in mainfile kommt fehler wenn ich so macht:
adc.calc(@adc);//funktionsaufruf---> fehler!Es sieht so aus als ob es in Struct adc kein element "calc" gibt.danke im voraus
lg aus hannover
-
willst du, dass wir Augenkrebs bekommen? Benutze bitte die CPP-Tags des Forums, sonst kann das deiner lesen.
-
c-plusplus schrieb:
Aber dann in mainfile kommt fehler wenn ich so macht:
adc.calc(@adc);//funktionsaufruf---> fehler!Es sieht so aus als ob es in Struct adc kein element "calc" gibt.Was für ein Fehler wird denn angezeigt (Fehlerausgabe posten)? Meinst du nicht, es liegt eher an dem @-Zeichen? Ich weiß nicht, was du damit bezwecken willst. Mein Compiler kennt das nicht und ich auch nicht...
c-plusplus schrieb:
Es funktioniert perfekt!
Fragt sich, wie du das beurteilen willst, wenn du nicht kompilieren kannst...
-
c-plusplus schrieb:
adc.calc(@adc);//funktionsaufruf---> fehler!Es sieht so aus als ob es in Struct adc kein element "calc" gibt.
danke im voraus
lg aus hannoverWo kommen bei dir die Klammeraffen her ?
#include <stdio.h> typedef struct _ADC { float K; void ( *calc )( struct _ADC* ); } ADC; void const_calc ( struct _ADC* padc ) { puts ( "Kalk" ); return; } #define ADC_DEFAULTS { 1, const_calc } int main ( void ) { ADC adc = ADC_DEFAULTS; adc.calc ( &adc ); return 0; }
Das funzt, ohne Probleme.
Gruß aus Hannover :D,
B.B.
-
danke all
das war erstmals dummer fehler von mir mit klammeraffen,ich hab korigiert mit &,und funtioniert
ich benutze Code Composer Studio 3.3,es kompiliert dann fehlerfrei aber er sagt "symbol definition not found" wenn der cursor auf **adc.read(&adc);
**liegt. Ich weiß nicht woran es liegt,vielleicht ist das ein fehler von Code composer studio?@ _matze : das original code ist adc.calc(&adc);deswegen funktioniert perfekt:) Aber ich hab noch nicht verstanden mit dieser syntax in originalcode:
(void (*)(Uint32))const_calc.Könnt ihr mal mir erklären?@supertux: ja mache ich:-)
@Big Brother : ja deins würde funktionieren:-)
viele grüße aus hannover
-
c-plusplus schrieb:
ich benutze Code Composer Studio 3.3,es kompiliert dann fehlerfrei aber er sagt "symbol definition not found" wenn der cursor auf **adc.read(&adc);
**liegt. Ich weiß nicht woran es liegt,vielleicht ist das ein fehler von Code composer studio?ich vermute mal ,es liegt daran dass wenn es um mein code geht ,dann zeigt der pointer "read" nicht richtig auf die erwartete funktion
void const_calc ( struct _ADC* padc )
,deswegen stehts da "symbol definition not found" von CCS,obwohl es klar fehlerfrei kompiliert werden kann:(
Deswegen braucht man die typumwandlung(void (*)(Uint32))const_calc
@Big Brother,ich würde sagen,deins verhält sich auch genauso wie meins,das heißt, fehlerfrei kompiliert aber er zeigt irgendwohin nicht auf die erwartete funktion:( weil ich hab auch deinen code so kopiert u. probiert aber gleiche meldung "symbol definition not found" wie bei meinem.
habt ihr idee?
bitteeeee hilf mir:(
gruß aus uni hannover
-
c-plusplus schrieb:
ich benutze Code Composer Studio 3.3,es kompiliert dann fehlerfrei aber er sagt "symbol definition not found" wenn der cursor auf **adc.read(&adc);
**liegt.deine struct _ADC hat doch überhaupt keinen member namens 'read'. oder hab' ich ihn übersehen?
-
deine struct _ADC hat doch überhaupt keinen member namens 'read'. oder hab' ich ihn übersehen?
:)[/quote]ja ,ich meine "calc":-)
-
~fricky schrieb:
deine struct _ADC hat doch überhaupt keinen member namens 'read'. oder hab' ich ihn übersehen?
ja ich meine "calc":-)
-
ach so...
im mikrocontroller-board hat sich gestern übrigens einer an was ähnlichem die zähne ausgebissen. vielleicht kannst du dem beitrag irgendwas entnehmen: http://www.mikrocontroller.net/topic/115063
-
~fricky schrieb:
ach so...
im mikrocontroller-board hat sich gestern übrigens einer an was ähnlichem die zähne ausgebissen. vielleicht kannst du dem beitrag irgendwas entnehmen: http://www.mikrocontroller.net/topic/115063
haha das bin ich=))
-
lolz
-
sagt der linker wirklich nur "symbol definition not found"? sonst gar nichts?
das einzige, was mir einfällt, ist, dass die tatsache, dass du die funktion nur per funktionspointer aufrufst, den compiler veranlasst, die funktion wegzuoptimieren. der compiler wäre dann aber von schlechter qualität.
-
besserwisser schrieb:
sagt der linker wirklich nur "symbol definition not found"? sonst gar nichts?
das einzige, was mir einfällt, ist, dass die tatsache, dass du die funktion nur per funktionspointer aufrufst, den compiler veranlasst, die funktion wegzuoptimieren. der compiler wäre dann aber von schlechter qualität.
ja, der sagt nur so,ich dachte der pointer hat so nicht richt auf erwartete funktion gezeigt:(
für compiler hab ich code composer studio 3.3 benutzt.
-
im allgemeinen ist symbol eher der ausdruck eines linker als eines compilers. was sich im funktionspointer abspielt, merken weder compiler noch linker, da dies ja zur laufzeit passiert.
du kannst probieren, die funktion dem funktionspointer direkt vor dem aufruf zu zuweisen. vielleich klappt das. sonst leider bin ich in dem fall auch ratlos.
ungünstig ist auf jeden fall, dass der linker nicht sagt, welches symbol ihm fehlt.