C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Probleme mit RTTI

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Hendrik Belitz
Guest





PostPosted: Thu May 06, 2004 12:36 pm    Post subject: Probleme mit RTTI Reply with quote



Hallo zusammen,

ich habe im Moment einige Probleme mit dem RTTI-Mechanismus und hoffe, ihr
könnt mir weiter helfen.

Ich benutze den dynamic_cast-Mechanismus in meinem Projekt, um konkrete
Klassen aus einer Pipeline zu extrahieren, die nur Pointer auf die
Basisklasse akzeptiert:

CTypedData<short>* anArray = dynamic_cast<CTypedData getInput()

getInput() gibt dabei einen pointer auf ein CDataSet-Objekt zurück, welches
eine Elternklasse von CTypedData ist. Im Gegensatz zu CTypedData ist
CDataSet kein Temolate. Für den obigen Fall funktioniert auch alles prima.
Ersetze ich jetzt aber den primitiven Typ durch eine Klasse:

CTypedData<CVector2D>* anArray = dynamic_cast<CTypedData
getInput()

so bekomme ich immer nur Null-Zeiger zurück.

Zudem besitzt CDataSet auch eine Memberfunktion, die den Typ der
gespeicherten Daten liefert:

virtual const std::type_info& getType() const throw();

Diese rein virtuelle Methode wird in CTypedData<> implementiert.

Fragt man nun ( typeid( CVector2D ) == anArray->getType() ) ab, so ergibt
auch dieser Test "false". Tested man aber ( typeid( CVector2D ).name() ==
anArray->getType().name() ), so liefert dies "true". Ach ja, und für
primitive Typen funktioniert der Test auch.

Weiss jemand, wie die obige Problematik zu beheben oder zu umgehen ist?

PS: Falls das wichtig sein sollte, ich verwende
gcc-3.3.3 on SuSE LInux 8.2 and SuSE 9.1
--
To get my real email adress, remove the two onkas
--
Dipl.-Inform. Hendrik Belitz
Central Institute of Electronics
Research Center Juelich

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Fri May 07, 2004 5:28 pm    Post subject: Re: Probleme mit RTTI Reply with quote



Hendrik Belitz wrote:
Quote:
CTypedData<short>* anArray = dynamic_cast<CTypedData getInput()
[...]
Ersetze ich jetzt aber den primitiven Typ durch eine Klasse:

CTypedData<CVector2D>* anArray = dynamic_cast<CTypedData getInput()

so bekomme ich immer nur Null-Zeiger zurück.

Das sollte normalerweise funktionieren.

Du hast keinen Code gepostet, also kann man nur raten. Sind
beispielsweise Namespaces im Spiel (insbesondere anonyme solche)? Sind
alle Dependencies im Makefile richtig eingestellt (es führt gelegentlich
zu seltsamen Effekten, wenn man nach einer Änderung *nicht* alles nötige
neu compiliert)?

Quote:
Weiss jemand, wie die obige Problematik zu beheben oder zu umgehen ist?

Zwecks Debugging mal den Assemblercode anschauen?


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Cersowsky
Guest





PostPosted: Sat May 08, 2004 10:11 am    Post subject: Re: Probleme mit RTTI Reply with quote



Hendrik Belitz wrote:

[...]

Quote:
Ich benutze den dynamic_cast-Mechanismus in meinem Projekt, um konkrete
Klassen aus einer Pipeline zu extrahieren, die nur Pointer auf die
Basisklasse akzeptiert:

Hallo Hendrik,

