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 :

Pointeurs et passage par référence


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut Pointeurs et passage par référence
    Bonjour,

    j'ai appris le C++ il y a bien longtemps et je doit m'y replonger mais j'ai un petit problème avec mon code... Je passe deux tableaux "reel" et "imag", dans la fonction et aimerai que ces deux vecteurs soient remplacer par 2 autres contenant la même information mais dont la taille du tableau est une puissance de 2 (la première puissance au-dessus de la taille d'origine). Dans ma fonction, les vecteurs "reel" et "imag", à la sortie de ma fonction, aucune modification .

    code:

    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
    float nextPowOfX(float n,float X){
        /* return the next power of X greater than the number n */
        float result=1.0;
        if (n==0.0 or X==0.0)
        {
            printf("erreur function preTreat in fft.cpp line 65: essaye de trouver une puissance "
                   "de base null ou une valeur nulle. Programme continue avec retour 1");
        }
     
        else{
            result = ceil(log(n)/log(X));
        }
        return result;
    }
     
    void init(float *ma,int n,float *temp=NULL,int lg=NULL){
        for (int i=0;i<n;i++){
            if (lg==NULL){
                ma[i]=0;
            }
            else{
                if(i<lg){
                    ma[i]=temp[i];
                }
                else{
                    ma[i]=0;
                }
            }
        }
    }
    void preTreat(float *reel, float *imag,int length){
        float nP=nextPowOfX(length,2.0);
        int lt=(int) pow(2,nP);
        float *r;
        float *i;
        r=new float[lt]; // r[lt];
        i=new float[lt]; //i[lt];
        init(r,lt,reel,length);
        init(i,lt,imag,length);
     
        reel=r;
        imag=i;
        for(int j =0;j<8;j++)
        {
            cout<<reel[j]<<"  ";
        }
        cout<<endl;
    }
    j'ai oublier qu'il s'agissait de la fonction preTreat. et donc à l'intérieur tout se passe comme je veux; à l'extérieur tout disparais. J'ai l'impression que le pointeur n'est pas passé par référence... J'ai trouver une réponse qui consiste à rajouter un '&' après le '*' dans la déclaration de la fonction... mais le programme l'accepte pas.

    invalid initialization of non-const reference of type 'float*&' from a temporary of type 'float*'.

  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 : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    oui il faut "ajouter un &", ce qui s'apelle un passage par référence.
    Revois ton cours sur les pointeurs et passages de paramètres.
    Par défaut un paramètre est toujours une copie, sauf si on précise qu'il s'agit d'une référence.

    Quant à ton erreur, il faudrait voir l'appel de la fonction.

    Par ailleurs, le forum est doté d'une balise CODE qu'il convient d'utiliser. Bouton # de la barre d'outils du message.
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    ok thanks pour la réponse. Pour le passage par référence justement c'est ce que j'ai fait en premier mais il y a une erreur.
    j'appelle la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    float reel[5];
    float im [5];
     for(int i=0;i<5;i++)
     {
         reel[i]=i+1;      // initialisation des valeurs de reel et de im
         im[i]=pow(i,2);
        }
     
     
        preTreat(reel,im,5);

    Et dans le header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float nextPowOfX(float n,float X);
    void preTreat(float *&reel, float *&imag,int length);
    je recharge le code:
    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
    float nextPowOfX(float n,float X){
    /* return the next power of X greater than the number n */
    float result=1.0;
    if (n==0.0 or X==0.0)
    {
        printf("erreur function preTreat in fft.cpp line 65: essaye de trouver une puissance de base null ou une valeur nulle. Programme continue avec retour 1");
      }
     
    else{
        result = ceil(log(n)/log(X));
      }
    return result;
    }
    void init(float *ma,int n,float *temp=NULL,int lg=NULL){
        for (int i=0;i<n;i++){
            if (lg==NULL){
                ma[i]=0;
            }
            else{
                if(i<lg){
                    ma[i]=temp[i];
                }
                else{
                    ma[i]=0;
                }
            }
        }
    }
    void preTreat(float *&reel, float *&imag,int length){
        float nP=nextPowOfX(length,2.0);
        int lt=(int) pow(2,nP);
        float *r;
        float *i;
        r=new float[lt]; // r[lt];
        i=new float[lt]; //i[lt];
        init(r,lt,reel,length);
        init(i,lt,imag,length);
     
        reel=r;
        imag=i;
        for(int j =0;j<8;j++)
        {
            cout<<reel[j]<<"  ";
        }
        cout<<endl;
    }

  4. #4
    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 : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    L'erreur est claire, ton reel et imag sont des temporaires, et des tableaux.
    Ta fonction attend des pointeurs.

    Ta fonction en plus alloue de la taille pour les pointeurs et modifie les pointeurs passés en paramètres, ce qui est interdit.
    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.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si on est bien en C++, on utilise des std::vector<> et on n'a pas toutes les confusions entre tableau et pointeur que laissent trop souvent un mauvais enseignement du C.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    ok merci Bousk.
    Maintenant ca marche (remplacé reel et im par des pointeurs).
    Ma fonction doit allouer de la mémoire pour pouvoir créer de nouveaux tableaux. J'avait effacer la petite ligne qui désaloue reel et imag avant...

    Thanks

Discussions similaires

  1. Passage par référence versus par pointeur
    Par Seabast888 dans le forum Débuter
    Réponses: 14
    Dernier message: 14/09/2009, 18h17
  2. [pointeur][passage par référence] Perte des valeurs.
    Par ced600 dans le forum Débuter
    Réponses: 13
    Dernier message: 05/09/2008, 18h44
  3. Passage par référence/pointeur
    Par NiamorH dans le forum C++
    Réponses: 5
    Dernier message: 15/07/2008, 10h05
  4. Réponses: 10
    Dernier message: 27/06/2008, 14h16
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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