Probleme mit Function Pointern, DLL und so
-
Hallo.
Unten hab ich einen Auszug aus einem aktuellen Projekt:
CallOptimizer::CallOptimizer(void) { SirBDoc* pDoc= ::GetDocPtr(); VisObjList listKnot; char* namensliste; int nchrom; ObjContainer * obj=new ObjContainer(pDoc); obj->FindInAllContsByTypeGroup(listKnot, OTG_KNOT, FALSE); nchrom=listKnot.GetSize(); char* const char_ptr=namensliste; for(POSITION pos=listKnot.GetHeadPosition(); pos!=NULL;) { KnotenBasis* pKnot=(KnotenBasis*)listKnot.GetNext(pos); CString name=pKnot->GetName(); for(int k=0; k<strlen(name);k++) { *namensliste++=name[k]; } } namensliste=char_ptr; /// int problem, int nvar_i, int popsize_i, int gener_i, float pcross_i, float pmut_r_i, float di_i, float dim_i, float* lim_r_i, int* vlen_i, float* lim_b_i, float*(*GetFitness)(void*, void*, void*, void*), /// USER EINGABE VIA DIALOG: int problem xx /// int nvar xx /// int popsize xx /// int gener xx /// float pcross xx /// float pmut xx /// float di xx /// float dim xx /// float* lim_r /// float* lim_b /// Zusätzliche Constraints int popsize; int generations; float pcross; float pmut; float di; float dim; int maxsen, minsen; int aufgabe=0; int nvar; int nfunc=0; int ncons=0; int* vlen= new int[nchrom]; float** lim_r=new float*[nchrom]; for(int i=0; i<nchrom; i++) { lim_r[i]=new float[2]; } int** lim_b=new int*[nchrom]; for(int i=0; i<nchrom; i++) { lim_b[i]=new int[2]; } propertiesforGA pfga; INT_PTR response=pfga.DoModal(); if(response==IDOK) { popsize=pfga.popsize; generations=pfga.generations; pcross=pfga.pcross; pmut=pfga.pmut; di=pfga.di; dim=pfga.dim; maxsen=pfga.maxsen; minsen=pfga.minsen; for(int i=0; i<listKnot.GetSize(); i++) { lim_r[i][0]=pfga.lim_r_min; lim_r[i][1]=pfga.lim_r_max; lim_b[i][0]=pfga.lim_b_min; lim_b[i][1]=pfga.lim_b_max; } if(pfga.wahl==0) { aufgabe=1; nvar=0; nfunc=4; ncons=nchrom+2; for(int i=0; i<nchrom; i++) { vlen[i]=32; } } } float** rel; int ** bin; rel=lim_r; bin=lim_b; typedef float* (*GetFitness)(int, int*); nsga(aufgabe, nvar, nchrom, nfunc, ncons, popsize, generations, pcross, pmut,di, dim, rel, vlen, bin, GetFitness(int, int*),namensliste); obj->ObjContainer::~ObjContainer(); delete[] vlen; delete[] lim_b; delete[] lim_r; }
In Zeile 109 möchte ich einen Function Pointer definieren; dieser Pointer soll dann beim Aufruf von nsga mitgegeben werden. NSGA ist in einer DLL ausgelagert; nach dem Aufruf von NSGA startet einen Rechnung, in deren Verlauf eben mit GetFitness die einzelnen Ergebnisse beurteilt werden; dafür holt man mit dem Pointer GetFitness aus dem ursprünglichen Prog zusätzliche Ergebnisse.
Leider krieg ich s nicht hin... egal, was ich Code, es kommen irgendwelche Compilerfehler.... habt Ihr Tipps?
-
Du deklarierst mit
typedef float* (*GetFitness)(int, int*);
einen neuen Funktionspointer-TYP.Und wo ist du Funktion DEFINIERT, welche aufgerufen werden soll?
Dein Code ist grauenvoll.
Hast du schon mal überlegt,deine mathematischen Probleme mittels MATLAB o.ä. zu lösen? Dann kannst du dich auf deine mathematischen Probleme konzentrieren und brauchst nicht versuchen, C++ zu lernen.
-
GetFitness ist eine eigenständige Funktion, die im selben File definiert ist... wenn s sein soll, kann ich s auch zu nem Member von CallOptimizer machen.
Und leider muss es C++ sein, weil die andren Sachen schon in nem C++ Prog drin sind
-
Hallo.
Nach einigem Rumprobieren hab ich s jetzt gelöst: in Zeile 109 habe ich das typedef entfernt, und da nsga in C ist, hab ich im Header den Verweis auf nsga mit "extern "C" {}" umschlossen.