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 :

fonction passage par valeur ,par adresse


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 22
    Par défaut fonction passage par valeur ,par adresse
    Bonjour,

    soit le code suivant :

    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
     
            #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
     
     
    void calcul_sum1(int start, int end, int * sum) 
    {
      while(start<=end){
         *sum = *sum + start ; 
         start++; 
      }
    }
     
    void calcul_sum2(int start, int end, int& sum)   // probleme en c à la compilation 
    {
       while(start<=end){
          sum=sum+start;
          start++;
           }
     
     
    }
     
     
     
    int main (void) 
    {
     
        int *sum1;
        *sum1=0;
        int sum2=0;
        int sum3=0;
     
        calcul_sum1(0,20,sum1); 
        printf("calcul sum1 = %d \n",*sum1);
        calcul_sum2(0,20,sum2);                   
        printf("calcul sum2 = %d \n",sum2);
        calcul_sum1(0,20,&sum3);              //probleme en c++ à l'éxecution 
        printf("calcul sum3 = %d \n",sum3);
     
     
     
      return 0;
     
     
    }
    en C :

    à la compilation j'ai le message d'erreur suivant :
    fonction7.c:16: erreur: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
    question : le passage par adresse est il possible en C ? ( je ne parle par du passage par pointeur qui est un passage par valeur de l'adresse de la variable sum )

    en C++ :

    à la compilation le code entier passe , mais à l'exécution j'ai un erreur de segmentation à cause de la ligne calcul_sum1(0,20,&sum3); cad passage par valeur de l'adresse de la variable sum3
    question : ça fonctionne sous c mais pas sous c++ . Comment se fait il qu'il y ait une erreur de segmentation sous c++ ,et pas sous c ?


    Merci .


    edit : je suis sous Linux 2.6.33.5-desktop-2mnb x86_64
    je compile avec gcc et g++ 4.4.3

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par hybride11 Voir le message
    à la compilation j'ai le message d'erreur suivant :
    fonction7.c:16: erreur: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
    question : le passage par adresse est il possible en C ? ( je ne parle par du passage par pointeur qui est un passage par valeur de l'adresse de la variable sum )
    Le passage par pointeur est le passage par adresse. Et ce passage est supporté en C.

    Par contre le passage par référence (ce que tu essaies de faire dans calcul_sum2) n'existe pas en C.

    Citation Envoyé par hybride11 Voir le message
    à la compilation le code entier passe , mais à l'exécution j'ai un erreur de segmentation à cause de la ligne calcul_sum1(0,20,&sum3); cad passage par valeur de l'adresse de la variable sum3
    L'appel est question n'est pas fautif.

    Par contre à la ligne *sum1=0; ou lors de l'appel calcul_sum1(0,20,sum1); tu utilises un pointeur non initialisé.

    Tu vas donc lire et écrire n'importe où en mémoire. Ce qui est une erreur.

    Citation Envoyé par hybride11 Voir le message
    question : ça fonctionne sous c mais pas sous c++ . Comment se fait il qu'il y ait une erreur de segmentation sous c++ ,et pas sous c ?
    C'est une erreur aussi bien en C qu'en C++. Malheureusement, lors de tes tests en C il n'y a pas eu de plantage. mais le programme n'est pas correct pour autant (il est tombé en marche par hasard).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 22
    Par défaut
    Citation Envoyé par gl Voir le message
    Le passage par pointeur est le passage par adresse. Et ce passage est supporté en C.

    Par contre le passage par référence (ce que tu essaies de faire dans calcul_sum2) n'existe pas en C.
    ok merci pour la précision . Je cherchais depuis un moment dans la doc C et je n'avais pas trouvé le passage par référence que j'avais trouvé dans la doc c++ .



    Citation Envoyé par gl Voir le message
    L'appel est question n'est pas fautif.

    Par contre à la ligne *sum1=0; ou lors de l'appel calcul_sum1(0,20,sum1); tu utilises un pointeur non initialisé.

    Tu vas donc lire et écrire n'importe où en mémoire. Ce qui est une erreur.
    Effectivement j'aurais dû ecrire pour l'initialisation .
    int sum1=0;
    int *psum1=&sum1;

    ce qui donne le code suivant qui lui ne me donne plus d'erreur de segmentation à l'exécution

    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
     
          #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
     
     
    void calcul_sum1(int start, int end, int * sum) 
    {
      while(start<=end){
         *sum = *sum + start ; 
         start++; 
      }
    }
     
    void calcul_sum2(int start, int end, int& sum)      //à enlever sous c 
    {
       while(start<=end){
          sum=sum+start;
          start++;
           }
     
     
    }
     
     
     
    int main (void) 
    {
        int sum1=0;
        int *psum1=&sum1;
     
        int sum2=0;
        int sum3=0;
     
        calcul_sum1(0,20,psum1); 
        printf("calcul sum1 = %d \n",*psum1);
        calcul_sum2(0,20,sum2);                   // à enlever sous c
        printf("calcul sum2 = %d \n",sum2);    // à enlever sous c
        calcul_sum1(0,20,&sum3);                  
        printf("calcul sum3 = %d \n",sum3);
     
     
     
      return 0;
     
     
    }


    Grand Merci pour l'aide

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/01/2013, 14h08
  2. Passage de liste par valeur à une fonction
    Par mayadev dans le forum Général Python
    Réponses: 7
    Dernier message: 23/02/2010, 16h14
  3. Passage d'arguments par valeur et adresse
    Par ToutEnMasm dans le forum C++
    Réponses: 12
    Dernier message: 04/10/2007, 09h32
  4. erreurs lors de passage de valeurs par un struct
    Par Aliveli dans le forum Visual C++
    Réponses: 2
    Dernier message: 15/10/2006, 23h15
  5. Fonction date() dans valeur par défaut
    Par guiguikawa dans le forum Access
    Réponses: 2
    Dernier message: 15/06/2006, 15h16

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