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 :

Modifier les valeurs paramètres


Sujet :

C

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut Modifier les valeurs paramètres
    Bonsoir,
    je dois ecrire une fonction qui doit modifier la valeur de 2 de ses parametres.Son prototype est le suivant: void intersection (tableau n1,tableau n2,tableau n3,int t1,int t2 ,int t3).Cette fonction renvoie le nuage de points communs aux nuages n1 et n2
    le type tableau permet de representer des nuages de points.Chaque element du tableau est donc un point.
    je l'ai defini de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct
    {
        float x,y;
    }POINT;
    typedef struct
    {
        POINT t[100];
     
    }TABLEAU;
    voici ma fonction intersection:
    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
     
    void intersection(tableau n1,tableau n2,tableau n3,int t1,int t2,int t3)
    {
        int f,i;
        f=(t1<=t2?t1:t2);
        t3=0;
         for(i=0;i<f;i++)
        {
            if(egal(n1.t[i],n2.t[i])==1)
            {
                n3.t[i]=n1.t[i];
     
                t3=t3+1;
            }
        }
    }
    voici la fonction egal()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    int egal(POINT p, POINT q)
    {
        if((p.x==q.x)&&(p.y==q.y))
     
            return 1;
     
        else
            return 0;
    }
    Comme j'ai dit plus haut, je n'arrive pas a modifier la valeur de n3 et t3 lors de l'appel de la fonction intersection.
    Merci d'avance!

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    En C les paramètres sont passés par valeur, il faut passer tes variables de sortie par référence. D'ailleurs étant donnée la taille conséquente de tes struct ce serait pas mal de passer également les variables d'entrée par référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void intersection(const tableau *n1, const tableau *n2, tableau *n3, int t1, int t2, int *t3) {
        // ...
    }

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    Mais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void intersection(const tableau *n1, const tableau *n2, tableau *n3, int t1, int t2, int *t3)
    ne correspond pas au prototype qu'on m'a demandé de respecter et qui est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void intersection(tableau n1,tableau n2,tableau n3,int t1,int t2,int t3)

  4. #4
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Bonjour,

    EDIT : L'explication qui va suivre ne marche que pour un tableau dynamique , or ici ton tableau est statique. Tu peux donc le passer en dynamique (cf 2 messages plus bas), sinon il est impossible de modifier des valeurs avec le prototype actuel de ta fonction (tu peux aussi modifier le prototype).

    Ce qu'il faut savoir c'est qu'en C, un tableau n'est qu'un pointeur sur le premier élément du tableau. Ainsi, en C, ces codes sont équivalents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab[0] <==> *tab
    tab[10] <==> *(tab+10) // cf arithmétique des pointeurs
    Ici, ta structure est passée par valeur mais elle ne contient qu'un tableau qui lui est une référence (pointeur).

    De fait du moment que tu ne dépasse pas la taille de tes tableaux tu peut directement modifier la valeur des cases du tableau (mais pas l'adresse du tableau lui même).

    n3 peut donc directement être modifié (mais pas t3 puisque c'est un int et pas un int*).

    Tu as deux solutions pour t3 :
    • Soit tu passe ce paramètre par pointeur (int*).
    • Soit tu retourne la valur finale de t3 et tu modifie cette variable en conséquence dans la fonction appelante.

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par magyy Voir le message
    Mais ceci ne correspond pas au prototype qu'on m'a demandé de respecter
    Si la fonction ne renvoie rien et que les paramètres à modifier ne sont pas passés par référence, c'est impossible. Par conséquent il faudrait nous donner plus de précisions sur l'énoncé. Qu'est-ce que tableau notamment ? Sans plus d'info j'ai supposé qu'il s'agissait d'un alias de TABLEAU mais ce n'est peut-être pas le cas. Quelles sont les données d'entrées et de sortie ? Comment la fonction doit-elle être utilisée ?


    Citation Envoyé par emixam16 Voir le message
    Ici, ta structure est passée par valeur mais elle ne contient qu'un tableau qui lui est une référence (pointeur).
    [...]
    De fait du moment que tu ne dépasse pas la taille de tes tableaux tu peut directement modifier la valeur des cases du tableau (mais pas l'adresse du tableau lui même).

    n3 peut donc directement être modifié (mais pas t3 puisque c'est un int et pas un int*).
    Malheureusement c'est faux. Un tableau peut certes être dégénéré en pointeur vers son premier élément mais les deux types ne sont pas équivalents, et un tableau membre d'une struct sera copié dans son intégralité si la struct est passée en paramètre :
    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
    #include <stdio.h>
     
    struct foo { int t[1]; };
     
    void f(struct foo bar) { ++bar.t[0]; }
     
    void g(struct foo *bar) { ++bar->t[0]; }
     
    int main(int argc, char *argv[]) {
        struct foo bar = { { 42 } };
        printf("%d\n", bar.t[0]); // 42
     
        f(bar);
        printf("%d\n", bar.t[0]); // 42
     
        g(&bar);
        printf("%d\n", bar.t[0]); // 43
     
        return 0;
    }

  6. #6
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Pardon, je n'avais pas vu que le tableau contenu dans la structure était statique (donc passé par valeur) et pas dynamique (passé par référence).

    Pour que mon explication fonctionne il faut que ton tableau soit dynamique, comme montré dans le code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct A{int* a;};
     
    void f(struct A s) { s.a[0] = 1; }
    int main()
    {
        struct A s;
        s.a = malloc(1*sizeof(int));
        s.a[0] = 0;
        f(s);
        printf("%d",s.a[0]); // Renvoie 1
        return 0;
    }

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    ok!
    Merci beaucoup pour vos aides!

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

Discussions similaires

  1. fonction qui modifie les valeurs de combos <select>
    Par NicoO_O dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/05/2007, 13h02
  2. Réponses: 4
    Dernier message: 23/04/2007, 12h01
  3. modifier les valeurs de champ
    Par stoyak dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/11/2006, 11h18
  4. Lire un fichier Excel pour modifier les valeurs des cellules
    Par Paloma dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/10/2006, 15h13
  5. [JTable]Modifier les valeurs en temps réel
    Par yoshï dans le forum Composants
    Réponses: 11
    Dernier message: 02/06/2006, 17h11

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