enum in struct-->in switch abfragen

Schnelle objektorientierte, kompilierende Programmiersprache.
SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

enum in struct-->in switch abfragen

Beitrag von SeriK00 » Do Jun 04, 2009 11:04 am

Ich habe noch eine Frage:
ich habe eine struct, wo vielle Variablen und enums definiert sind (hier nur eine enum).
Also die enum AUSWAHL wird in der struct abgebildet.

JEtzt habe ich einen pointer auf die Struktur definiert und will in der switch-Anweisung (pointer->farbe) auf einen Wert in enum abfragen.
Wie geht es. Wie kann ich dem pointer->farbe einen bestimmten Wert zuweisen? Bei so einer Konstruktion?
Vielen Dank im Voraus.

Code: Alles auswählen

#include <stdio.h>

typedef enum
{
	blau,
	schwarz,
	gelb,
}AUSWAHL;

struct AUSWAHL
{
	AUSWAHL farbe;
};
struct AUSWAHL *pointer;

int main (void)
{
	switch(pointer->farbe)
	{
	case blau:
		puts("\nblau");
		break;
	case schwarz:
		puts("\nschwarz");
		break;
	case gelb:
		puts("\ngelb");
		break;
	default:
		puts("\ntest!");
	}
	return 0;
}
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: enum in struct-->in switch abfragen

Beitrag von Xin » Do Jun 04, 2009 11:17 am

SeriK00 hat geschrieben:Wie kann ich dem pointer->farbe einen bestimmten Wert zuweisen? Bei so einer Konstruktion?
An beliebiger Stelle:

Code: Alles auswählen

pointer->farbe = blau;
einfügen.

Aber Du musst zuvor den Pointer belegen, Für die Struktur muss also erst Speicher alloziiert werden (malloc in C, new in C++).
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

Re: enum in struct-->in switch abfragen

Beitrag von SeriK00 » Do Jun 04, 2009 11:33 am

Vielen Dank für diene Antwort.

Wie geht das?
Ich hab mir das so vorgestellt, klappt aber nicht.


Code: Alles auswählen

struct AUSWAHL
{
	AUSWAHL farbe;
};
struct AUSWAHL *pointer;

pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));

int main (void)
{
	pointer->farbe= blau;

	switch(pointer->farbe)
	{
	case blau:
		puts("\nblau")
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: enum in struct-->in switch abfragen

Beitrag von Xin » Do Jun 04, 2009 12:06 pm

SeriK00 hat geschrieben:Vielen Dank für diene Antwort.

Wie geht das?
Ich hab mir das so vorgestellt, klappt aber nicht.
Du hast zwei unterschiedliche Datentypen AUSWAHL, nehme ich an.
Eine struct AUSWAHL kann nicht Member einer struct AUSWAHL sein, da der Member ja ebenfalls eine struct AUSWAHL enthalten würde, welche ebenfalls... usw.

Ansonsten heißt "klappt aber nicht" für mich raten.
Also bitte die Meldung des Compilers mitgeben, die Du nicht verstehst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: enum in struct-->in switch abfragen

Beitrag von fat-lobyte » Do Jun 04, 2009 12:27 pm

SeriK00 hat geschrieben:Vielen Dank für diene Antwort.

Wie geht das?
Ich hab mir das so vorgestellt, klappt aber nicht.


Code: Alles auswählen

struct AUSWAHL
{
	AUSWAHL farbe;
};
struct AUSWAHL *pointer;

pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));

int main (void)
{
	pointer->farbe= blau;

	switch(pointer->farbe)
	{
	case blau:
		puts("\nblau")
Diese Zeile ist eine Anweisung:

Code: Alles auswählen

pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));
Anweisungen können nur in einem Funktionskörper stehen, nicht allerdings "mitten im Nirgendwo". Setz die Anweisung in die main() Funktion rein, dann klappts vielleicht. Aber dazu bräuchten wir halt die Compilermeldung... Übrigens, wenn du den Zeiger "pointer" ebenfalls außerhalb einer Funktion deklarierst, ist er statisch und Global. Ich bezweifle stark dass das deine absicht war, also den auch bitte in eine Funktion rein.
Haters gonna hate, potatoes gonna potate.

SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

Re: enum in struct-->in switch abfragen

Beitrag von SeriK00 » Do Jun 04, 2009 1:55 pm

Vielen Dank für eure Beträge.

