C++ Builder 2009: Fehler in TGraphic::GetHeight()
-
Hallo zusammen,
ich habe die folgende Funktion
bool __fastcall TProcessImage::TBitmapToIplImage (IplImage *dest, const Graphics::TBitmap *src) { if (!src || !dest) return false; IplImage *temp=cvCreateImage(cvSize(src->Width, src->Height), IPL_DEPTH_8U, 3); temp->roi = NULL; try{ unsigned char *pLine; int x,y; for(y=0 ;y<src->Height;y++){ pLine = (unsigned char *)src->ScanLine[y]; for(x=0 ;x < src->Width*3 ;x++){ ((unsigned char*)(temp->imageData + temp->widthStep*y))[x] = pLine[x]; } } } catch(...){ ShowMessage("Error while converting ..."); } dest = cvCloneImage(temp); cvReleaseImage(&temp); return true; }
die ich für OpenCV benötige. Mit BDS2006 gab es keine Probleme, aber seit ich heute den C++ Builder 2009 installiert habe, bekomme ich folgende Fehlermeldung:
[BCC32 Fehler] ProcessImage.cpp(227): E2522 Nicht-konstante Funktion _fastcall TGraphic::GetHeight() für konstantes Objekt aufgerufen
Wie kann ich diesen Fehler beheben, ich bin ein wenig ratlos.
Gruss
Lodo2609
-
Hallo
Vermutlich kommt der Fehler durch den Pointer auf das konstante TBitmap, src.
In Zeile 6 fragst du dafür die Eigenschaft Height ab, was intern eine Getterfunktion GetHeight aufruft. Da du aber ein konstantes TBitmap hast, muß diese Getterfunktion als const deklariert sein, was sie aber laut Compilerfehler im C++ Builder 2009 nicht ist.Falls ich mit meiner Vermutung recht habe gibt es zwei Lösungen :
- Du nimmst bei deiner Funktionsdeklaration für src das const raus
- Du zwingst den Compiler src in der Funktion als nicht-const zu betrachten, da du genau weißt das du nur Lesen willst.IplImage *temp=cvCreateImage(cvSize(src->Width, const_cast<Graphics::TBitmap*>(src)->Height), IPL_DEPTH_8U, 3);
Das wären natürlich nur Umgehungen von einem seltsamen Verhalten, das so eigentlich nicht auftreten sollte.
bis bald
akari
-
Danke das klappt
Gruss
Lodo2609
-
akari schrieb:
Das wären natürlich nur Umgehungen von einem seltsamen Verhalten, das so eigentlich nicht auftreten sollte.
Nicht so unbedingt. Im Gegensatz zu C++ spielt das Schlüsselwort const in Delphi eine sehr untergeordnete Rolle; gewöhnlich benutzt man dort keine konstanten Objektreferenzen, und es gibt auch keine Syntax, um eine Methode als "const" zu deklarieren. Daher ist es unüblich, Delphi-Klassen per const-Zeiger zu übergeben, da es zu Problemen dieser Art führt. (Daß das vorher funktionierte, liegt wahrscheinlich daran, daß der BCC in der Version 6.1 deutlich standardkonformer geworden ist.)
-
Hallo,
der Builder 2006 und Builder 2007 dürften das auch nicht so einfach compiliert haben. Wahrscheinlich gab es Warnungen. Aber es war seit Jahren bekannt, dass dieses irgendwann nicht mehr funktionieren würde, weil es ein klarer Fehler ist.
Ich kann für ein konstantes Objekt nur noch mit const spezifizierte Funktionen aufrufen, und während der Übersetzung wird geprüft, ob dieses eingehalten wird.
Da es sich bei Height um eine Property handelt, über die auch die Höhe gesetzt werden kann, wird der Fehler ausgelöst. Wie man das umgehen kann, wurde ja schon geschrieben. Aber es ist kein Fehler im Werkzeug C++, sondern in der Nutzung.
Schöne Grüße
Volker