Probleme bei Funktionsaufruf
-
Hallo Leute,
ich seh mich gezwungen eins meiner alten Programme in VS2005 zu portieren. Dabei stoße ich allerdings auf ein größeres Hindernis, weil es von VS2003 zu VS2005 einige gravierende Änderungen gegeben hat.
Ich will eine Funktion aufrufen, welche wie folgt definiert ist:
int dlevmar_dif(void(*)(double*, double*,int,int,void) func, double* p, double* x, int m, int n, ...){}
Als ersten Parameter muss ich folgende Funktion übergeben:
void fitfct(double* p, double* x, int m, int n, void* data){}
In VS2003 habe ich es jetzt wie folgt gemacht:
int iterations = dlevmar_dif(&fitfct,....);
Der gleiche Aufruf in VS2005 liefert mir
error C2102: '&' requires l-valueKann mir jemand erklären, wie der Aufruf in VS2005 richtig ist?
Gruß
physici
-
Kannst Du mal ein "vollständiges, simples" Beispiel posten?
-
Kann ich leider nicht :-(, da die Funktion dlevmar_dif Teil einer externen Bibliothek ist (http://www.ics.forth.gr/~lourakis/levmar/index.html).
Habe aber inzwischen eine Lösung gefunden, wie es geht. Ich definiere meine Funktion fitfct als static:static void fitfct(double* p, double* x, int m, int n, void* data){}
Dann funktioniert auch der Aufruf, wie ich ihn in VS2003 verwendet habe, wieder.
Kannst du mir mal kurz erklären, was der Begriff "static" so bedeutsames ändert (fitfct ist Teil einer Klasse)?
-
Dass kann mit VS2003 auch nicht funktioniert haben...
static heisst nur, dass es keine Instanz der Klasse benötigt (und auch keine hat! Du kannst also auf keine Instanz-Variablen zugreifen)
-
Jochen Kalmbach schrieb:
Dass kann mit VS2003 auch nicht funktioniert haben...
static heisst nur, dass es keine Instanz der Klasse benötigt (und auch keine hat! Du kannst also auf keine Instanz-Variablen zugreifen)Können kann es schon, wobei es zu undefinierten Verhalten führen kann (und eigentlich würde ich hier Warnungen oder noch besser einen Fehler erwarten). Ich habe schon Code gesehen der eben so geschrieben war und lief. Keine Ahnung was der Compiler daraus gemacht hat, aber es funktionierte wohl nur weil es eine verkappte statische Methode war, wo nur das static fehlte
Besonders schönes Exemplar solcher Konstrukte:
class A { void foo() {} }; int main() { A* pA; pA->foo(); return 0; }
Ich habe hier lange diskutieren müssen warum sowas nicht sein darf, aber habe dann genervt aufgegeben (und irgendwann als ich ungestört Zugriff auf den Gesamtcode hatte hinterrücks auf static abgeändert).
Obiges würde auf zumindestens einen Compiler mit dem ich immer noch arbeite anstandslos linken und laufen (auch wenn ich für letzteres nicht die Garantie übernehmen möchte).
cu André
-
Jochen Kalmbach schrieb:
Dass kann mit VS2003 auch nicht funktioniert haben...
static heisst nur, dass es keine Instanz der Klasse benötigt (und auch keine hat! Du kannst also auf keine Instanz-Variablen zugreifen)In VS2003 habe ich das static nicht benutzen müssen, da klappte es auch so.
Nach deiner Erklärung kann ich mir jetzt auch erklären, warum ich eine beliebige mit static deklarierte Memberfunktion auch ohne eine Instanz der Klasse aufrufen kann (z. B. Aufruf durch MeineKlasse::MeineFunktion())
Wieder was gelernt. Jetzt muss ich nur noch das Linker-Problem lösen. Die erwähnte externe Bibliothek ist nämlich nicht mit /clr erstellt und jetzt bekomm ich eine Fehlermeldung betreffs der Verwendung von /clr:pure. Muss wohl die Bibliothek neu schreiben
@asc
Kannst du mir mal kurz erklären, warum dass sein gehen darf? Mit den Pointern habe ich leider immer noch meine liebe Not.