enums aus File lesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

enums aus File lesen

Beitrag von nufan » Sa Apr 18, 2009 5:10 pm

Tag :)
Ich wollte versuchen ein SDL-enum aus einer Datei mit fscanf auszulesen. Aber irgendwie weigert sich der Compiler das zu akzeptieren.
Diese Struktur hab ich selbst angelegt:

Code: Alles auswählen

typedef struct
{
  SDLKey up;
  SDLKey right;
  SDLKey down;
  SDLKey left;
} keys;
SDLKey sind jene enums, die in SDL_keysym.h definiert sind. Das sieht so aus:

Code: Alles auswählen

typedef enum {
	/* The keyboard syms have been cleverly chosen to map to ASCII */
	SDLK_UNKNOWN		= 0,
	SDLK_FIRST		= 0,
	SDLK_BACKSPACE		= 8,
	SDLK_TAB		= 9,
        [...]
	SDLK_POWER		= 320,		/* Power Macintosh power key */
	SDLK_EURO		= 321,		/* Some european keyboards */
	SDLK_UNDO		= 322,		/* Atari keyboard has Undo */

	/* Add any other keys here */

	SDLK_LAST
} SDLKey;
Wie man sieht hat also jedes enum einen Integerwert (bis auf SDLK_LAST, was ich aber nicht verwende). Ich schreibe in die Datei mit:

Code: Alles auswählen

      fprintf (config, "UP: %d\nRIGHT: %d\nDOWN: %d\nLEFT: %d", 
               k -> up, k -> right, k -> down, k -> left);       
Das funktioniert ohne Probleme mit %d.
Bei

Code: Alles auswählen

    fscanf (config, "UP: %d\nRIGHT: %d\nDOWN: %d\nLEFT: %d", 
            &k -> up, &k -> right, &k -> down, &k -> left);
meckert der Compiler:

Code: Alles auswählen

EatTheBlocks.c: In Funktion »load_config«:
EatTheBlocks.c:270: Warnung: format »%d« erwartet Typ »int *«, aber Argument 3 hat Typ »enum SDLKey *«
EatTheBlocks.c:270: Warnung: format »%d« erwartet Typ »int *«, aber Argument 4 hat Typ »enum SDLKey *«
EatTheBlocks.c:270: Warnung: format »%d« erwartet Typ »int *«, aber Argument 5 hat Typ »enum SDLKey *«
EatTheBlocks.c:270: Warnung: format »%d« erwartet Typ »int *«, aber Argument 6 hat Typ »enum SDLKey *«
Zeile 270 ist natürlich die zweite Zeile von fscanf. Aber warum funktioniert bei fprintf alles, aber bei fscanf nicht? Ich weiß, dass fscanf genauso wie scanf böse ist, aber muss ich deswegen gleich eine eigene Funktion schreiben, die mir aus dem File die Werte ausliest und nach int konvertiert?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: enums aus File lesen

Beitrag von cloidnerux » Sa Apr 18, 2009 5:17 pm

Ich glaube der Compiler hat bei k->up die Addresse von up gespeichert, halt als Integer.
Jezt beim Auslesen funktioniert das nicht mehr, weil der Compiler ja nciht einen pointer in ein SDL-KEY konvertieren kann.
Außerdem, wieso willst du ein enum in eine Datei speichern?
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: enums aus File lesen

Beitrag von nufan » Sa Apr 18, 2009 5:20 pm

cloidnerux hat geschrieben:Ich glaube der Compiler hat bei k->up die Addresse von up gespeichert, halt als Integer.
Wo? Im fprintf? Nein, dort werden die richtigen Werte ins File geschrieben.
cloidnerux hat geschrieben:Außerdem, wieso willst du ein enum in eine Datei speichern?
Ich wollte (wie man an den Variablennamen erkennen kann) die Steuerung in die Datei schreiben. Und man soll die Steuerung ändern können, dann müsste ich für jede Taste ein int festlegen...
Deswegen wollte ich gleich die enums von SDLKey verwenden.

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

Re: enums aus File lesen

Beitrag von Xin » Sa Apr 18, 2009 5:36 pm

Enums sind halbe ints.
Gespeichert wird alles in ints, aber es sind keine wirklichen ints.
Du musst also die Adressen vom Typ (SDL_KEY *) zuvor auf (int *) casten: static_cast< int * )( & k->up ) in C++, bzw. in C (int *)&k->up.

Wir wissen ja beide, dass fscanf eine böse Funktion ist...
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.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: enums aus File lesen

Beitrag von nufan » Sa Apr 18, 2009 5:41 pm

Xin hat geschrieben:Enums sind halbe ints.
Gespeichert wird alles in ints, aber es sind keine wirklichen ints.
Du musst also die Adressen vom Typ (SDL_KEY *) zuvor auf (int *) casten: static_cast< int * )( & k->up ) in C++, bzw. in C (int *)&k->up.
Danke, jetzt kommt keine Warnung mehr :)
Xin hat geschrieben:Wir wissen ja beide, dass fscanf eine böse Funktion ist...
Das Problem ist, dass der Benutzer direkten Zugriff auf die Datei hat. Schreibt er da Blödsinn rein, kommen wieder die guten alten scanf-Probleme...
Also werde ich wohl doch noch eine Funktion schreiben. Aber für den Moment arbeite nur ich dran, also tut's fscanf auch.

Antworten