Nachdem ich die Anweisung und pointer-Deklaration in die main() Funktion reingesetzt habe, funktioniert alles.

Allerdings bekomme ich eine Warnung:
assignment from incompatible pointer type
an der Stelle: pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));

Wenn wir schon dabei sind:
Bei der #include <stdio.h>
steht ein Fragezeichen: unresolved inclusion.
Woran kann das liegen?

Habe ich das richtig verstanden:
Ich habe einen Pointer von Typ stuct GESAMT deklariert.
Damit ich aber dem Pointer Werte zuweisen kann, muss ich Speicherplatz anfordern, sonst weiß der compiler nich vonhin mit dem Wert.
pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));
Damit weise ich dem pointer Speicherplatz von der Größe AUSWAHL, also 4 Byte, zu.

Code: Alles auswählen

#include <stdio.h>
#include <malloc.h>

typedef enum
{
	blau,
	schwarz,
	gelb,
}AUSWAHL;

struct GESAMT
{
	AUSWAHL farbe;
};


int main (void)
{
	struct GESAMT *pointer;
	pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));
	printf("\n%d", sizeof(AUSWAHL));
	pointer->farbe= schwarz;
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: enum in struct-->in switch abfragen

Beitrag von Dirty Oerti » Do Jun 04, 2009 1:58 pm

Allerdings bekomme ich eine Warnung:
assignment from incompatible pointer type
an der Stelle: pointer = (AUSWAHL *)malloc(sizeof(AUSWAHL));
Ist klar. Dein pointer hat den Typ GESAMT* und du versuchst ihm den Typ AUSWAHL* aufzudrücken.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

Re: enum in struct-->in switch abfragen

Beitrag von SeriK00 » Do Jun 04, 2009 2:15 pm

Also wäre so richtig?

pointer = malloc(sizeof(AUSWAHL)); //dem pointer von TYP GESAMT, die Größe des enum Auswahl zuweisen

Das vestehe ich aber noch nicht ganz, wenn ich jetzt. einen neuen enum definiere und diesen in struct hinzufügen, dann muss ich doch auch für diesen Speicherplatz anfordern:
pointer = malloc(sizeof(NOTEN));

Aber das funktioniert auch ohne diese Anweisung, warum?

Code: Alles auswählen

typedef enum
{
	blau,
	schwarz,
	gelb,
}AUSWAHL;

typedef enum
{
	eins,
	zwei,
	drei,
	vier,
}NOTEN;

struct GESAMT
{
	AUSWAHL farbe;
	NOTEN bewertung;
};


int main (void)
{
	struct GESAMT *pointer;
	pointer = malloc(sizeof(AUSWAHL));   
	printf("\n%d", sizeof(AUSWAHL));
	pointer->farbe= schwarz;

	//pointer = malloc(sizeof(NOTEN));
	pointer->bewertung = zwei;
	printf("\n%d", pointer->bewertung);
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: enum in struct-->in switch abfragen

Beitrag von Dirty Oerti » Do Jun 04, 2009 2:24 pm

Aber das funktioniert auch ohne diese Anweisung, warum?
Nein, das wird nicht funktionieren. Irgendwann gibt es einen Segmentation Fault und die Sache hat sich...

Also:

Du hast deinen Structtyp GESAMT (ist ja erstmal egal, was da drinn ist).
Wenn du jetzt ein Struct von diesem Typ haben willst, dann brauchst du soviel Speicher, wie das Struct GESAMT groß ist.

Heißt: Dein Zeiger muss auf einen Bereich zeigen, der so groß ist, dass ein Struct GESAMT darin Platz hat.

Code: Alles auswählen

pointer = (GESAMT*) malloc (sizeof(GESAMT));
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

Re: enum in struct-->in switch abfragen

Beitrag von SeriK00 » Do Jun 04, 2009 2:40 pm

Aha, danke da verstehe ich. Klingt einleuchtend.

Aber ich bekomme dabei folgende Fehlermeldung:
../bumer.c:30: error: `GESAMT' undeclared (first use in this function)
../bumer.c:30: error: (Each undeclared identifier is reported only once
../bumer.c:30: error: for each function it appears in.)
../bumer.c:30: error: parse error before ')' token

Code: Alles auswählen

int main (void)
{
	struct GESAMT *pointer;
	pointer = (GESAMT *)malloc (sizeof(GESAMT));
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Antworten