[C++] illegal function definitions

illegal function definitions [C++] - Programmation

Marsh Posté le 13-06-2001 à 11:41:59    

VC++ me renvoit ça: D:\Mes Documents\Programmation\DirectX\BitmapToSurface.h(10) : error C2601: 'BitmapToSurface' : local function definitions are illegal
, quand j'essaie de compiler ce code:
 
FICHIER main.cpp:
 
#include <windows.h>
#include <ddraw.h>
 
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
 
///////////////////////////////////////////////////////////////////
 
LPDIRECTDRAW lpDirectDrawObject = NULL;
LPDIRECTDRAWSURFACE lpPrimary = NULL;
 
///////////////////////////////////////////////////////////////////
 
long CALLBACK WndProc(HWND hwnd, UINT message, UINT wParam, long lParam)
{
 switch (message)
 {
 case WM_KEYDOWN:
  {
   if (wParam == VK_ESCAPE)
   {
    DestroyWindow(hwnd);
 
    return 0;
   }
 
   else
    return 0;
  }
 
 case WM_DESTROY:
  {
   if (lpDirectDrawObject)
   {
    if (lpPrimary)
     lpPrimary->Release();
 
    lpDirectDrawObject->Release();
   }
     
   PostQuitMessage(0);
 
   return 0;
  }
 
 default:
  {
   return (DefWindowProc(hwnd, message, wParam, lParam));
  }
 }
}
 
///////////////////////////////////////////////////////////////////
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
 HWND hwnd;
 WNDCLASSEX wndclassex;
 MSG msg;
 
 
 const char szClassName[] = "Window Class";
 
 wndclassex.lpszClassName = szClassName;
 wndclassex.cbSize = sizeof(wndclassex);
 wndclassex.style = CS_HREDRAW | CS_VREDRAW;
 wndclassex.lpszMenuName = NULL;
 wndclassex.hInstance = hInstance;
 wndclassex.lpfnWndProc = WndProc;
 wndclassex.hbrBackground = NULL;
 wndclassex.cbClsExtra = 0;
 wndclassex.cbWndExtra = 0;
 wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
 
 RegisterClassEx(&wndclassex);
 
 hwnd = CreateWindowEx( WS_EX_TOPMOST,
       szClassName,
       "DirectX Project",
       WS_POPUP,
       0,
       0,
       GetSystemMetrics(SM_CXSCREEN),
       GetSystemMetrics(SM_CYSCREEN),
       NULL,
       NULL,
       hInstance,
       NULL);
 
 
 ShowWindow(hwnd, nShowCmd);
 UpdateWindow(hwnd);
 
///////////////////////////////////////////////////////////////////
 
 DirectDrawCreate(NULL, &lpDirectDrawObject, NULL);
 lpDirectDrawObject->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
 lpDirectDrawObject->SetDisplayMode(1024, 768, 32);
 
 
 DDSURFACEDESC ddsd;
 ddsd.dwSize = sizeof(ddsd);
 ddsd.dwFlags = DDSD_CAPS;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
 lpDirectDrawObject->CreateSurface(&ddsd, &lpPrimary, NULL);
 
 #include "BitmapToSurface.h"
 
 BitmapToSurface(lpPrimary, "image.bmp", 1024, 768, 0, 0);
 
///////////////////////////////////////////////////////////////////
 
 while (GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 
 return 0;
}
 
 
 
 
FICHIER BITMAPTOSURFACE.H:
 
#include <windows.h>
#include <ddraw.h>
 
