typenunabhängige Funktionsübergabe
-
Servus,
Ich arbeite an einem Projekt, bei dem ich manchmal double Pointer und double Complex Pointer an eine Funktion übergebe. Nun habe ich keine Lust für jede Variablenform, die selbe Funktion noch einmal zu schreiben. Ich will das Ganze nocheinmal visualisieren.
Prototyp
double *myfun(double *input); double complex *myfun_complex(double complex *input);
myfun ist die selbe funktion, nur einmal mit double und ein zweites Mal mit double complex ein In- und Outputvariable.
Was kann man denn da tun, dass es egal ist, was ich hinten reinschmeiße?
Was spielt void da für eine Rolle?Mfg Inge
-
Hi,
du kannst myfun benutzen und entweder den IM- oder Realteil übergeben und außerhalb von myfun wieder ne komplexe Zahl zusammenbauen.
Oder aber du machst ne double* my_universal_fun ( void* p ) Funktion, innerhalb dieser zerlegst du die komplexe Zahl, machst die Berechnung und baust außerhalb wieder die Zahl zusammen.
Die erste Version ist wohl am einfachsten.
Gruß,
B.B.
-
Der Nachteil an der zweiten Version ist, dass du zusätzlich eine Information bereitstellen musst, ob gerade ein double complex* oder ein double* reinkommt.
-
Mach dir einfach eine Struktur, die entweder ein double oder oder ein double complex darstellt:
#include <stdio.h> #include <complex.h> typedef enum { REAL, COMPLEX } type_tag_t; typedef struct { type_tag_t tag; union { double real; double complex comp; } number; } number_t; void print_number(number_t num) { if (num.tag == REAL) printf("%lf\n", num.number.real); else printf("%lf + %lfi\n", creal(num.number.comp), cimag(num.number.comp)); } int main(void) { number_t a; a.tag = REAL; a.number.real = 3.14; print_number(a); a.tag = COMPLEX; a.number.comp = 3.14 + 2 * I; print_number(a); }
-
Benutz C++ und schreib ein Template
*duck*
-
Hallo BB,
es gäbe noch die Möglichkeit, all meine Variablen auf double complex umzustellen, da wäre alles abgedeckt. Allerdings kostet der Spaß wieder Speicherbedarf.
Zudem hatt ich gehofft ohne eine weitere äußere Info damit auszukommen. Nun zu einer weiteren Möglichkeit.
Angenommen man übergibt anstatt eines double complex-Typs eine double Variable. Der Compiler gibt dann eine Warnung aufgrund falschen Typs hinaus, compiliert es aber dennoch. Hat dann die übergebene Variable den benötigten Speicher der double complex (2x double) oder den benötigten Speicher für double (1x double)?
Ich nehme an ich kenne die Antwort schon(2x) und der rest des Speicherplatzes wird nicht genutzt. Was ich aber meine ist, kann man über die Speichergröße Rückschlüsse über den übergebenen Variablentyp ziehen, auch wenn die Übergabevariablentyp nicht dem des festgelegten Prototypen entspricht?
Grüße Inge
@mngdb
Die Idee ist nicht schlecht. Mich würde interessieren, ob man das Problem innerhalb der Funktionen lösen kann. Eine Typendefinition muss man vorher machen.
-
Ingeborg schrieb:
Der Compiler gibt dann eine Warnung aufgrund falschen Typs hinaus, compiliert es aber dennoch. Hat dann die übergebene Variable den benötigten Speicher der double complex (2x double) oder den benötigten Speicher für double (1x double)?
Das geht nur gut, solange der Compiler erkennt, dass der Imaginärteil dann Null werden muss. Ich tippe auf undefiniertes Verhalten.
Ingeborg schrieb:
@mngdb
Die Idee ist nicht schlecht. Mich würde interessieren, ob man das Problem innerhalb der Funktionen lösen kann. Eine Typendefinition muss man vorher machen.Naja, Ansichtssache. Einfach alles complex zu machen, und einfach den Imaginärteil auf Null setzen wenn du ihn nicht brauchst wäre schlauer.
-
Hm...schade das es nicht klappt.Da werde ich wohl Speicher opfern müssen. trotzdem danke.
Grüße Inge
-
Ingeborg schrieb:
Hm...schade das es nicht klappt.Da werde ich wohl Speicher opfern müssen. trotzdem danke.
Grüße Inge
Warum nicht vorher zerlegen und hinterher zusammenbauen?
-
Big Brother schrieb:
Ingeborg schrieb:
Hm...schade das es nicht klappt.Da werde ich wohl Speicher opfern müssen. trotzdem danke.
Grüße Inge
Warum nicht vorher zerlegen und hinterher zusammenbauen?
Prinzipiell ist es wurst, da hast du schon recht. Es ist aber immer ganz schön wenn man für Problemlösungen einfach die Fkt hinschreibt, ohne das man noch was dazu verfassen muss. Das ist ja an sich nicht so dramatisch wichtig, man kann ja noch einen Header mit Typendefinitionen schreiben.
Grüße Inge
-
Bashar schrieb:
Benutz C++ und schreib ein Template
Was auch darauf hinausläuft, jede Funktion zweimal zu haben. Zum Glück ist C++ nicht der einzige Codegenerator.