[Prog] Erreurs de compilation C++

Ce qui ne concerne ni le forum ni des problèmes
Répondre
eatman
archer
Messages : 112
Inscription : mer. 13 avr. 2011, 13:18
Localisation : France - Isère (38)

[Prog] Erreurs de compilation C++

Message par eatman »

Bonsoir.

Je dois par la force des choses quitter la programmation fonctionnelle pour me tourner vers du C++ et je galère.
Si quelqu'un à une minute ou deux pour lire ces quelques lignes de code et m'expliquer les messages d'erreurs à la compilation je lui en serais reconnaissant!

Les erreurs:

Code : Tout sélectionner

CMakeFiles/../bin/m2s1.dir/src/Image/Image8/Image8.cpp.o: In function `Image::Image(unsigned int, unsigned int)':
Image8.cpp:(.text._ZN5ImageC2Ejj[_ZN5ImageC5Ejj]+0x15): undefined reference to `vtable for Image'
CMakeFiles/../bin/m2s1.dir/src/Image/Image8/Image8.cpp.o: In function `Image8::Image8(Image8 const&)':
Image8.cpp:(.text._ZN6Image8C2ERKS_[_ZN6Image8C5ERKS_]+0x118): undefined reference to `Image::~Image()'
CMakeFiles/../bin/m2s1.dir/src/Image/Image8/Image8.cpp.o: In function `Image8::~Image8()':
Image8.cpp:(.text._ZN6Image8D2Ev[_ZN6Image8D5Ev]+0x2f): undefined reference to `Image::~Image()'
CMakeFiles/../bin/m2s1.dir/src/Image/Image8/Image8.cpp.o:(.rodata._ZTI6Image8[_ZTI6Image8]+0x10): undefined reference to `typeinfo for Image'
collect2: erreur: ld a retourné 1 code d'état d'exécution
make[2]: *** [../bin/m2s1] Erreur 1
make[1]: *** [CMakeFiles/../bin/m2s1.dir/all] Erreur 2
make: *** [all] Erreur 2
Et le code:

Classe Image

Code : Tout sélectionner

#ifndef _IMAGE_
#define _IMAGE_

class Image{
    public:
        Image(unsigned int w, unsigned int h) : _width(w), _height(h){}
        virtual ~Image();
    protected:
        unsigned int _width;
        unsigned int _height;

        virtual void dump(std::ostream& stream) const;
        friend std::ostream& operator<<(std::ostream& stream, Image const& image);

        virtual int width() const {return _width;}
        virtual int height() const {return _height;}
        virtual int size() const {return _width * _height;}
        virtual unsigned int valMax() const = 0;
        virtual unsigned int getPixel(unsigned int i, unsigned int j) const = 0;                                                                                                                                    
        virtual bool setPixel(unsigned int i, unsigned int j, unsigned int v) = 0;
        virtual Image* negative() = 0;
    private:

};
#endif // _IMAGE

Code : Tout sélectionner

#include <iostream>                                                                                                                                                                                                 
using namespace std;

#include "Image.h"

void Image::dump(ostream& stream) const{
    stream << _width << ' ' << _height << endl;
}
ostream& operator<<(ostream& stream, Image const& image){
    image.dump(stream);
    return stream;
}
Classe Image8 (Image 8Bits)

Code : Tout sélectionner

#define _IMAGE8_               

#include "../Image.h"

class Image8 : public Image{   
    public:
        Image8(unsigned int w, unsigned int h) : Image(w,h) {
            char* _pixel = new char[size()];
            for (int i=0; i<size(); i++) _pixel[i] = 0;
            updateValMax();    
        }
        Image8(Image8 const& image8) : Image(image8.width(), image8.height()) {
            char* _pixel = new char[size()];
            for (int i=0; i<height(); i++){ 
                for (int j=0; j<width(); j++){  
                    _pixel[i*width()+j] = image8.getPixel(i,j);
                }
            }
            updateValMax();
        }
        virtual ~Image8(){delete _pixel;}
    protected:
        unsigned char* _pixel;
        unsigned char _valMax;

        virtual void dump(std::ostream& stream) const;
        friend std::ostream& operator<<(std::ostream& stream, Image8 const& image8);

        virtual void updateValMax();    

        virtual unsigned int valMax() const {return _valMax;}
        virtual unsigned int getPixel(unsigned int i,unsigned int j) const {return (int)_pixel[i*width()+j];}
        virtual bool setPixel(unsigned int i, unsigned int j, unsigned int v);
        virtual Image8* negative();     
    private:
};
#endif //_IMAGE8_

Code : Tout sélectionner

#include <iostream>
using namespace std;

#include "Image8.h"
 
void Image8::dump(ostream& stream) const{                                                                                                                                                                           
    Image::dump(stream);
    stream << valMax() << endl;
    for (int i=0; i<height(); i++){
        for (int j=0; j<width(); j++){
            stream << ' ' << getPixel(i,j);
        }   
        stream << endl;
    }   
}

ostream& operator<<(ostream& stream, Image8 const& image8){
    image8.dump(stream);
    return stream;
}

void Image8::updateValMax(){
    int valMax(0);
    for (int i=0; i<height(); i++){
        for (int j=0; j<width(); j++){
            valMax = valMax < getPixel(i,j) ? getPixel(i,j) : valMax;
        }   
    }   
    _valMax = valMax;
}

bool Image8::setPixel(unsigned int i, unsigned int j, unsigned int v){ 
    _pixel[i*width()+j] = v;
    return true;
}
Image8* Image8::negative(){
    int w(width()), h(height()), v(valMax());
    Image8* out = new Image8(*this);
    for (int i=0; i<h; i++){
        for (int j=0; j<w; j++){
            out->setPixel(i,j,v-getPixel(i,j));
        }   
    }   
    return out;
}
Mes erreurs semblent courantes sur le net mais je ne comprends pas les réponses dans les autres forums.

Merci d'avance pour votre aide.
eatman.
eatman
archer
Messages : 112
Inscription : mer. 13 avr. 2011, 13:18
Localisation : France - Isère (38)

Re: [Prog] Erreurs de compilation C++

Message par eatman »

J'ai corrigé deux trois incohérences de types entre des unsigned int et unsigned char mais je ne trouve toujours pas pourquoi ces erreurs.
Avatar de l’utilisateur
vlamy
yeomen
Messages : 268
Inscription : ven. 20 juil. 2012, 15:19
Localisation : Grenoble

Re: [Prog] Erreurs de compilation C++

Message par vlamy »

Salut,
Je ne connais pas trop le C++, mais d'après le peu que je comprend, tu as des erreurs connues de la lib QT.
A priori je dirais que tu surcharges des classes QT, mais je ne vois aucun import de cette lib dans ton code.
C'est bien ce que tu fais?

Sinon, je te conseillerais plutôt un forum de programmation du genre "developpez", car je ne vois pas encore le rapport de ton problème avec Archlinux :)
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Prog] Erreurs de compilation C++

Message par FoolEcho »

On manque de recul, mais de ce que je vois vite fait, tu fais des trucs... bizarres:
Par exemple, ta classe Image propose:
eatman a écrit : virtual ~Image8(){delete _pixel;}
... et tu la redéclares dans Image8 (avec le virtual), qui pourtant hérite déjà d'Image. Dans les classes dérivées, il faut donner corps aux fonctions, c'est tout (pas de virtual à rajouter).
vlamy a écrit :Sinon, je te conseillerais plutôt un forum de programmation du genre "developpez", car je ne vois pas encore le rapport de ton problème avec Archlinux :)
+1
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17618
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Prog] Erreurs de compilation C++

Message par benjarobin »

Aucun rapport avec Qt, mais tout d'abord je trouve que tu sur-utilise le mot clé virtual, ou alors tu n'as pas bien compris sa signification.
De plus virtual ~Image(); ne possède pas d'implémentation : Ni dans le .h ni dans le .cpp
Il y a surement encore beaucoup d'erreur de ce genre
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
eatman
archer
Messages : 112
Inscription : mer. 13 avr. 2011, 13:18
Localisation : France - Isère (38)

Re: [Prog] Erreurs de compilation C++

Message par eatman »

J'ai posté sur le SDZ et effectivement, rajouter {} au destructeur a suffit à compiler sans erreurs.
J'ai viré le mot virtual des getters qui ne seront jamais redéfinies.

Cependant ma méthode getPixel(i,j) segfault à tous les coups, quels que soient les indices, c'est assez frustrant :)
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17618
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Prog] Erreurs de compilation C++

Message par benjarobin »

Il faudrait que tu donne un exemple concret dans un .tar.gz car là il est difficile d'aider
Tout d'abord il y a 0 ligne de commentaire, les variables ne sont pas du tout explicite, l'indentation est beaucoup trop dense, aucune protection qui peut être désactivable à la compilation (assert), bref je en suis pas fan :-)
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Prog] Erreurs de compilation C++

Message par FoolEcho »

eatman a écrit :Cependant ma méthode getPixel(i,j) segfault à tous les coups, quels que soient les indices, c'est assez frustrant :)
Comme dit précédemment (même si on n'est pas encore trop nul sur le sujet visiblement :) ), il faut mieux que tu voies sur un site spécialisé.
Conseil perso (mais bon, grosses habitudes de développement objet): quand je fais du c++/Qt (je m'y suis remis récemment :) ), je laisse tomber la programmation bas-niveau ( :troll: le c est une tambouille infâme, tandis qu'en faisant du c++ et assimilés dépouillé de ce bas-niveau et en faisant n'importe quoi on finit toujours par y arriver. :humour: :pastaper: :merci: :troll:).

Conseil plus pratique si tu veux poursuivre ici (mais il faudrait les fichiers à jour): l'initialisation de ton tableau est sans doute foireuse. À supposer qu'on parle des mêmes choses, on voit un char* _pixel = new char[size()]; dans ta classe Image (dont je ne vois pas à quoi il peut bien te servir soit dit en passant), tandis que ton Image8 traite aussi d'un tableau _pixel (qui ne peut être le même que le précédent mais vu qu'il s'appelle pareil, j'ai peur que le type coince), sauf que tu lui cases des int (ah magie du c :P )...

Et donc: +1 avec benjarobin.
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17618
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Prog] Erreurs de compilation C++

Message par benjarobin »

Remplace

Code : Tout sélectionner

char* _pixel = new char[size()];
par

Code : Tout sélectionner

_pixel = new char[size()];
Merci FoolEcho

Sinon ceci ne serait pas arrivé avec l'activation des warnings qui vont bien, pour le C et le C++

Code : Tout sélectionner

-Wall -Wextra -Wunused -Wshadow -Wcast-qual
et je rajoute ceci pour le C

Code : Tout sélectionner

-std=gnu99 -Wmissing-prototypes
Dans ton cas -Wshadow t'aurait indiqué le soucis

@FoolEcho Quand on comprend le C correctement on peut coder correctement en C++, sinon cela donne de la $%µ*@
Et qu'est ce que tu as contre le C :D :copain:
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Prog] Erreurs de compilation C++

Message par FoolEcho »

benjarobin a écrit :Et qu'est ce que tu as contre le C :D :copain:
Pas assez carré pour moi... ayant une "grosse" culture objet (essentiellement java "en plus"), je n'ai rien contre le c++ "classieux", bien au contraire (passé le temps d'adaptation)... mais dès qu'il y a des éléments de c (je parle de gymnastique plus ou moins tordu sur les pointeurs où il faut s'arrêter une heure pour comprendre ce qui est fait... ou la magnifique et classique "erreur de segmentation" qui survient sans qu'on arrive à retrouver le pourquoi du comment :evil: ) ça me file des boutons (je ne te parle même pas de l'assembleur... car comme on me l'a fait remarqué sur un autre sujet, je n'ai aucune logique, c'est très pénalisant pour développer :lol: ). :mrgreen:

Mais comme tu vois, même sur des éléments un brin fouilli, mal (non) documenté, j'arrive encore à voir les trucs qui coincent. :D
«The following statement is not true. The previous statement is true.» :nage:
Répondre