Seite 1 von 2

enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 11:04 am
von SeriK00
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;
}

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 11:17 am
von Xin
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++).

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 11:33 am
von SeriK00
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")

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 12:06 pm
von Xin
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.

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 12:27 pm
von fat-lobyte
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.

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 1:55 pm
von SeriK00
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;

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 1:58 pm
von Dirty Oerti
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.

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 2:15 pm
von SeriK00
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);

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 2:24 pm
von Dirty Oerti
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));

Re: enum in struct-->in switch abfragen

Verfasst: Do Jun 04, 2009 2:40 pm
von SeriK00
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));