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 :

Probl�me de compilation avec un tableau pass� � une fonction


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par d�faut Probl�me de compilation avec un tableau pass� � une fonction
    Bonjour � tous,
    J'ai un soucis avec un code qui, j'ai l'impression, est pourtant tout b�te...
    Voil� l'id�e : j'ai 2 fichiers s�par�s.
    Le fichier 1 comporte 2 fonctions :
    - une fonction de cr�ation d'un tableau de coefficients :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double* init_scale(int Ncol, ...)
    {
    	double *coefs = new double [Ncol*2];
    	// Remplissage du tableau coefs
    	for (j=0;j<Ncol;j++)
    	{
    		coefs[2*j] = (b-a)/(xmax - xmin);
    		coefs[2*j+1] = a - xmin * coefs[2*j];
    	}
    Je ne mets cet extrait de code que pour info sur la construction de coefs, il fonctionne en effet tr�s bien.

    - une fonction de calcul d'une data � partir de ces coefficients :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void scale(double* data, int ind, double* coefs)
    {
    	data = coefs[2*ind] * data + coefs[2*ind+1]; // Ligne où a été détecté une erreur par le compilateur
    }
    Dans mon deuxi�me fichier, j'ai plusieurs fonctions dont notamment la fonction main(...) et une fonction qui fait appel � scale(...) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void predict(double* coefs, ...)
    {
    	int ind = 0;
    	double fbuff = 0.;
    	// Boucle sur ind
    	// Donne une valeur non nulle à fbuff, puis :
    	scale(&fbuff,ind,coefs);
    	// Utilisation de fbuff, fin du code
    }
    Je veux donc passer mon tableau de coefs � la fonction scale pour qu'elle modifie la valeur de fbuff (qui est donc pass� comme pointeur). Or, quand j'essaye de compiler, j'obtiens l'erreur suivante :
    error C2297: '*' : non conforme, l'op�rande droit est du type 'double *'

    J'ai cherch� mais je ne vois pas o� est l'erreur dans mon code... Merci de m'aider � y voir plus clair !

  2. #2
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour,
    Tu d�clare data comme pointeur et tu l'utilises comme variable. Il faut choisir :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void scale(double* data, int ind, double* coefs)
    {
    	*data = coefs[2*ind] * (*data) + coefs[2*ind+1]; // Ligne où a été détecté une erreur par le compilateur
    }
    Quelques remarques :
    1/Si tu veux changer la valeur de data, nul besoin de passer par des pointeurs. Tu peux utiliser les r�f�rences :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void scale(double& data, int ind, double * coefs)
    {
    	data = coefs[2*ind] * data + coefs[2*ind+1];
    }
    2/ Si coefs n'a pas vocation � �tre modifi�, alors passe-le par const :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void scale(double& data, int ind, double const * coefs)
    {
    	data = coefs[2*ind] * data + coefs[2*ind+1];
    }
    3/ Si tu veux vraiment avoir moins de soucis, utilises des conteneurs (std::vector semble appropri� � ton cas) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     init_scale(int Ncol, std::vector<double> &vect_)
    {
            vect_.resize(Ncol*2);
    	// Remplissage du tableau coefs
    	for (j=0;j<Ncol;j++)
    	{
    		vect_[2*j] = (b-a)/(xmax - xmin);
    		vect_[2*j+1] = a - xmin * vect_[2*j];
    	}
    etc...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par d�faut
    Merci pour vos r�ponses tr�s rapides !

    Citation Envoy� par 3DArchi Voir le message
    Bonjour,
    Tu d�clare data comme pointeur et tu l'utilises comme variable. Il faut choisir :
    Oups, c'�tait donc �a

    Merci aussi pour tes remarques judicieuses ! Du coup, j'ai pr�f�r� passer data par r�f�rence. J'avais aussi bien pr�vu de passer coefs en const, parce qu'il ne doit pas �tre chang� (comme tu l'as bien imagin�), mais j'avais laiss� un peu �a de c�t� le temps de r�soudre mon erreur. J'ai donc � pr�sent ce code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void scale(double& data, int ind, double const * coefs)
    {
    	data = coefs[2*ind] * data + coefs[2*ind+1];
    }
    et cette nouvelle erreur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    1>Édition des liens en cours...
    1>svmclassifier.obj : error LNK2019: symbole externe non résolu "void __cdecl scale(double,int,double const *)" (?scale@@YAXNHPBN@Z) référencé dans la fonction "void __cdecl predict(double *,char const *)" (?predict@@YAXPANPBD@Z)
    1>...\svmClassifier\Debug\svmClassifier.exe : fatal error LNK1120: 1 externes non résolus
    svmclassifier �tant mon Fichier2. C'est la premi�re fois que je vois �a... Je pr�cise que je travaille sous Windows avec Visual Studio 2005.


    Pour le coup du conteneur vector, j'avoue ne pas avoir le r�flexe encore (j'ai commenc� le C++ en Octobre 2008, et pas beaucoup pratiqu� en dehors des cours). Comme vous �tes deux � m'en parler, je comprends bien que c'est beaucoup plus appropri� ! Je vais modifier �a apr�s, � moins que �a n'arrange mes affaires concernant l'erreur au-dessus ? Je vais voir �a, en tout cas.

  4. #4
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Ton erreur est due � une diff�rence entre la d�claration et la d�finition : tu as oubli� la r�f�rence dans la d�claration...
    Je te conseille vivement de passer par les std::vector. C'est fait pour g�rer un tableau sans se soucier des probl�mes d'allocation.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par d�faut

    D�cid�ment... on va dire que c'est Vendredi et que c'est pas facile...
    C'�tait bien �a, merci !

    Je vais de ce pas transformer mon tableau coefs en vecteur !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par d�faut
    Bouh >___<
    J'ai chang� mon tableau coefs en conteneur vector. J'ai fait attention (mais peut-�tre pas assez, visiblement) � ce que ce soit bien coh�rent partout o� il appara�t dans le code, et que mes d�finitions et d�clarations de fonctions soient bien les m�mes.
    Et j'obtiens deux erreurs � la compilation, portant sur une "erreur de syntaxe" avec un point virgule qui semble manquer :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    1>Compilation en cours...
    1>svmclassifier.cpp
    1>c:\program files\microsoft visual studio 8\vc\include\dos.h(34) : error C2144: erreur de syntaxe*: 'int' doit être précédé de ';'
    1>coefsScaleSVM.cpp
    1>e:\svm\svmclassifier\src\coefsscalesvm.cpp(10) : error C2144: erreur de syntaxe*: 'void' doit être précédé de ';'
    La premi�re erreur renvoie sur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    #ifdef  __cplusplus
    extern "C" { // ICI
    #endif
    dans le fichier dos.h
    (� noter que dans mon fichier principal svmclassifier.cpp, j'ai les lignes suivantes :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    #ifdef _WIN32
    #include <dos.h>
    #include <conio.h>
    #endif
    )

    Le deuxi�me erreur renvoie sur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <vector>
    #include <cfloat>
    #include "svm.h"
    #include "coefsScaleSVM.h"
     
    /**
    * Calcule les coefficients de mise à l'échelle des données
    * et mise à l'échelle des données d'apprentissage
    */
    //double* init_scale(svm_node** X, int Nrow, int Ncol, double Na, double Nb)
    void init_scale(svm_node** X, std::vector<double> &vect_, int Nrow, int Ncol, double Na, double Nb) // ICI
    {
    ...
    dans coefsScaleSVM.cpp.

    Dans les deux cas, je ne vois m�me pas le rapport avec le message d'erreur...
    Je peux avoir encore un peu d'aide, s'il vous pla�t ?...

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Attention au fait que ton argument data est un pointeur...

    C'est � dire que, si tu ne pr�cise pas que tu veux travailler avec "ce qui est point�" par data, tu va modifier... l'adresse m�moire qui est point�e par data...
    Pour l'instant, ta formule essaye de faire
    data (pointeur) = coef[2*ind](pas pointeur)* data(pointeur)+coef[2*ind+1](pas pointeur)...

    Il faut donc faire de mani�re � ne travailler qu'avec des pointeurs (mais cela ne donnera pas le r�slutat souhait�, dans ce cas) ou qu'avec des... "non pointeurs", ce qui te donnera le r�sultat souhait�.

    Tu dois donc transformer la formule en
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    (*data) = coef[2*ind] * (*data) +coef[2*ind+1];
    Ceci dit, L'utilisation des pointeurs est de nature � apporter �norm�ment de probl�mes, ainsi que tu as pu t'en rendre compte...

    C'est pourquoi on conseille toujours de pr�f�rer les conteneurs fournis par le standard comme, par exemple la classe vector, disponible dans l'espace de noms std par inclusion du fichier d'en-t�te <vector>, qui fourni exactement les m�mes comportement qu'un tableau allou� dynamiquement, mais avec une s�curit� et une facilit� d'utilisation bien sup�rieure.

    C'est aussi pourquoi on conseille de pr�f�rer l'utilisation de r�f�rence lorsqu'il s'agit, simplement, de s'assurer que les modification apport�es dans une fonction � un argument de celle-ci soient r�percut�es dans la fonction appelante...

    Une autre solution pour t'�viter d'avoir � manipuler data sous la forme d'un pointeur est de modifier le prototype de ta fonction scale en
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    double scale(double data, int ind, double* coefs)
    {
        data = coefs[2*ind] * data + coefs[2*ind+1];
        return data;
    }
    et son appel en
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    buf = scale(fbuff,ind,coefs);
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [JpGraph] Erreur avec le tableau dans une fonction
    Par gtraxx dans le forum Biblioth�ques et frameworks
    R�ponses: 4
    Dernier message: 12/01/2009, 21h01
  2. Conna�tre le nom d'un tableau pass� � une fonction
    Par amundsen dans le forum G�n�ral JavaScript
    R�ponses: 1
    Dernier message: 28/12/2008, 21h35
  3. probl�me avec un tableau pass� en param�tre
    Par curley dans le forum D�buter
    R�ponses: 1
    Dernier message: 28/10/2007, 02h54
  4. Probl�me de compilation avec Dev-C++
    Par Rouliann dans le forum Dev-C++
    R�ponses: 14
    Dernier message: 14/06/2004, 18h44
  5. R�ponses: 1
    Dernier message: 29/10/2003, 12h16

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