www.mikrocontroller.net

Forum: PC-Programmierung Probleme mit SDL


Autor: Programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich folgendes Problem mit der Benutzung der SDL Bibliothek.
Wenn ich diesen Code übersetzte, erhalte ich von Microsoft Visul Studio 
C++ 2008 folgende Meldungen:

Warnung  1  warning C4700: Die nicht initialisierte lokale Variable 
"mColor" wurde verwendet. 
d:\sdl_tetris\sdl_tetris\sdl_tetris\sdl_tetris.cpp  101  SDL_Tetris

Fehler  2  error LNK2019: Verweis auf nicht aufgelöstes externes
Symbol "__imp__boxColor" in Funktion ""void __cdecl 
DrawRectangle(int,int,int,int,enum color)" 
(?DrawRectangle@@YAXHHHHW4color@@@Z)".  SDL_Tetris.obj  SDL_Tetris

Fehler  3  fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 
D:\SDL\SDL_Tetris\SDL_Tetris\Debug\SDL_Tetris.exe  1  SDL_Tetris


Programmcode:
#include "stdafx.h"
#include <string.h>

/* -- Include the precompiled libraries -- */
#ifdef WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL_image.lib")
#endif

#include "SDL.h"
#include "SDL_image.h"
#include <SDL_gfxPrimitives.h>


#include "bodies.h"

SDL_Surface *screen, *image[6];
SDL_Event e;
SDL_Rect rect,background;

unsigned char *bKey;
int quit = 0;
unsigned int i=0;

#define BOARD_LINE_WIDTH 6      // Width of each of the two lines that delimit the board
#define BLOCK_SIZE 16        // Width and Height of each block of a piece
#define BOARD_POSITION 320      // Center position of the board from the left of the screen
#define BOARD_WIDTH 10        // Board width in blocks 
#define BOARD_HEIGHT 20        // Board height in blocks
#define MIN_VERTICAL_MARGIN 20    // Minimum vertical margin for the board limit     
#define MIN_HORIZONTAL_MARGIN 20  // Minimum horizontal margin for the board limit
#define PIECE_BLOCKS 5  

int mBoard [BOARD_WIDTH][BOARD_HEIGHT];
enum { POS_FREE, POS_FILLED };
enum color {BLACK, RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, WHITE, COLOR_MAX};
static Uint32 mColors [COLOR_MAX] = {0x000000ff,0xff0000ff, 0x00ff00ff, 0x0000ffff,
                               0x00ffffff, 0xff00ffff, 0xffff00ff,0xffffffff};

void InitBoard(void);
void StorePiece (int pX, int pY, int pPiece, int pRotation);
void DrawPiece (int pX, int pY, int pPiece, int pRotation);

void InitBoard(void)
{
  for (int i = 0; i < BOARD_WIDTH; i++)
    for (int j = 0; j < BOARD_HEIGHT; j++)
      mBoard[i][j] = POS_FREE;
}

void StorePiece (int pX, int pY, int pPiece, int pRotation)
{
  // Store each block of the piece into the board
  for (int i1 = pX, i2 = 0; i1 < pX + PIECE_BLOCKS; i1++, i2++)
  {
    for (int j1 = pY, j2 = 0; j1 < pY + PIECE_BLOCKS; j1++, j2++)
    {  
      // Store only the blocks of the piece that are not holes
      if (GetBlockType (pPiece, pRotation, j2, i2) != 0)    
        mBoard[i1][j1] = POS_FILLED;  
    }
  }
}

void DrawRectangle (int pX1, int pY1, int pX2, int pY2, enum color pC)
{
  boxColor(screen, pX1, pY1, pX2, pY2-1, mColors[pC]);
}

int GetXPosInPixels (int pPos)
{
  return  ( ( BOARD_POSITION - (BLOCK_SIZE * (BOARD_WIDTH / 2)) ) + (pPos * BLOCK_SIZE) );
}

int GetYPosInPixels (int pPos)
{
  return ( (screen->h - (BLOCK_SIZE * BOARD_HEIGHT)) + (pPos * BLOCK_SIZE) );
}


void DrawPiece (int pX, int pY, int pPiece, int pRotation)
{
  color mColor;        // Color of the block 

  // Obtain the position in pixel in the screen of the block we want to draw
  int mPixelsX = GetXPosInPixels (pX);
  int mPixelsY = GetYPosInPixels (pY);

  // Travel the matrix of blocks of the piece and draw the blocks that are filled
  for (int i = 0; i < PIECE_BLOCKS; i++)
  {
    for (int j = 0; j < PIECE_BLOCKS; j++)
    {
      
      if (GetBlockType(pPiece, pRotation, j, i) != 0)
        DrawRectangle(mPixelsX + i * BLOCK_SIZE, 
                mPixelsY + j * BLOCK_SIZE, 
               (mPixelsX + i * BLOCK_SIZE) + BLOCK_SIZE - 1, 
               (mPixelsY + j * BLOCK_SIZE) + BLOCK_SIZE - 1, 
                mColor);
    }
  }
}

int main(int argc, char **argv)
{
....
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der erste Fehler ist trivial. In Deiner Funktion DrawPiece verwendest 
Du eine Variable namens mColor, hast ihr aber nie einen Wert zugewiesen. 
Da steht also zufälliger Kram drin.

Das entscheidende Problem ist Fehler Nummer 2:

> Fehler  2  error LNK2019: Verweis auf nicht aufgelöstes externes
> Symbol "__imp__boxColor" in Funktion ""void __cdecl
> DrawRectangle(int,int,int,int,enum color)"


Deine Funktion DrawRectangle verwendet ein Symbol "__imp__boxColor", 
und das ist nicht da, d.h. in keiner von Dir angegebenen Library 
enthalten.

Der Name lässt darauf schließen, daß das ein Symbol aus einer 
sogenannten Importlibrary ist, die dazu dient, Funktionen aus einer 
DLL verwenden zu können.

Und wenn man sich DrawRectangle ansieht, dann wird da auch tatsächlich 
boxColor verwendet. Offensichtlich ist das in irgendeiner Headerdatei 
ausreichend deklariert (sonst gäbe es andere Fehlermeldungen), aber die 
Library, in der es definiert ist, die fehlt halt noch.


Fehler 3 ist die Folge von Fehler 1.

Du solltest lernen, mit Deinem Werkzeug umzugehen. Das ist ein 
alltägliches Brot-und-Butter-Problem, das es beim Umgang mit jedem 
C/C++-Compiler geben kann.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So erstmal das für Win32:
http://pgdc.purdue.org/sdltutorial/sdl_setup.html

Zudem wenn deine SDL installation in deinem Visual Studio Verzeichniss 
liegt:
#include <SDL.h>

Gruß, falls nit klappt. Kann ich gerne moin auf der Arbeit mal schaun 
wie ich das gemacht hatte. Alleridngs unter Borland Builder 6.0 ^^.

P.S: Haste Multithreaded DLL aktiviert ??

N8

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Einbinden der richtigen Headerdatei ist hier nicht das Problem, 
hier fehlt das Einbinden der richtigen Library.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo hast Recht Rufus hätte die Fehlermeldung 2 mal langsamer überfliegen 
sollen.
Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.