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.


Anmelden zum Antworten