Problem mit Enum
-
Sunday schrieb:
der code ist nicht dein ernst oder?
Danke für die Antwort, aber hilfreicher wäre, wenn Du zumindest andeutungsweise erklären könntest warum Ernst oder nicht!
Gruß
Leo
-
Langversion: Es ist etwas sinnlos, die Liste erst aufsteigend zu sortieren und dann die Reihenfolge umzukehren. Besser wäre es, gleich absteigend zu sortieren:
if(bAufsteigend) sort(gvProjekt.begin(), gvProjekt.end()); else sort(gvProjekt.begin(), gvProjekt.end(),greater<...>);Außerdem ist es sort() egal, was für Variablen du lokal definiert hast, also macht die Zeile "Sort_Pj = iSortierfeld;" keinen wirklichen Sinn für mich. (aber das kann auch daran liegen, daß ich deinen Vergleichsoperator nicht kenne)
-
bzw.
if(bAufsteigend) sort(gvProjekt.begin(), gvProjekt.end()); else sort(gvProjekt.rbegin(), gvProjekt.rend());
-
CStoll schrieb:
(...)
Außerdem ist es sort() egal, was für Variablen du lokal definiert hast, also macht die Zeile "Sort_Pj = iSortierfeld;" keinen wirklichen Sinn für mich. (aber das kann auch daran liegen, daß ich deinen Vergleichsoperator nicht kenne)Mein Vector gvProjekt ist vom Typ struct:
struct TProjekt{ int iID_Projekt; char cProjektbezeichnung[PROJEKTBEZEICHNUNG_MAX+1]; };Daher auch die erforderliche Operatorüberladung, bevor sort() für diesen Typ sinnvoll genutzt werden kann:
bool operator<(const TProjekt& B1, const TProjekt& B2) { if(Sort_Pj == sbPj_ID) return B1.iID_Projekt < B2.iID_Projekt; else if (Sort_Pj == sbPj_Projektbezeichnung) return stricmp(B1.cProjektbezeichnung, B2.cProjektbezeichnung) < 0; else{ ShowMessage("Unzulässiger Sortierbegriff in Pj"); return false; } };Von daher kommt der Variablen Sort_Pj durchaus eine gewisse Bedeutung zu.
Gruß
Leo
-
Leo Freitag schrieb:
es ist zum Verzweifeln! Die Variable Sort_Pj vom selbstdefinierten Enum-Typ TSort_Pj verweigert die Wertzuweisung.
Das ist umso kurioser, da ich diese Technik schon in vielen Projekten erfolgreich angwendet habe.Habe die Ursache gefunden. Bei früheren Projekten ist unter Projektoptionen/ Erweiterte Compileroptionen die Datenausrichtung auf Byte eingestellt. Im aktuellen Projekt dagegen auf Quad word. Bei Einstellung von Byte funktioniert alles einwandfrei.
Auch wenn es toll ist, dass die Zuweisung zu Sort_Pj nun wie gewünscht funktioniert, würde ich doch gerne wissen, worin der Zusammenhang besteht.
Gruß Leo
-
Der Fehler liegt darin, daß Zuweisungen von int o.ä. nach enum offiziell (sprich: nach C++-Standard) nicht erlaubt sind. Da liegt es am Compiler, ob und wie er das umsetzt.
Klappt denn dein Programm, wenn du expizit castest ("Sort_Pj = TSortPj(iSortierfeld);") bzw. den Parameter iSortierfeld als TSort_Pj deklarierst?
-
Leo Freitag schrieb:
Habe die Ursache gefunden.
(...)Nein doch nicht! Leider zu früh gefreut. Da war wohl die Sehnsucht größer als der klare Blick, habe schlicht nicht richtig hingeschaut - sorry.
Das Problem, dass Sort_Pj die Zuweisung verweigert, besteht nach wie vor.Gruß
Leo
-
(eventuell) dumme Frage: Wo genau hast du Sort_Pj definiert? Und von wo aus willst du es ändern?
(damit meine ich jetzt weniger die Funktionen, sondern deren Aufteilung auf cpp/h-Dateien)Und hast du es mal mit einem expliziten Cast nach TSort_Pj versucht?
-
CStoll schrieb:
(eventuell) dumme Frage: Wo genau hast du Sort_Pj definiert? Und von wo aus willst du es ändern?
(damit meine ich jetzt weniger die Funktionen, sondern deren Aufteilung auf cpp/h-Dateien)
Und hast du es mal mit einem expliziten Cast nach TSort_Pj versucht?Hallo,
Sort_Pj deklariere ich im Kopf von Unit_DM.h, unterhalb der #define-Anweisungen
enum TSort_Pj {sbPj_ID, sbPj_Projektbezeichnung} Sort_Pj;Dann folgen die Struct-Definitionen, u.a.:
struct TProjekt{ int iID_Projekt; char cProjektbezeichnung[PROJEKTBEZEICHNUNG_MAX+1]; // (...) };und unterhalb davon die Operator-Überladung:
bool operator<(const TProjekt& B1, const TProjekt& B2) { if(Sort_Pj == sbPj_ID) return B1.iID_Projekt < B2.iID_Projekt; else if (Sort_Pj == sbPj_Projektbezeichnung) return stricmp(B1.cProjektbezeichnung, B2.cProjektbezeichnung) < 0; else{ ShowMessage("Unzulässiger Sortierbegriff in Pj"); return false; } };Die Zuweisungen zu Sort_Pj erfolgt ausschließlich in der folgenden Methode in Unit_DM.cpp:
void __fastcall TDM::sortiere_Projekt(int iSortierfeld, bool bAufsteigend) { Sort_Pj = iSortierfeld; // Sort_Pj = TSort_Pj(iSortierfeld); // funktioniert nicht // Sort_Pj = sbPj_Projektbezeichnung; // f. n. // Sort_Pj = (TSort_Pj)iSortierfeld; // f. n. // Sort_Pj = static_cast<TSort_Pj>(iSortierfeld); // f. n. sort(gvProjekt.begin(), gvProjekt.end()); if(!bAufsteigend){ reverse(gvProjekt.begin(), gvProjekt.end()); } }Gruß Leo
-
Mir würde auf Anhieb nur noch eins einfallen: ODR (One Definition Rule). Verschieb' mal die Definition von Sort_Pj in die .cpp Datei.
(PS: Hat es einen Grund, daß du der sortiere_Projekt() keinen TSort_Pj als Parameter übergibst?)