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 :

Paramètre de fonction non reconnu dans la fonction


Sujet :

C++

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut Paramètre de fonction non reconnu dans la fonction
    Bonjour
    Je code actuellement un moteur physique mais hier est "apparu une erreur" sans raison apparente (en fait si j'ai mal codé). Une erreur est apparu dans ma classe Vector3D dont voici le code :
    Vector3D.h
    Vector3D.hpp
    Et après de vaine recherche en compilant sur VC++ Express et G++. Je viens vous demandez conseil.
    G++ me dit :
    Citation Envoyé par g++
    /Vector3D.hpp:404: error: expected `,' or `...' before '<' token
    /Vector3D.hpp:405: error: ISO C++ forbids declaration of `Matrix4x4' with no type
    /Vector3D.hpp:405: error: `eMV::Vector3D<T> eMV::operator*(int)' must have an argument of class or enumerated type
    /Vector3D.hpp: In function `eMV::Vector3D<T> eMV::operator*(int)':
    /Vector3D.hpp:408: error: `v' undeclared (first use this function)
    /Vector3D.hpp:408: error: (Each undeclared identifier is reported only once for each function it appears in.)
    /Vector3D.hpp:412: error: `m' undeclared (first use this function)
    Je ne comprend pas les erreurs mais alors ceux en gras je suis même contre v et m sont des paramètres de la fonction
    Citation Envoyé par VC++
    \Vector3D.h(89) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    \Vector3D.h(89) : error C2143: erreur de syntaxe : absence de ',' avant '<'
    \Vector3D.h(89) : error C2803: 'operator *' doit avoir au moins un paramètre de type classe
    \Vector3D.hpp(404) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    \Vector3D.hpp(404) : error C2143: erreur de syntaxe : absence de ',' avant '<'
    \Vector3D.hpp(429) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
    Si vous avez regarder mon code vous avez sûrement remarquer que je retourne l'adresse d'une variable temporaire mais ce funeste artifice est là pour que VC++ me laisse tranquille avec tous ces Warning.
    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par SKone Voir le message
    Je ne comprend pas les erreurs mais alors ceux en gras je suis même contre v et m sont des paramètres de la fonction
    En général seule la toute première erreur compte car souvent elle entraîne les suivantes en cascade.

    Donc ici le problème est ligne 404 de Vector3D.h, et c'est parce que le type Matrix4x4 est inconnu.
    Il manque peut-être un include ?

    MAT.

  3. #3
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Et bien non si ça avait été aussi simple j'aurais déjà "solver" le problème.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Peux-tu nous montrer le fichier Matrix4x4.h stp?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par SKone Voir le message
    Bonjour
    Je code actuellement un moteur physique mais hier est "apparu une erreur" sans raison apparente (en fait si j'ai mal codé). Une erreur est apparu dans ma classe Vector3D dont voici le code :
    Vector3D.h
    Vector3D.hpp
    Et après de vaine recherche en compilant sur VC++ Express et G++. Je viens vous demandez conseil.
    G++ me dit :

    Je ne comprend pas les erreurs mais alors ceux en gras je suis même contre v et m sont des paramètres de la fonction

    Citation Envoyé par SKone Voir le message
    Si vous avez regarder mon code vous avez sûrement remarquer que je retourne l'adresse d'une variable temporaire mais ce funeste artifice est là pour que VC++ me laisse tranquille avec tous ces Warning.
    Pas de problème - si ce n'est que ça plantera sûrement au runtime. Mais tu dois déjà le savoir (qui plus est, le code après le return est non-reachable; il ne sera pas exécuté).

    Bon, en fait, le code de la fonction en ligne 404 est mauvais au possible. J'y vois 6 memory leak et du code non exécuté qui produiraient un seg-fault si il l'était.

    Pour ce qui est de ton erreur, je ne vois pas. Mais ça a certainement un lien avec le header de Matrix4x4, ou la façon dont Vector3D.hpp est inclus (peut être dans un autre fichier, au lieu d'include Vector3D.h).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    voilà le code Matrix4x4 :
    Matrix4x4.h
    Matrix4x4.hpp
    Matrix4x4.hpp est plein d'erreur dont l'inverse de la matrice en TODO...

    Et pour les leak tu proposes quoi comme rectificatif ?

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par SKone Voir le message
    voilà le code Matrix4x4 :
    Matrix4x4.h
    Matrix4x4.hpp
    Matrix4x4.hpp est plein d'erreur dont l'inverse de la matrice en TODO...

    Et pour les leak tu proposes quoi comme rectificatif ?
    #include "Vector3D.h" qui fait un #include "Matrix4x4.h" qui fait un #include "Vector3D.h", etc, ça risque fort de poser problème... Les références circulaires sont a éviter (parce que ça ne marche pas vraiment très bien).

    Pour corriger ce problème, tu peux utiliser des forward reference:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // avant la déclaration de la classe Matrix4x4
    template <class T> class Vector3D;
     
    // avant la déclaration de la classe Vector3D
    template <class T> class Matrix4x4;
     
    // avant la définition des fonctions de Matrix4x4 (dans Matrix4x4.hpp)
    #include "Vector3D.h"
     
    // avant la définition des fonctions de Vector3D (dans Vector3D.hpp)
    #include "Matrix4x4.h"
    En ce qui concerne tes mémory leak: pourquoi est-ce que tu alloues des zones mémoires pour ensuite perdre leur référence lorsque tu fais v.getArray() ou m.getArray4x4() ? l'opérateur = n'effectue pas la copie des données du tableau dans les zones mémoires allouées - il se contente de copier la valeur du pointeur dans la variable pointeur que tu utilises.

    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
     
    // la sémantique mathématique est a revoir: il est impossible, 
    // mathématiquement, de multiplier une matrice 4x4 par un 
    // vecteur 1x3. Je te conseille de renommer cette fonction
    // selon l'opération qui est réellement effecutée (projection ? 
    // rotation ? transform ?...). 
    // Ton code effectue une multiplication entre la matrice 3x3 
    // supérieure gauche et un vecteur 1x3. La solution pourrait 
    // consister a faire une fonction qui extrait la matrice 3x3 en 
    // question dans une classe Matrix3x3 et de coder l'opérateur
    // Vector3D operator*(const Matrix3x3&, const Vector3D&).
    template <class T>
    Vector3D<T>  operator*(const Matrix4x4<T> &m, const Vector3D<T> &v)
    {
    // on crée la valeur de retour et on l'initialise directement
        Vector3D<T> ret(0,0,0);
    // le bloc alloué ici est perdu a cause de la ligne suivante
    //  T *Tb = new T[16];
    // écrase la valeur de Tb courante
    //  Tb = v.getArray();
    // les blocs alloués ici sont perdus à cause de l'affectation suivante
    //  T **mat = new T*[4];
    //  for (int i = 0; i < 4; i++)
    //      mat[i] = new T[4];
    // écrase la valeur de mat courante
    //  mat = m.getArray4x4();
    // ---------
    // on remplace le tout par 2 appels de fonction, qui renvoie les
    // tableaux necessaires au calcul. Puisque ceux ci ne sont pas
    // modifiés, pas besoin de copie:
    // on peut d'ailleurs se passer de Tb, donc je le met directement
    // en commentaire
    //  T* Tb = v.getArray();
        T** mat = m.getArray4x4();
    // ça, on va pas en avoir besoin
    //    T S = 0;
    // on ré-écrit la boucle; on va travailler sur ret directement.
        T* Tret = ret.getArray();
    // la boucle elle même.
    // Comme je l'ai dit plus haut, ton code semble faire une multiplication 
    // de la matrice 3x3  supérieure gauche: S est discardé si i == 3 donc
    // l'exécution de "S += mat[i][j]*v[j];" ne sert à rien si i == 3. Tu peux 
    // changer la condition d'arrêt sur i, ce qui t'évite de faire un test à 
    // l'intérieur de la boucle.
        for (int i=0; i<3; ++i)
        {
            for (int j=0; j<3; ++j)
            {
                Tret[i] += mat[i][j] * v[j];
            }
        }
    // et bien sur, tout ça vire... (d'autant plus que ça n'est pas correct:
    // Tb pointe sur les données de v, donc elles sont modifiées au fur et
    // à mesure du calcul...)
    //  for (int i = 0; i < 4; i++)
    //  {
    //      for (int j = 0; j < 3; j++)
    //          S += mat[i][j]*v[j];
    //      if (i < 3)
    //          Tb[i] = S;
    //      S = 0;
    //  }
    // Plus besoin de ça puisque ret est correctement initialisé...
    //  ret.x = Tb[0];
    //  ret.y = Tb[1];
    //  ret.z = Tb[2];
    // soyons fous: retournons une copie de ret!
    //  return Vector3D<T>(ret.x, ret.y, ret.z);
        return ret;
    // code non atteint - et tant mieux...
    //   for(int i = 0; i < 4; i++)
    //      delete [] mat[i];
    //  delete [] mat;
    }
    Voilà. C'est plus clair (enlève les commentaires: il ne reste plus que 11 lignes de code - et encore: on compte les 4 lignes d'accolades liées à la boucle - au lieu de 23 lignes de code complexe et non fonctionnel.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Merci, Merci Tous est résolu enfin presque...
    Je te demande encore un petit truc.
    Quand j'utilise mes vecteurs seul ça marche les Matrices seul ça marche mais quand je défini 2 objets un Vector3D puis un Matrix4x4 alors en fonction de l'ordre des inclusions de mes fichiers Vector3D.h et Matrix4x4.h l'un est reconnu et pas l'autre.

  9. #9
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    c'est bon résolu il faut juste ne pas mettre les includes dans les *.hpp

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

Discussions similaires

  1. Objet existant reconnu dans une fonction mais pas dans une autre
    Par Jiyuu dans le forum Général Python
    Réponses: 0
    Dernier message: 20/09/2011, 18h19
  2. copie d'une variable non reconnue dans une fonction
    Par paragoge dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 27/10/2009, 13h30
  3. fonction javascript non reconnues dans ECLIPSE
    Par flamant dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/06/2009, 15h58
  4. Fonction non reconnue dans birt viewer
    Par jsatriani dans le forum BIRT
    Réponses: 1
    Dernier message: 03/12/2008, 10h36
  5. Critère non reconnu dans la fonction DCount
    Par Ps4 dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 09h02

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