Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Casten     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
HändyÄndy
Unregistrierter




Beitrag HändyÄndy Unregistrierter 14:34:08 22.06.2011   Titel:   Casten            Zitieren

Ich habe folgenden Code
C++:
SmartPtr<TNLP> mynlp = new KRR_IPOpt( a, K, Ytrain, lambda );
...
status = app->OptimizeTNLP( mynlp );
...
for( int i = 0; i < a.n_rows; ++i )
    a(i,0) = (*mynlp).a(i,0);


KRR_IPOpt sieht so aus (Auszug aus dem Header):
C++:
...
class KRR_IPOpt : public TNLP
{
    public:
    mat K;
    vec a;
...


Wenn ich jetzt kompiliere erhalte ich folgende Fehlermeldung, die ja auch Sinn macht.
Zitat:
KRR.cpp: In member function ‘void KRR::runOptimization()’:
KRR.cpp:92:21: error: ‘class Ipopt::TNLP’ has no member named ‘a’
make: *** [KRR.o] Error 1


Wie komme ich durch korrektes casten an die eigentliche Variable ran?
EOutOfResources
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.12.2010
Beiträge: 1550
Beitrag EOutOfResources Mitglied 14:38:23 22.06.2011   Titel:              Zitieren

Es sieht alles etwas kyptisch aus aber wenn ich dich richtig verstanden habe dann so:
C++:
dynamic_cast<KRR_IPOpt*>(mynlp);

_________________
C++ - where friends can touch your privates, but your family can't.
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5741
Beitrag asc Mitglied 14:40:40 22.06.2011   Titel:              Zitieren

EOutOfResources schrieb:
Es sieht alles etwas kyptisch aus aber wenn ich dich richtig verstanden habe dann so:
C++:
dynamic_cast<KRR_IPOpt*>(mynlp);


Vermutlich eher (je nach dem wie es bei dieser Smartpointerklasse heißt:

C++:
dynamic_cast<KRR_IPOpt*>(mynlp.get());

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5899
Beitrag camper Mitglied 14:44:54 22.06.2011   Titel:              Zitieren

asc schrieb:
EOutOfResources schrieb:
Es sieht alles etwas kyptisch aus aber wenn ich dich richtig verstanden habe dann so:
C++:
dynamic_cast<KRR_IPOpt*>(mynlp);


Vermutlich eher (je nach dem wie es bei dieser Smartpointerklasse heißt:

C++:
dynamic_cast<KRR_IPOpt*>(mynlp.get());
Besser noch: gar nicht erst Typinformationen verlieren (unter der Annahme, dass der Smartpointer etwas taugt und automatische Konvertierungen in SmartPointer auf Basisklassen zulässt).
C++:
SmartPtr<KRR_IPOpt> mynlp = new KRR_IPOpt( a, K, Ytrain, lambda );
...
status = app->OptimizeTNLP( mynlp );
...
for( int i = 0; i < a.n_rows; ++i )
    a(i,0) = (*mynlp).a(i,0);


Zuletzt bearbeitet von camper am 14:46:18 22.06.2011, insgesamt 1-mal bearbeitet
HändyÄndy
Unregistrierter




Beitrag HändyÄndy Unregistrierter 15:02:53 22.06.2011   Titel:              Zitieren

Was camper vorgeschlagen hat, hatte ich auch schon probiert, dann erhalte ich allerdings eine andere Fehlermeldung:
Zitat:
KRR.cpp:84:36: error: no matching function for call to ‘Ipopt::IpoptApplication::OptimizeTNLP(Ipopt::SmartPtr<KRR_IPOpt>&)’
/homes/numerik/lib/Ipopt/include/coin/IpIpoptApplication.hpp:79:37: note: candidate is: virtual Ipopt::ApplicationReturnStatus Ipopt::IpoptApplication::OptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP>&)
make: *** [KRR.o] Error 1


Trotzdem vielen Dank für die Hinweise von Euch. Im Header von SmartPtr habe ich nämlich die Methode GetRawPtr() gefunden und meinen Code entsprechend geändert:
Code:
a(i,0) = dynamic_cast<KRR_IPOpt*>( GetRawPtr(mynlp) )->a(i,0);


Jetzt funktionierts. :live:
EOutOfResources
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.12.2010
Beiträge: 1550
Beitrag EOutOfResources Mitglied 15:04:12 22.06.2011   Titel:              Zitieren

Seltsamer Smartpointer... Wer hat den gemacht?

_________________
C++ - where friends can touch your privates, but your family can't.
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 15:25:41 22.06.2011   Titel:              Zitieren

Das Problem ist das übliche bei Smartpointern und Ableitungen vom Zieltyp: ein smartpointer<Derived*> lässt sich nicht so einfach automatisch in einen Smartpointer<Base*> umwandeln.

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5899
Beitrag camper Mitglied 15:58:42 22.06.2011   Titel:              Zitieren

pumuckl schrieb:
Das Problem ist das übliche bei Smartpointern und Ableitungen vom Zieltyp: ein smartpointer<Derived*> lässt sich nicht so einfach automatisch in einen Smartpointer<Base*> umwandeln.
Ich habe es bisher für üblich gehalten, dass ein smartpointer diese Konvertierung anbietet. Ist ja auch so gut wie immer sehr simpel zu implementieren.
auto_ptr hat diesbzgl. ein Problem, weil es mit den nötigen Tricks kollidiert, die die Movesemantik zu implementieren; aber einen "normalen" Smartpointer trifft diese Problematik nicht.
Im konkreten Falle würde ich es allerdings noch etwas anders machen:
C++:
KRR_IPOpt* mynlp = new KRR_IPOpt( a, K, Ytrain, lambda );
SmartPtr<TNLP> mynlp_smart = mylnp;
...
status = app->OptimizeTNLP( mynlp_smart );
...
for( int i = 0; i < a.n_rows; ++i )
    a(i,0) = (*mynlp).a(i,0);
Zumindest sollte es ein static_cast sein. dynamic_casts sind langsam und in diesem Falle logisch fragwürdig. Wir wissen in diesem Falle ja, dass es sich um ein KRR_IPOpt-Objekt handelt.

Ansonsten empfehle ich noch einen Bug-Report an Ipop - habe mir mal kurz die Quellen angeschaut: sieht nicht so aus, als ob Konvertierungen zu irgenwelchen Schwierigkeiten führen würden.
Edit: SmartPtr ist offenbar ein intrusive pointer, also get auch so etwas:
C++:
SmartPtr<KRR_IPOpt> mynlp = new KRR_IPOpt( a, K, Ytrain, lambda );
SmartPtr<TNLP> mynlp_ = GetRawPointer( mynlp );
...
status = app->OptimizeTNLP( mynlp_ );
...
for( int i = 0; i < a.n_rows; ++i )
    a(i,0) = (*mynlp).a(i,0);
Wobei ich das für schlechten Stil halte. Der Sinn von intrusive Pointer liegt eigentlich nicht darin, dass man nach Belieben nackte und SMartpointer mischen kann.


Zuletzt bearbeitet von camper am 16:29:40 22.06.2011, insgesamt 2-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  Casten   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.