int BitmapToSurface(LPDIRECTDRAWSURFACE lpSurfaceDest,  
      char szBitmapName[],  
      int iXSize,  
      int iYSize,  
      int iXDest,  
      int iYDest)
{
 HDC hSrcDC;           // source DC - memory device context
 HDC hDestDC;          // destination DC - surface device context
 HBITMAP hbitmap;      // handle to the bitmap resource
 BITMAP bmp;           // structure for bitmap info
 
 int nHeight, nWidth;  // bitmap dimensions
 
 // first load the bitmap resource
 if ((hbitmap = (HBITMAP)LoadImage(hInstance, szBitmapName,
                                    IMAGE_BITMAP, iXSize, iYSize,
                                    LR_CREATEDIBSECTION | LR_LOADFROMFILE)) == NULL)
  return(FALSE);
 
 // create a DC for the bitmap to use
 if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)
  return(FALSE);
 
 // select the bitmap into the DC
 if (SelectObject(hSrcDC, hbitmap) == NULL)
 {
  DeleteDC(hSrcDC);
  return(FALSE);
 }
 
 // get image dimensions
 if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)
 {
  DeleteDC(hSrcDC);
  return(FALSE);
 }
 
 nWidth = bmp.bmWidth;
 nHeight = bmp.bmHeight;
 
 // retrieve surface DC
 if (FAILED(lpSurfaceDest->GetDC(&hDestDC)))
 {
  DeleteDC(hSrcDC);
  return(FALSE);
 }
 
 // copy image from one DC to the other
 if (BitBlt(hDestDC, iXDest, iYDest, nWidth, nHeight, hSrcDC, 0, 0,
             SRCCOPY) == NULL)
 {
  lpSurfaceDest->ReleaseDC(hDestDC);
  DeleteDC(hSrcDC);
  return(FALSE);
 }
 
 // kill the device contexts
 lpSurfaceDest->ReleaseDC(hDestDC);
 DeleteDC(hSrcDC);
 
 // return success
 return 0;
}
 
D'où vient le problème?

Reply

Marsh Posté le 13-06-2001 à 11:41:59   

Reply

Marsh Posté le 13-06-2001 à 12:16:01    

Ca veut déjà dire quoi illegal function defitions exactement?

Reply

Marsh Posté le 13-06-2001 à 12:21:12    

alload> j'ai pas regarde ton source dans le detail, mais tu as l'air de definir tes fonctions dans les fichier .h, en fait tu devrais uniquement faire une declaration style :

Code :
  1. int BitmapToSurface(LPDIRECTDRAWSURFACE lpSurfaceDest, 
  2.                 char szBitmapName[], 
  3.                 int iXSize, 
  4.                 int iYSize, 
  5.                 int iXDest, 
  6.                 int iYDest);


 
dans ton .h, et ensuite definir ta fonction dans le .cpp.
 
Ensuite ton probleme vient du fait que tu fais un #include a l'interieur d'une fonction... :D.... :lol:
 
ATTENTION : les #include sont toujours au debut des fichiers (ou du moins en dehors des fonctions), donc bouge ton #include "bitmaptosurface.h" au debut de ton fichier main.cpp, et ca devrait rouler :)

Reply

Marsh Posté le 13-06-2001 à 12:23:07    

Je sais que les includes sont normalement au début, mais avec mon .h initial si je le met au début, ben hInstance n'est pas initialisé. Donc ça marche pas.
 
Bon je vais essayer ton truc et je reviens dire comment ça se passe.
:)
 
Merci.

Reply

Marsh Posté le 13-06-2001 à 12:26:52    

Alload> en fait quand tu fais un #include <fichier.h>, le compilateur il ne fait rien d'autre qu'un copier-coller de fichier.h a l'interieur de ton source, donc en fait faire un include a l'interieur d'une fonction, ca revenait a definir la fonction bitmaptosurface a l'interieur d'une autre fonction... et ca c'est pas possible en C++ :)

Reply

Marsh Posté le 13-06-2001 à 12:51:21    

Maintenant ça me donne ça: Main.obj : error LNK2001: unresolved external symbol "int __cdecl BitmapToSurface(struct IDirectDrawSurface *,char const * const,int,int,int,int)" (?BitmapToSurface@@YAHPAUIDirectDrawSurface@@QBDHHHH@Z)
 
C'est quoi encore ce binz?
 
