| Autor |
Nachricht |
HändyÄndy
Unregistrierter
|
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
|
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
|
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
|
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
|
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. |
|
|
|
 |
EOutOfResources
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.12.2010
Beiträge: 1550
|
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
|
pumuckl Moderator
15:25:41 22.06.2011 Titel: |
|
Zitieren |
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5899
|
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 |
|
 |
|
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.
|
|
|
|
|