Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

1

11.10.2009, 00:16

Problem beim Einbinden von mehreren Dateien

Hi Leute,

ich habe ein kleines Problem, und zwar binde ich in mein Projekt die windows.h und die allegro.h ein. In beiden wird zufälligerweise eine Struktur mit dem Namen "BITMAP" definiert. Da man sie ja nur einmal definieren kann, tritt folgender Fehler auf:

Quellcode

1
2
3
1>c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(567) : error C2371: 'BITMAP': Neudefinition; unterschiedliche Basistypen
1>        c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\gfx.h(262): Siehe Deklaration von 'BITMAP'
1>c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(3994) : error C2229: struct 'tagDIBSECTION' enthält ein Array mit der unzulässigen Größe 0


Wenn ich auf die erste Meldung doppelklicke, wird mir folgender Code-Ausschnitt der wingdi.h angezeigt (Pfeil zeigt auf die letzte Zeile):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;


Bei Doppelklick auf die zweite Meldung öffnet sich die gfx.h mit folgenden Code-Teil (Pfeil zeigt auf die offene geschweifte Klammer nach dem Kopf der Struktur):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct BITMAP            /* a bitmap structure */
{
   int w, h;                     /* width and height in pixels */
   int clip;                     /* flag if clipping is turned on */
   int cl, cr, ct, cb;           /* clip left, right, top and bottom values */
   GFX_VTABLE *vtable;           /* drawing functions */
   void *write_bank;             /* C func on some machines, asm on i386 */
   void *read_bank;              /* C func on some machines, asm on i386 */
   void *dat;                    /* the memory we allocated for the bitmap */
   unsigned long id;             /* for identifying sub-bitmaps */
   void *extra;                  /* points to a structure with more info */
   int x_ofs;                    /* horizontal offset (for sub-bitmaps) */
   int y_ofs;                    /* vertical offset (for sub-bitmaps) */
   int seg;                      /* bitmap segment */
   ZERO_SIZE_ARRAY(unsigned char *, line);
} BITMAP;


Wenn ich auf die dritte Meldung doppelklicke, öffnet sich wieder die wingdi.h mit folgendem Code-Teil (Pfeil auf Zeile von "BITMAPINFOHEADER"):

C-/C++-Quelltext

1
2
3
4
5
6
7
typedef struct tagDIBSECTION {
    BITMAP       dsBm;
    BITMAPINFOHEADER    dsBmih;
    DWORD               dsBitfields[3];
    HANDLE              dshSection;
    DWORD               dsOffset;
} DIBSECTION, FAR *LPDIBSECTION, *PDIBSECTION;


Was kann man denn da machen?

Vielen Dank im Voraus,

mfg Gon

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

11.10.2009, 09:37

Statt windows.h solltest du winalleg.h (im Bibliotheksumfang von Allegro enthalten) inkludieren.

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

3

11.10.2009, 16:08

OK, das hab ich jetzt gemacht, nun gibts aber wieder ein sehr ähnliches Problem:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1>c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\platform\alwin.h(42) : warning C4005: 'main': Makro-Neudefinition
1>        c:\users\erik\programmierung\libs\sdl-1.2.8\include\sdl_main.h(53): Siehe vorherige Definition von 'main'
1>Framework.cpp
1>c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\platform\alwin.h(42) : warning C4005: 'main': Makro-Neudefinition
1>        c:\users\erik\programmierung\libs\sdl-1.2.8\include\sdl_main.h(53): Siehe vorherige Definition von 'main'
1>c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\platform\alwin.h(42) : warning C4005: 'main': Makro-Neudefinition
1>        c:\users\erik\programmierung\libs\sdl-1.2.8\include\sdl_main.h(53): Siehe vorherige Definition von 'main'
1>Slugger.cpp
1>c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\platform\alwin.h(42) : warning C4005: 'main': Makro-Neudefinition
1>        c:\users\erik\programmierung\libs\sdl-1.2.8\include\sdl_main.h(53): Siehe vorherige Definition von 'main'
1>Sprite.cpp
1>c:\users\erik\programmierung\libs\allegro-msvc90-4.2.2\include\allegro\platform\alwin.h(42) : warning C4005: 'main': Makro-Neudefinition
1>        c:\users\erik\programmierung\libs\sdl-1.2.8\include\sdl_main.h(53): Siehe vorherige Definition von 'main'

1>sdlmain.lib(SDL_win32_main.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_SDL_main" in Funktion "_main".
1>C:\Users\Erik\Programmierung\Projekte\C++\Grafik-Programme\Slugger\Debug\Slugger.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.


Diesmal wird main öfters definiert.
Außerdem gibts ein nichtaufgelöstes externes Symbol, warum auch immer.

Bei doppelklick der Meldungen kommt der Code hier:
alwin.h (Pfeil auf "#define main"-Zeile)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#if (!defined ALLEGRO_NO_MAGIC_MAIN) && (!defined ALLEGRO_SRC)

   #define ALLEGRO_MAGIC_MAIN
   #define main _mangled_main
   #undef END_OF_MAIN

   /* disable strict pointer typing because of the vague prototype below */
   #define NO_STRICT

   #ifdef __cplusplus
      extern "C" int __stdcall WinMain(void *hInst, void *hPrev, char *Cmd, int nShow);
   #endif


SDL_main.h:

C-/C++-Quelltext

1
#define main    SDL_main


Was kann man denn hier machen?

mfg Gon

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

11.10.2009, 18:38

Verwendest du als Einsteigspunkt WinMain oder main? Falls du ersteres verwendest kannst du mal folgendes versuchen:

C-/C++-Quelltext

1
2
3
4
5
#define ALLEGRO_NO_MAGIC_MAIN 1

// hier deine allegro header inkludieren


// ...


Mehr Infos: http://www.allegro.cc/manual/platform-specifics/windows-specifics/

5

11.10.2009, 21:55

Gut ich kenne Allegro nicht aber sollte sich das Problem nicht mit Includeguards lösen lassen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

11.10.2009, 22:02

Das Problem ist doch, dass der globale Namespace total verdreckt ist.

Werbeanzeige