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 :

Passage d'un tableau par référence?


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut [Résolu] Passage d'un tableau par référence?
    Bonjour,


    j'ai une fonction principale qui contient un appel de fonction:
    où V est un tableau à une dimension, dont je ne dois passer que certains éléments (d'où le '+k').
    La fonction dscal utilise ensuite V sous le nom de 'dx'.

    Mon problème, c'est que dans la fonction dscal, le tableau dx est vide (alors qu'il devrait donc contenir V).

    J'ai essayé le passage par référence en appelant
    puis en utilisant des pointeurs sur dx dans la fonction dscal, mais ça ne marche pas non plus.

    Est ce que quelqu'un aurait une idée?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Par défaut
    tout d abord le passage par reference n'existe que en C++ eh oui dsl

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Par défaut
    ensuite qd tu a declaré ton tableau dans ta fonction principale il a un nom (un pointeur sur valeur) ici V tu le passe en parametre en le decalant de K tu le renomme dx dans ta fonction dscal? est ce que le prototype de ta fonctio scal est : <valeur> dscal (<valeur> * dx); ? met un peu plus de code et <valeur> correspond a tes valeur ( int char..) je sai spo mais j aimerai bien savoir...

  4. #4
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Citation Envoyé par kalifornication
    tout d abord le passage par reference n'existe que en C++ eh oui dsl
    Ca existe en C aussi ! Ce code marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     int a =5 ;
    int b= 6 ;
    add(&a,&b) ;
    C'est bien par reference (l'adresse) qu'on a passé les deux variables.

    Sinon pour le problème de Sebduth, j'ai pas trop compris.
    T'as un tableau qui contient des valeurs par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int tab[5] ;
    tab[0]=0;
    tab[1]=1;
    ...
    tab[4]=4 ;
    et ensuite tu veux passer a la fonction ce tableau seulement avec les valeurs à partir de l'indice 2 par exemple ?
    Si c'est ca , il y a plusieurs solutions dont celle-ci :

    tu passes le tableau en entier et en second argument, la valeur de "k", donc un entier qui détermine a partir d'ou le tableau sera utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     dscal(int *tableau, int k) ;
    dscal(V,2) ;
    Comme l'a dit Kalifornication, ca serait bien d'avoir un peu de code

    Nas'

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Par défaut
    Nasky un vrai passage par reference tu met pas le "&" au moment ou tu appel la fonction mais dans le prototype et la declaration de la fonction et ensuite qd tu passe les parametre tu fais comme si tu les passai par valeur!!!! exemple en c++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void test (int &entier)
    {....}
    void main (void)
    {
    int a=2;
    test(a);
    ...
    }
    ceci est un vrai passage par reference sinon ce que tu as fait c'est un passage par adresse (au final c'est plus ou moins pareil) nasky
    mais dans ce cas il n'a pas besion de passer l'adresse du pointeur il faut qu il passe le pointeur sur le tableau incrementé de son index donc reste a ta premiere soluce sebduth (sans le passage par adresse)
    ensuite faire ceci ne t'es pas tres utile :Code:
    dscal(int *tableau, int k) ;
    dscal(V,2)
    parce que dans t a fonction tu devras ajouter ton pointeur etton index passé en parametre

    attention tu as dis
    Mon problème, c'est que dans la fonction dscal, le tableau dx est vide (alors qu'il devrait donc contenir V).
    il devrai contenir les valeur a partir de V+k
    et ton code serait le bien venu...

  6. #6
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Dsl pour le passage par reference je savais pas que c'était ca le "vrai" (dans les cours de C, on parle quand meme de passage par reference, et dans le prototype on met fonction(int *x) ; puis on passe & a la fonction, mais c pareil!)

    Pour ma fonction, j'ai pas compris pk on aura besoin d'un ptr ?:
    parce que dans t a fonction tu devras ajouter ton pointeur etton index passé en parametre
    En passant l'index, si il veut uniquement les valeurs (t'as bien fait de le souligner), il fera cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i=k ; i<SIZE ; i++)
    printf("%d " , tableau[i]) ;
    Il a donc bien les valeurs a partir de l'indice k : pourquoi un ptr ?

    Par contre, sebduth , si tu veux modifier ce tableau dans ta fonction, tu ne pourras pas !! Là, il faudra passer le tableau par reference car la fonction créer une copie de ton tableau dans la pile (stack) et l'adresse des éléments de ton tableau dans la fonction ne sera pas la meme que dans le main(), d'ou l'impossibilité de changer de valeur.
    Il faudra faire le prototype suivant (en gardant tjs mon idée de passer l'indice k et supposant que la fonction ne renvoyer rien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void dscal(int **tableau , int k) ;
    Du moins, je pense

    Nas'

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Par défaut
    je suis d accord avec toi pour passer l'indice en parametre ca peut valoir le coup j a vais po vu les chose comme ca
    mais par contre tel qu il passe le tableau (cad avec le nom du tableau (V)) il passe un pointeur , le nom d'un tableau n'est ni plus ni moins qu 'un pointeur sur la premiere case donc s'il pass V en parametre il pourra tres bien modifier V[i] sans probleme tu n as pas besoin de pointeur de pointeur dans son cas (la ca devient vraiment compliqué )
    en revanche , seb, verifie bien que le prototype de la fonction dscal ressemble a ca : void dscal (int*,int); tu lui envoie le pointeur sur ton tableau (le nom de ton tableau) puis en suite l'indice (comme le precise nasky)

  8. #8
    Membre averti
    Inscrit en
    Mars 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 22
    Par défaut
    Si ton tableau est alloue d'un bloc, alors il faut passer , ca va marché. tu verras.

    voici un exemple:

    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
     
    int test2(int *tab)
    {
    	int i = tab[0];
    	return i;
    }
     
    void test()
    {
    	int tab[10];
    	int k = 5;
    	int i;
    	for(i = 0; i<10;i++) tab[i] = 4*i;
    	test2(tab + k);
    }

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 11
    Par défaut
    Je suis d'accord NaskY en C le passage de parametres peux se faire de deux manieres par valeur et par référence.

  10. #10
    Membre averti
    Inscrit en
    Mars 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 22
    Par défaut
    Tu peut faire passer par valeur et adresse, mais seulement la variable. C'est a dire, tu passe bien le même objet pointe. Ce qui n'est pas le cas en java, tu passer un copie de l'objets.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2015, 14h48
  2. Réponses: 3
    Dernier message: 09/10/2007, 10h50
  3. Réponses: 6
    Dernier message: 08/10/2007, 13h50
  4. [Tableaux] passage d'une variable par référence
    Par grinder59 dans le forum Langage
    Réponses: 7
    Dernier message: 14/05/2007, 17h52
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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