komplexes Problem mit Funktionszeigern

18/05/2009 - 16:47 von M. Mertens | Report spam
Hallo,

mein Problem ist etwas komplexer, ich versuche es mal zu schildern.

Es gibt eine Basisanwendung und vom Benutzer programmierte DLL's (oder
so's), die auf der Basisanwendung aufsetzen. Das Ganze ist in C erstellt
und bildet die OO gut nach.

Das Problem ist folgendes: Ein Benutzer kann sich in der Anwendungs-DLL
Klassen definieren (structs mit den entsprechenden Elementen), dazu auch
get- und set-Zugriffsmethoden für Variablen. Die Basisanwendung geht
nun, wenn auf eine Variable zugegriffen werden soll, hin und schaut, ob
es einen get-Accessor gibt. Gibt es ihn nicht, wird direct der Wert
(struct->wert) ausgegeben, gibt es ihn, wird er aufgerufen:

<Originalcode>
pvalue=((OV_FNCPTR_GETPV(VARTYPE))pelem->elemunion.pvar->v_getfnc)(pobj)
</Originalcode>

OV_FNCPTR_GETPV(VARTYPE) ist ein Makro, das auf den richtigen
Rückgabetyp castet.

Das Ganze làuft eigentlich prima, bis auf den Fall, dass

a) der Rückgabe-Typ der get-Funktion mehr als nur ein elementarer
Datentyp ist, z.B. ein Zeit-Strukt oder àhnliches

UND GLEICHZEITIG (man höre und staune)

b) Basisanwendung und aufsetzende DLL nicht mit dem gleichen Compiler
erstellt sind (wir haben hier einen àlteren Visual C und einen Borland
im Einsatz).

In allen anderen Fàllen làuft der Zugriff problemlos, also auch für
Structs, wenn der Compiler derselbe ist.

Das Symptom ist Folgendes: Im Fehlerfall (siehe a) und b)) stimmt pobj
(der Zeiger auf das Objekt-Struct) in der aufgerufenen Methode
(v_getfnc) nicht mehr! Ich habe festgestellt, dass in diesem Fall das
"richtige" pobj in Wirklichkeit "eins weiter" liegt, also bei *(&pobj+1).

Habt Ihr eine Idee, woran das liegen könnte? Verlàsst die Verwendung von
structs als Rückgabe-Datentypen von Methoden bei der Verwendung mit
Methoden-Pointern die Spezifikation? Ist es ein Compiler-Bug? Habt Ihr
eine Idee, wie man das Ganze mit Minimalaufwand beheben könnte? Das
Problem ist, dass wir natürlich bei der Rückgabe von reinen Structs auf
Struct-Pointer wechseln könnten, aber dies hàtte erhebliche Umstellungen
- auch in den bisherigen Benutzer-Bibliotheken - zu Folge.

Ich hoffe, ich konnte das Problem einigermaßen beschreiben und danke für
die Aufmerksamkeit.

Gruß,
Martin
 

Lesen sie die antworten

#1 M. Mertens
18/05/2009 - 16:50 | Warnen spam
Habt Ihr eine Idee, wie man das Ganze mit Minimalaufwand beheben könnte?



Ich sollte noch hinzufügen, dass wir uns leider nicht auf die Verwendung
eines Compilers beschrànken können (wàre natürlich die einfachste Lösung).

Ähnliche fragen