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 :

Type incompatible float* et float[3]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut Type incompatible float* et float[3]
    Bonjour à tous,

    Je débute en C++ et j'essaye de créer la classe Triangle avec un constructeur à trois arguments (les coordonnées des points en 3D) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Triangle {
    public:
    	Triangle(float x[3], float y[3], float z[3]);
     
    private:
    	float x[3], y[3], z[3];
    };
    Maintenant lorsque je définis mon constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Triangle::Triangle(float x[3], float y[3], float z[3]){
    	this->x = x; this->y = y; this->z = z;
    }
    et que je compile, j'obtiens l'erreur de compilation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../src/shapes/triangle.cpp:11:12: error: incompatible types in assignment of ‘float*’ to ‘float [3]
    Quelle est l'erreur ici?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    x[3] crée 3 variables x[0], x[1] & x[2].
    Tu ne peux pas assigner 3 variables de cette façon.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 757
    Par défaut
    float x[3] c'est 1 tableau C - tu as 3 cases contiguës (accessible avec la syntaxe crochet [] et les indices commencent à 0 - "0-based indexing").
    Comme c'est un POD ("Plain Old Data"), tu n'as pas les affectations

    Soit, il faut recopier case par case ( this->x[0] = x[0]; this->x[1] = x[1]; this->x[2] = x[2];) soit appeler la fonction memcpy (<- lien cplusplus.com en anglais)

    Il avoir un objet avec l'opérateur d'affectation (operator =) Donc soit std::vector (ou 1 autre containeur STL) soit faire ta propre classe Vertex avec 3 membres flottants x, y, z.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut
    Super, merci pour vos réponses.

    Est-ce aussi envisageable de passer x, y et z par pointeur plutôt que par valeur dans le cas d'un tableau?

    Si j'utilise ma propre classe Vertex, ce sera par pointeur comme ça (en ayant défini le type des attributs de Triangle en Vertex *) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Triangle::Triangle(Vertex *x, Vertex *y, Vertex *z){
        this->x = x; this->y = y; this->z = z;
    }

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 757
    Par défaut
    Citation Envoyé par johhry Voir le message
    Est-ce aussi envisageable de passer x, y et z par pointeur plutôt que par valeur dans le cas d'un tableau?
    Si x, y, z sont des valeurs (entières ou flottantes) cela ne sert à rien de passer des pointeurs


    Citation Envoyé par johhry Voir le message
    Si j'utilise ma propre classe Vertex, ce sera par pointeur comme ça (en ayant défini le type des attributs de Triangle en Vertex *)
    Apprends le C++ et non pas le C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Triangle::Triangle(const Vertex& input_x, const Vertex& input_y, const Vertex& input_z){
        x = input_x; y = input_y; z = input_z;
    }
    avec (à vérifier)
    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
    #include <iostream>
     
     
    class Vertex {
    public:
     
        Vertex(float init_x=0.0, float init_y=0.0, float init_z=0.0) :
            x(init_x), y(init_y), z(init_z) {}
     
        Vertex(const Vertex& other) :
            x(other.x), y(other.y), z(other.z) {}
     
     
    public:
     
        Vertex& operator= (/*const*/ Vertex& rhs)  {
            x = rhs.x;
            y = rhs.y;
            z = rhs.z;
     
            return (*this);
        }
     
     
        friend std::ostream& operator<< (std::ostream&, const Vertex&);
     
     
    private: // or public
     
        float x;
        float y;
        float z;
    };
     
     
    std::ostream& operator<< (std::ostream& os, const Vertex& v) {
        os << "[x: " << v.x << ", y: " << v.y << ", z: " << v.z << "]";
     
        return os;
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut
    Bonjour,

    Merci pour votre réponse!

    C'est vrai que j'ai d'abord appris le C avant le C++.
    Cependant, d'un point de vue de la création d'un objet, en redéfinissant l'opérateur d'égalité pour la classe Vertex, l'instruction suivante (dans Triangle) :

    créé un nouvel objet de type Triangle et lui recopie les valeurs de input_x.
    En Java par exemple, on passe un objet par référence mais il n'y aurait pas de création d'un nouvel objet.

    Pourquoi utiliser les références plutôt que les pointeurs?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Erreur "TypeError: unorderable types: NoneType() < float()"
    Par Kartox dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 06/01/2018, 09h57
  2. [MYSQL] Quel type de float utiliser?
    Par yupyupxav dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/04/2013, 10h32
  3. Conversion du type int à float
    Par @yoyo dans le forum Débuter
    Réponses: 9
    Dernier message: 16/01/2008, 12h22
  4. pb - résultat de type double/float arrondi
    Par Ayana dans le forum Langage
    Réponses: 38
    Dernier message: 23/10/2007, 20h05
  5. [LG]Problême "types incompatibles"
    Par pierrOPSG dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2004, 21h34

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