das klingt, als ob der Zeiger aus einem anderen Prozess kommt.
Mit irgendeinem gcc 3.x wurde das ABI geaendert. In den frueheren
Versionen erfolgten die Vergleiche der dynamischen Typen (typeid,
dynamic_cast, oder auch bei catch) ueber den String von type_info::name().
Das war langsam, ging aber gut. Aus Gruenden der Performance wurde dieses
Verfahren jetzt auf Zeigervergleiche reduziert. D.h. es wird bei einem
Linkervorgang eine grosse Tabelle mit einem Eintrag fuer jeden Typ erzeugt.
Ein Typ wird nun quasi ueber den Index definiert. Wenn mehrere
unanhaengige Tabellen existieren, klappt nix mehr. Der Fall tritt z.B. bei
shared libraries auf, wenn das Hauptprogramm nicht explizit abhaengig ist
(z.B. wenn man die Dinger manuell mit dlopen laden will).
Falls Du wirklich mit mehreren Prozessen arbeitest, probiere mal folgendes:
Packe die Klasse CTypedData<short> in ein .so und mache beide Programme
davon abhaengig.

Tschuess,
Steffen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Cersowsky
Guest





PostPosted: Sat May 08, 2004 12:13 pm    Post subject: Re: Probleme mit RTTI Reply with quote

Ich rede mal mit mir selbst

[...]

Quote:
das klingt, als ob der Zeiger aus einem anderen Prozess kommt.

Aehm, den Satz streiche ich besser. Das waere ja ein Zeiger fuer einen
anderen Adressraum.

Tschuess,
Steffen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hendrik Belitz
Guest





PostPosted: Mon May 10, 2004 9:52 am    Post subject: Re: Probleme mit RTTI Reply with quote

Steffen Cersowsky wrote:

Quote:
Hendrik Belitz wrote:

[...]

Ich benutze den dynamic_cast-Mechanismus in meinem Projekt, um konkrete
Klassen aus einer Pipeline zu extrahieren, die nur Pointer auf die
Basisklasse akzeptiert:

Hallo Hendrik,

das klingt, als ob der Zeiger aus einem anderen Prozess kommt.
Mit irgendeinem gcc 3.x wurde das ABI geaendert. In den frueheren
Versionen erfolgten die Vergleiche der dynamischen Typen (typeid,
dynamic_cast, oder auch bei catch) ueber den String von type_info::name().
Das war langsam, ging aber gut. Aus Gruenden der Performance wurde dieses
Verfahren jetzt auf Zeigervergleiche reduziert. D.h. es wird bei einem
Linkervorgang eine grosse Tabelle mit einem Eintrag fuer jeden Typ
erzeugt. Ein Typ wird nun quasi ueber den Index definiert. Wenn mehrere
unanhaengige Tabellen existieren, klappt nix mehr. Der Fall tritt z.B. bei
shared libraries auf, wenn das Hauptprogramm nicht explizit abhaengig ist
(z.B. wenn man die Dinger manuell mit dlopen laden will).

Ha, genau das ist der Fall. Dann ist wohl da das Problem zu suchen. Kann man
das irgendwie umgehen?

Quote:
Falls Du wirklich mit mehreren Prozessen arbeitest, probiere mal
folgendes: Packe die Klasse CTypedData<short> in ein .so und mache beide
Programme davon abhaengig.

Hmm, die Klasse befindet sich in einer dynamic library, die sowohl vom
Hauptprogramm als auch vom Plugin eingebunden wird. Das scheint also keine
Lösung zu sein.

--
To get my real email adress, remove the two onkas
--
Dipl.-Inform. Hendrik Belitz
Central Institute of Electronics
Research Center Juelich

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Cersowsky
Guest





PostPosted: Tue May 11, 2004 11:58 am    Post subject: Re: Probleme mit RTTI Reply with quote

Hendrik Belitz wrote:

[...]

Quote:
Ha, genau das ist der Fall. Dann ist wohl da das Problem zu suchen. Kann man
das irgendwie umgehen?

Hhm, da war doch was mit einem Flag bei dlopen ...
*Quelltexte rauswuehl und Google angesetzt*

http://www.gnu.org/software/gcc/faq.html#dso

Wenn das auch nicht hilft, kannst Du ja die Leute in einer gcc-
Newsgroup fragen.

Tschuess,
Steffen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.