void* zeiger in funktionszeiger casten - wie?
-
double d = 0.0; void* p[3] = {0}; p[0] = sin; p[1] = cos; p[2] = tan;
soweit so gut.
wie kann ich jetzt die sinus funktion aufrufen?d = p[0](1)
liefert mir:
error : Ausdruck ergibt keine Funktion
habe ein paar casts getestet:
d = ((double)(*)(double)) p[0] (1); d = (double) (*p[0])(double) (1);
funzt alles nicht. wer weiss wies geht?
-
((double(*)(double))p[0])()
sollte klappen ... der Cast stimmt jedenfalls, im hinteren Teil bin ich mir mit der Operatorrangfolge gerade nicht sicher
BTW ist das unportabel, man kann einen Funktionspointer nicht garantiert verlustlos nach void* und zurück casten.
-
Bashar schrieb:
((double(*)(double))p[0])()
sollte klappen ... der Cast stimmt jedenfalls, im hinteren Teil bin ich mir mit der Operatorrangfolge gerade nicht sicher
klappt!
ich war relativ dicht dran, aber knapp daneben ist ja auch vorbei.Bashar schrieb:
BTW ist das unportabel, man kann einen Funktionspointer nicht garantiert verlustlos nach void* und zurück casten.
das ist aber doof, da kann ich ja fast von vorn anfangen.
welche infos könnten denn beim casten verloren gehen, bzw. in welchem fall?
-
func ptr n00b schrieb:
welche infos könnten denn beim casten verloren gehen, bzw. in welchem fall?
wenn du eine architektur hast, wo daten in einem 16-bit-zeiger haben und funktionen 32-bitter sind.
speichermodell medium auf http://books.google.de/books?id=EdUkA4hmltUC&pg=PA346&lpg=PA346&dq=speichermodell+compact&source=bl&ots=IiHeavMKjr&sig=jK4G3szcefpAIDBYjXmsdv_QXS8&hl=de&ei=A_nkSYn9H8uOsAbDvdCgCw&sa=X&oi=book_result&ct=result&resnum=1aber mach einfach nicht void* p[3], sondern ein array aus zeigern auf funktionen, die double nehmen und double geben.
dann ist auch das casten im code weg.und nimm bitte sowas wie
typedef double(*pdfuncd)(double); pdfuncd* a[3];
damit deine arbeitskollegen den ciode auch lesen können.
bin jetzt nicht sicher, daß sie syntax genau stimmt, aber das ist ja dein job.
-
das mit dem 16-bit-zeiger ist irgendwie einleuchtend. na dann werd ich das mal ändern, die warnmeldungen waren sowieso nervig.
danke für eure antwortengruß,
f.p.n.