Voilà le fichier "ddmyutil.h":
 
//Fonction qui place directement un bitmap dans une surface déjà créée
int BitmapToSurface(LPDIRECTDRAWSURFACE lpSurfaceDest, //Surface destinatrice
      const char szBitmapName[],     //Fichier bitmap source
      int iXSize,              //Taille x de la surface
      int iYSize,        //Taille y de la surface
      int iXDest,        //Coordonnée x du coin gauche du bitmap
      int iYDest);        //Coordonnée y du coin gauche du bitmap
 
 
Et voici le fichier "ddmyutil.cpp":
 
#include <windows.h>
#include <ddraw.h>
 
#include "ddmyutil.h"
 
 
int BitmapToSurface(LPDIRECTDRAWSURFACE lpSurfaceDest,  
      const char szBitmapName[],  
      int iXSize,  
      int iYSize,  
      int iXDest,  
      int iYDest)
{
 HDC hSrcDC;           // source DC - memory device context
 HDC hDestDC;          // destination DC - surface device context
 HBITMAP hbitmap;      // handle to the bitmap resource
 BITMAP bmp;           // structure for bitmap info
 
 int nHeight, nWidth;  // bitmap dimensions
 
 // first load the bitmap resource
 if ((hbitmap = (HBITMAP)LoadImage(hInstance, szBitmapName,
                                    IMAGE_BITMAP, iXSize, iYSize,
                                    LR_CREATEDIBSECTION | LR_LOADFROMFILE)) == NULL)
 {
  MessageBox(hwnd, "Erreur pendant le chargement d'un bitmap.", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 // create a DC for the bitmap to use
 if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)
 {
  MessageBox(hwnd, "Erreur pendant la création d'un Device Context pour l'image source.", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 // select the bitmap into the DC
 if (SelectObject(hSrcDC, hbitmap) == NULL)
 {
  DeleteDC(hSrcDC);
  MessageBox(hwnd, "Erreur pendant la copie d'un bitmap vers son Device Context.", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 // get image dimensions
 if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)
 {
  DeleteDC(hSrcDC);
  MessageBox(hwnd, "Erreur pendant l'acquisiton des informations d'un bitmap", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 nWidth = bmp.bmWidth;
 nHeight = bmp.bmHeight;
 
 // retrieve surface DC
 if (FAILED(lpSurfaceDest->GetDC(&hDestDC)))
 {
  DeleteDC(hSrcDC);
  MessageBox(hwnd, "Erreur pendant l'initialisation de la surface destinatrice.", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 // copy image from one DC to the other
 if (BitBlt(hDestDC, iXDest, iYDest, nWidth, nHeight, hSrcDC, 0, 0,
             SRCCOPY) == NULL)
 {
  lpSurfaceDest->ReleaseDC(hDestDC);
  DeleteDC(hSrcDC);
  MessageBox(hwnd, "Erreur pendant la copie du bitmap vers la surface.", "Loading Bitmap Error", MB_OK);
  return(FALSE);
 }
 
 // kill the device contexts
 lpSurfaceDest->ReleaseDC(hDestDC);
 DeleteDC(hSrcDC);
 
 // return success
 return 0;
}

Reply

Marsh Posté le 13-06-2001 à 12:56:16    

Bien ! au niveau .h, .cpp :)
 
Sauf que... ton fichier .h doit etre independant... et la ce n'est pas le cas car tu utilises LPDIRECTDRAWSURFACE, qui n'est pas defini dans le .h
 
Solution : tu ajoutes les lignes  
#include <windows.h>
#include <ddraw.h> dans le .h
 
 
et le debut de ton fichier ddmyutil.cpp, tu mets simplement (ainsi que dans main.cpp) :
#include "ddmyutil.h"
 
... comme ca c'est clean... :)

 

[edit]--Message édité par tgrx--[/edit]

Reply

Marsh Posté le 13-06-2001 à 13:06:49    

Oki, merci de m'aider pour le codage.
:)
 
Par contre la compilation me renvoit toujours la même erreur:
Main.obj : error LNK2001: unresolved external symbol "int __cdecl BitmapToSurface(struct IDirectDrawSurface *,char const * const,int,int,int,int)" (?BitmapToSurface@@YAHPAUIDirectDrawSurface@@QBDHHHH@Z)
 
 
Ca vient peut-être de la façon dont j'utilise la fonction:
BitmapToSurface(lpPrimary, "image.bmp", 1024, 768, 0, 0);
 
Quelqu'un à une idée?

Reply

Marsh Posté le 13-06-2001 à 13:10:21    

L'erreur c'est qu'au moment du link il ne trouve pas ta fonction BitmapToSurface... c'est bizarre, normalement il devrait la trouver.
 
Essaie d'ajouter ddmyutil dans les parametres du linker... :??:

Reply

Marsh Posté le 13-06-2001 à 13:13:22    

Surtout que le prototype a l'air de correspondre avec l'appel que tu en fais... :??:

Reply

Marsh Posté le 13-06-2001 à 13:13:22   

Reply

Marsh Posté le 13-06-2001 à 13:24:09    

Si quelqu'un veut downloader les fichiers sources:
 
http://www.multimania.com/final6/DDproblem.zip
 
C'est quoi cette merde... Arf...

Reply

Marsh Posté le 13-06-2001 à 13:39:53    

Est-ce que ca marche si tu mets (dans main.cpp)
 
#include "ddmyutils.cpp"
 
a la place de  
 
#include "ddmyutils.h" ??

Reply

Marsh Posté le 13-06-2001 à 13:41:25    

Si je fais ça, le handle de la fenêtre hwnd et le hande d'instanse hInstance ne sont pas définis donc ça marche pas.

Reply

Marsh Posté le 13-06-2001 à 13:42:10    

ah bon ?

Reply

Marsh Posté le 13-06-2001 à 13:46:05    

Ben hInstance et hwnd sont définis que dans la fonction WinMain qui est après les includes donc ça marche pas.

Reply

Marsh Posté le 13-06-2001 à 13:52:58    

ah ok, mais c'est parce que ton code est mal foutu...
 
Normalement ddmyutil.h ne devrait pas acceder "directement" a hInstance et hwnd qui sont  des variables globales... :sarcastic:... beurk.
En plus elles sont locales, car definies uniquement dans WinMain... donc ca ne fonctionnera jamais dans BitmapToSurface...
 
Solution : passer hInstance et hwnd en parametre de ta fonction BitmapToSurface (en pointeur ou reference comme tu veux).
 
int BitmapToSurface(LPDIRECTDRAWSURFACE lpSurfaceDest,const char szBitmapName[],int iXSize,int iYSize,int iXDest,int iYDest,HINSTANCE& hInstance,HWND& hwnd);
 
et dans main.cpp :
BitmapToSurface(lpPrimary, "image.bmp", 1024, 768, 0, 0, hInstance, hwnd);

Reply

Marsh Posté le 13-06-2001 à 13:59:19    

et apparemment (je regarde les callback dans ton fichier main.cpp), HISTANCE et HWND sont des pointeurs, donc tu peux virer les references... sert a rien.

Reply

Marsh Posté le 13-06-2001 à 14:01:42    

et pour finir, je pense que VC++ n'a jamais compile le fichier ddmyutil.cpp, car normalement tu devrais avoir plein d'erreurs a cause des hwnd et hInstance qui n'existent pas...
 
donc je sais pas ou c'est (j'ai pas Visual C++ sous la main), mais ajoute ddmyutil.cpp a la liste des fichiers a compiler, ca devrait resoudre ton probleme de link.
Un truc du genre : projet > ajouter fichiers ??

Reply

Marsh Posté le 13-06-2001 à 14:02:40    

Thanks ça marche maintenant.
:)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed