IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Erreur de compilation d'un projet avec libraire en DevC++: probleme design ou autre ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut Erreur de compilation d'un projet avec libraire en DevC++: probleme design ou autre ?
    Bonjour,

    Voila j'utilise une librairie de traitement d'images (GD), cette librairie écrit en C
    peut s'intégrer dans un environnement Mingw ainsi que DevC++, jusque là j'ai bien su intégrer dans DevC++ avec Vista et tester les fonctions seules de la librairie sans problème de compilation. Mais J'ai dans mon projet plusieurs classes afin de mettre en oeuvre un vrai projet POO avec de l'héritage, de la généricité, des surcharges de méthodes etc....

    Mes classes :
    Conceptuellement, Pixel doit heriter de la classe Couleur,
    la classe Image devra hériter de la classe Image2D et de la classe générique Matrice (dont le paramètre de généricité sera la classe Pixel). La classe Image2D devra contenir les données et les méthodes qui ne concernent que les images en 2D. Idem pour les classes Matrice ou Pixel.

    Pour le moment j'ai simplifier en ne mettant pas la classe Image2D ( d'ailleurs on peut s'en passer)

    Maintenant que j'ai commencé à intégrer plusieurs classes (fichiers .h et .cpp) j'ai ces erreurs de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Compiler: Default compiler
    Building Makefile: "C:\mygd\gdtestpng\Makefile.win"
    Executing  make...
    make.exe -f "C:\mygd\gdtestpng\Makefile.win" all
    g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  -I"C:/mygd/gd-latest-win32/include"  -I"C:/mygd/gd_build_win32_deps/gd_deps/include"   
     
    In file included from image.h:5,
                     from main.cpp:13:
    pixel.h:18: error: expected unqualified-id before "unsigned"
    pixel.h:18: error: expected `)' before "unsigned"
     
    pixel.h:25: error: abstract declarator `<anonymous class>' used as declaration
     
    pixel.h:25: error: namespace-scope anonymous aggregates must be static
    In file included from image.h:6,
                     from main.cpp:13:
    matrice.h:9: error: template class without a name
    matrice.h:22: error: expected unqualified-id before "int"
    matrice.h:22: error: expected `)' before "int"
    matrice.h:33: error: expected class-name before '(' token
    matrice.h:56: error: abstract declarator `<anonymous class><T>' used as declaration
    matrice.h:56: error: namespace-scope anonymous aggregates must be static
     
    In file included from main.cpp:13:
    image.h:15: error: expected unqualified-id before '<' token
     
    image.h: In constructor `Image::Image(int, int)':
    image.h:22: error: class `Image' does not have any field named `matrice_pixel'
    image.h:22: error: expected `(' at end of input
    image.h:22: error: expected `{' at end of input
     
    main.cpp: In function `int main()':
    main.cpp:69: error: 'class Image' has no member named 'exportimg'
     
    make.exe: *** [main.o] Error 1
     
    Execution terminated

    Je pense que c'est moi qui intègre mal mais classes est-ce le cas ?
    Voici mon code :

    --main.cpp--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
     
     
    #include <iostream>
    #include <windows.h> 
    #include <cstdlib>
    #include <fstream>
     
    #include <stdio.h>
    #include <stdlib.h> 
    //#include "gd.h"
    //#include "Pixel.h"
    //#include "Matrice.h"
     
    //Première ligne de bug 13 In file included from image.h:5,     from main.cpp 
    #include "image.h"
     
    using namespace std;
    int main()
    {
     
       //ICI il faut instancier objet de la classe Image car c'est la classe fille
       Image monimg(512,512);
       Image *monimglist = new Image(512,512);
     
       // ICI appeler methode de la classe Image (qui elle appelera methodes Matrice
       // Pixel, 
     
     
       //ICI code de la biblitheque GD
      // Declarations
      gdImagePtr im;
      gdImagePtr imout;
      FILE *jpegout;
      int x,y,c=0;
      int black,r=0,v=0,b=0;
      char n;
     
      // Initialisations
      im = gdImageCreateTrueColor(512, 512);
      imout = gdImageCreateTrueColor(512, 512);
      // fond de l'image mis a noir
      black = gdImageColorAllocate(im, 0, 0, 0);
     
      for (x=0;x<gdImageSX(im);x++)
        for (y=0;y<gdImageSY(im);y++)
          { // Genere trois nombres r,v,b entre 0 et 256
        r=(int) (256.0*rand()/(RAND_MAX+1.0));
        v=(int) (256.0*rand()/(RAND_MAX+1.0));
        b=(int) (256.0*rand()/(RAND_MAX+1.0));
        // avec ces trois nombres, on "genere" une couleur
        c= gdImageColorAllocate(im, r, v, b);
        /* NB : Ces 3 lignes pourraient etre condensees en une seule
           car on travaille en "couleur vraie" :
           c=(int) (16777216.0*rand()/(RAND_MAX+1.0));
           "c" est bel et bien un entier entre 0 et 256^3, rien de plus !
           Le gdImageColorAllocate est superflu !
           Pour s'en persuader, printf("R:%d-V:%d-B:%d=>C:%d\n",r,v,b,c);
        */
        // met le pixel en (x,y) a cette couleur
        gdImageSetPixel(im, x, y, c);
          }
     
      // Ecriture de l'image et nettoyage
     
      jpegout = fopen("toto.jpg", "wb");
     
      gdImageJpeg(im, jpegout, -1);
     // monimg =im;
      monimg.exportimg(imout);
      FILE * sortie;
      sortie= fopen("recup.jpg", "wb");
      //(gdImagePtr im, FILE * out, int quality);
      gdImageJpeg(imout,sortie,10);
     
      fclose(sortie);
      fclose(jpegout);
      gdImageDestroy(im);
      gdImageDestroy(imout);
      system("pause") ;
     
      return 0;
    }


    --image.h--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //- la classe image qui est définie par la classe générique matrice avec paramètre d'instanciation la classe pixel
    //#ifndef Image
    //#define Image 
     
    #include "pixel.h"
    #include "matrice.h"
    #include "gd.h"
     
    //typedef Matrice<Pixel> t_Cpixelmat;
    //template <class T>
    class Image //: public Matrice <T>
    {
    	private:
     
    	Matrice<Pixel> matrice_pixel;
     
    	public:
        //Image(const Image&);
        //~Image(){    } // dois je detruire matrice_pixel ? ==> non, c'est fait dans la classe mère
     
    	//Image(int n, int m) : t_Cpixelmat(n,m) ;
         Image(int n, int m) : matrice_pixel ;
     
    };
     
    //#endif

    --fichier image.cpp--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include "image.h"
    #include "gd.h"
    //#include "Pixel.h"
    //#include "Matrice.h"
     
    Image::Image(int n, int m) : matrice_pixel (n,m)
    {
    Pixel p;
    matrice_pixel M;
    for(int i=0; i<n;i++)
             (for(int j=0; j<n;j++)
             M(i,j,p=Pixel(0,0,0,0,i,j);
     
    }
     
    Image::~Image()
    {
    }
     
    };

    --Pixel.h--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    //- la classe pixel qui derive de la classe couleur
    #ifndef Pixel
    #define Pixel 
     
    #include "couleur.h"
     
    class Pixel : public Couleur
    {
    //private:
    protected:
    unsigned int X; //abscisse
    unsigned int Y; //coordonnée
     
    public:
     
    //Pixel() : Couleur(0,0,0,0) { X = Y = 0; }
     
    //seconde ligne de bug : pixel.h expected unqualified-id before "unsigned" 
    Pixel(unsigned int x, unsigned int y, unsigned char r, unsigned char g, unsigned char b, unsigned char a /*= 0*/)  
    		: Couleur(r,g,b,a)
    	{
    		X = x;
    		Y = y;
    	}
     
    };
     
    #endif

    --Matrice.h--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #ifndef Matrice
    #define Matrice
     
    //#include "Pixel.h"
     
    template <class T>
    class Matrice
    {
    protected:
     
    T **mat;
     
    int max_de_lignes;
    int max_de_colonnes;
    int nombre_de_lignes;
    int nombre_de_colonnes;
     
    public:
     
         //voir 
    Matrice(int n,int m)
    {
    	max_de_lignes=n,
    	max_de_colonnes=m;
    	nombre_de_lignes=0;
    	nombre_de_colonnes=0;
    	mat=new T*[max_de_lignes];
    	for(int i=0;i<max_de_lignes;i++)
    	mat[i] = new T[max_de_colonnes];
    }
     
    ~Matrice()
    {
    	for(int i=0;i<max_de_lignes;i++)
    	{
    		delete[] mat[i];
    	}
    	delete[] mat;
    }
     
    };
     
    #endif

    --couleur.h--
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    #ifndef _COULEUR 
    #define _COULEUR 
     
    class Couleur
    {
    protected:
     
    	unsigned char R, G, B; //(ou l'inverse ... à voir plus tard);
    	//unsigned char V[4];
    	//unsigned long Col;
     
    public:
     
     
     void  set(	unsigned char Rp,unsigned char Gp,unsigned char Bp)
              { R = Rp;
              G =Gp;
              B= Bp;
     
                    }
     unsigned char get_R()
               { return R;               }
     
     unsigned char get_G()
      { return G;               }
     unsigned char get_B()
      { return B;               }
     
     unsigned int get_color() //32 bits
     {
              return ( (unsigned long)R << 16 | (unsigned long)G << 8 | (unsigned long)B);
     } 
    Couleur() { R = G = B = 0; }
    Couleur(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 0) { set(r, g, b);}
    };
    #endif
    Enfin j'ai pas fait de fichiers séparé pour l'implémentatoin de toutes mes classes est ce vraiment utile ? Pourriez vous m'aider dans la conception et code de ce projet car je n'arrive pas du tout à éliminer ces erreurs de compilations ?

    Merci

  2. #2
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Pixel.h peut être comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    //- la classe pixel 
    #ifndef PIXEL_H
    #define PIXEL_H
     
    #include "couleur.h"
     
    class Pixel
    {
    //private:
    protected:
    unsigned int X; //abscisse
    unsigned int Y; //coordonnée
    Couleur couleur;
     
    public:
    	Pixel(unsigned int x, unsigned int y, unsigned char r, unsigned char g, unsigned char b, unsigned char a /*= 0*/)  
    		: X(x), Y(y), couleur(r,g,b,a)
    	{
    	}
     
    };
     
    #endif
    Image.h, c'est bon.

    Image.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Image::Image(int n, int m) 
      :Matrice <Pixel> (n,m)
    {
      for(int i=0; i<n;i++)
             for(int j=0; j<m;j++)
               mat[i][j] = Pixel(0,0,0,0,i,j);
    }
    Fait attention avec les "arrays" de deux dimensions.

    int a[N][M];

    a[0,1] = 3; // ça ne marche pas, c'est a[1] = 3;

    a[0][1] = 3;

    (regarde dans void Image::exportimg(gdImagePtr pgdimg) )

  3. #3
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Merci Cynique,

    En fait, j'ai fait comme tu m'as dit pour Pixel.h et Image.cpp mais
    j'ai toujours un probleme de link que je ne sais pas pourquoi la raison ?

    log compil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Compiler: Default compiler
    Building Makefile: "C:\mygd\gdtestpng\Makefile.win"
    Executing  make...
    make.exe -f "C:\mygd\gdtestpng\Makefile.win" all
    g++.exe main.o m_Trtmnt_images.o  -o "gdtestpng.exe" -L"C:/Dev-Cpp/lib" -L"C:/mygd/gd-latest-win32/lib" -L"C:/mygd/gd_build_win32_deps/gd_deps/lib" ../gd-latest-win32/lib/bgd.lib ../gd_build_win32_deps/gd_deps/lib/zlib.lib ../gd_build_win32_deps/gd_deps/lib/libjpeg.lib ../gd_build_win32_deps/gd_deps/lib/libpng.lib ../gd_build_win32_deps/gd_deps/lib/freetype2.lib  
     
    main.o(.text+0x18c):main.cpp: undefined reference to `Image::Image(int, int)'
    main.o(.text+0x1d0):main.cpp: undefined reference to `Image::Image(int, int)'
    main.o(.text+0x462):main.cpp: undefined reference to `Image::exportimg(gdImageStruct*)'
    main.o(.text+0x4ef):main.cpp: undefined reference to `Image::~Image()'
    main.o(.text+0x51c):main.cpp: undefined reference to `Image::~Image()'
    collect2: ld returned 1 exit status
     
    make.exe: *** [gdtestpng.exe] Error 1
     
    Execution terminated

    Dois je revoir mes constructeurs de Image ?

    Merci

  4. #4
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par Aliveli Voir le message
    Dois je revoir mes constructeurs de Image ?

    Merci
    Non, tu dois compiler et lier Image.cpp et Pixel.cpp

    Sans faire ça, le linker ne peut pas trouver le code compilé des constructers etc.

  5. #5
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Bonjour Cynique,

    Je compile mais j'ai des erreurs de link je n'arrive pas à lier Image.cpp et Pixel.cpp comment dois je faire ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ompiler: Default compiler
    Building Makefile: "C:\mygd\gdtestpng\Makefile.win"
    Executing  make...
    make.exe -f "C:\mygd\gdtestpng\Makefile.win" all
    g++.exe main.o m_Trtmnt_images.o  -o "gdtestpng.exe" -L"C:/Dev-Cpp/lib" -L"C:/mygd/gd-latest-win32/lib" -L"C:/mygd/gd_build_win32_deps/gd_deps/lib" ../gd-latest-win32/lib/bgd.lib ../gd_build_win32_deps/gd_deps/lib/zlib.lib ../gd_build_win32_deps/gd_deps/lib/libjpeg.lib ../gd_build_win32_deps/gd_deps/lib/libpng.lib ../gd_build_win32_deps/gd_deps/lib/freetype2.lib  
     
    main.o(.text+0x18c):main.cpp: undefined reference to `Image::Image(int, int)'
    main.o(.text+0x1d0):main.cpp: undefined reference to `Image::Image(int, int)'
    main.o(.text+0x462):main.cpp: undefined reference to `Image::exportimg(gdImageStruct*)'
    main.o(.text+0x4ef):main.cpp: undefined reference to `Image::~Image()'
    main.o(.text+0x51c):main.cpp: undefined reference to `Image::~Image()'
    collect2: ld returned 1 exit status
     
    make.exe: *** [gdtestpng.exe] Error 1
     
    Execution terminated

    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour les defines, je conseille H_NOMDUHEADER_AAAAMMJJ_hhmm
    Cela réduit les chances de collision avec un autre symbole...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Erreur lors de la compilation d'un projet avec maven
    Par cococinelle dans le forum Maven
    Réponses: 2
    Dernier message: 07/04/2008, 09h47
  2. Erreur de compilation de fichier objet avec gtk
    Par oranoutan dans le forum GTK+
    Réponses: 2
    Dernier message: 14/09/2007, 15h22
  3. Erreur de compilation de boost::date_time avec mingw
    Par shenron666 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 26/08/2006, 18h18
  4. Erreur de compilation sur std::string avec Dev C++
    Par dada57 dans le forum Dev-C++
    Réponses: 4
    Dernier message: 20/03/2006, 18h06
  5. Erreur de compilation sur gaim-vv avec gstrreamer
    Par ZiMo dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 30/12/2005, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo