PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] enums machen was sie wollen?


WhiteVelvet
2006-07-28, 10:36:34
Also jetzt gehts hier los glaub ich. Ich habe zwei enums in meinem Programm:

enum PMD_STATE
{
CONNECTED,
PENDING,
DISCONNECTED
};

enum PMD_INPUTMODE
{
CAMMODE,
IMAGEMODE
};

In OnInitDialog werden beide auf DISCONNECTED und CAMMODE initialisiert. Eine Zeile weiter springt PMD_STATE plötzlich auf CONNECTED. Später im Programm hat er den Wert PENDING, obwohl diese Zuweisung nur einmal im Programm steht und garantiert nicht durchlaufen wird. Der zweite enum ignoriert im Laufe des Programms einfach Zuweisungen. Die machen was sie wollen. Soll ich nicht doch besser bool oder char nehmen? Was läuft hier?

Gast
2006-07-28, 11:01:35
An enum liegt es nicht. Sondern an deinem Code.

WhiteVelvet
2006-07-28, 11:08:36
Es liegt nicht an meinem Code sondern an mir ;)

Ich hab einfach mal ein komplettes Rebuild gemacht und danach hat sich der Speicher wohl aufgeräumt. Ne, dann lags am Speicher ;)

zeckensack
2006-07-29, 02:37:08
WhiteVelvet[/POST]']Es liegt nicht an meinem Code sondern an mir ;)

Ich hab einfach mal ein komplettes Rebuild gemacht und danach hat sich der Speicher wohl aufgeräumt. Ne, dann lags am Speicher ;)Nein, daran lag es auch nicht. Es liegt daran dass irgendein Stück deines Programms mit irgendeinem Zeiger (der nicht korrekt initialisiert ist) irgendwelchen Speicher überschreibt. Deine zwei Problem-enums wurden zuerst getroffen. Durch den Rebuild wurde das Problem aber nun keineswegs gelöst sondern irgendwo anders hin verschoben.

Coda
2006-07-29, 12:32:55
Mach mal im Compiler alle Laufzeit-Überprüfungen an.

"Basic Runtime Checks" auf "Both (/RTC1, equiv. to /RTCsu)"
"Buffer Security Check" auf "Yes"

beides unter "C/C++"/"Code Generation"

WhiteVelvet
2006-07-29, 14:18:22
Steht schon auf diesen Werten. Die Frage ist, sollte man enums überhaupt verwenden, und wenn ja, wie verwendet man sie "sicher". Jetzt wo ich wieder chars benutze, läuft es zwar sicherer, aber etwas unleserlich. Naja, in die Comments muss ich dann eben immer die Legende reinsetzen.

Coda
2006-07-29, 14:50:13
Ich widerhole Zecke: Du hast das Problem bloß verschoben. Ein enum springt nicht von Geisterhand um, du must irgendwo unkontrolliert im Speicher rumschreiben.

Gast
2006-07-29, 16:09:16
Oder sein Speicher ist kaputt?

Coda
2006-07-29, 16:18:04
Sehr unwahrscheinlich.

Jesus
2006-07-29, 16:28:13
Vielleicht benutzt du enum namen die bereits benutzt werden (als defines, andere enums usw) und die dan irgendwo anders geändert werden? Hast du irgendwelche warnings?

ShadowXX
2006-07-29, 16:47:16
Jesus[/POST]']Vielleicht benutzt du enum namen die bereits benutzt werden (als defines, andere enums usw) und die dan irgendwo anders geändert werden? Hast du irgendwelche warnings?
In dem Fall hast du aber meistens mehr als nur Warnings.

Was mich viel mehr interessiert ist: Wofür benutzt du eigentlich die Enums, wenn du stattdessen jetzt chars benutzt??
(Dann kommt man vielleicht auch dahinter, warum er bei dir so abgedreht ist).

Gast
2006-07-30, 00:35:43
ShadowXX[/POST]']In dem Fall hast du aber meistens mehr als nur Warnings.

Was mich viel mehr interessiert ist: Wofür benutzt du eigentlich die Enums, wenn du stattdessen jetzt chars benutzt??
(Dann kommt man vielleicht auch dahinter, warum er bei dir so abgedreht ist).ich versuche mal es zu erraten:
da gibt es irgendein Ding das sich "PMD" nennt. Das könnte z.B. irgendein Objekt in seinem Programm sein, oder ein externes Gerät, das von dem Programm gesteuert wird.
Dieses PMD (was immer das sein mag) hat offenbar einen Zustand, der eben connected, disconnected oder pending sein kann, und einen Inputmode (Cam-Mode oder Image-Mode).
Vielleicht handelt sich ja um eine Digicam, der Zustand gibt an ob die angestöpselt/eingeschaltet ist, und der Inputmode sagt, ob die Standbilder oder Videos sendet.

Ist natürlich nur geraten, vielleicht ist dieses "PMD" auch was völlig anderes.

Für die Realsierung mit bool und char würde ich darauf tippen, daß der Inputmode durch Strings beschrieben wird (CAMMODE -> "Cam-Mode", IMAGEMODE -> "Image-Mode"), und der Zustand durch ein bool-Paar (CONNECTED -> (true, false), DISCONNECTED -> (false, false), PENDING (false, true)).

WhiteVelvet
2006-07-30, 12:44:37
Ja, geht schon in die richtige Richtung. Mein enum "m_ePMDState" speichert einfach nur den aktuellen Zustand der Kamera, ob das mit char oder einem enum gemacht wird, ist egal. Das ist nur eine Frage der Leserlichkeit. Warning habe ich keine, es funktioniert jetzt auch alles. Was ich in meiner Software noch nicht gemacht habe, ist auf die Löschung und Freigabe von Objekten einzugehen, das mache ich erst am Schluss, wenn die Software fertig ist. Spätestens wird es keine Gefahr mehr geben, dass sich wieder Variablen umschreiben (was aber auch ein Zeichen für einen schlechten Compiler ist, wenn der das nicht merkt).