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 :

exo sur les pointeurs


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut exo sur les pointeurs
    Bonjour

    le but de l'exo c'était de faire un programme qui permet d'entrer le nombre de valeur que l'on va entrer, puis de entrer ces valeurs, de les sommer, et aussi de dire qu'elle est la valeur min et la valeur max.
    J'ai réussit à faire le programme mais j'ai une erreur de segmentation lorsqu'on doit sortir de la boucle.


    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
    #include <stdio.h>
     
    int som=0;
     
    void min_max(int *x, int *b, int *t,int *i){
    if (*i==0) {
    *b=*t;
    *x=*t;
    }
     
    else
    {
    {if (*t>*x) {
    *x=*t;}
    if (*t<*b)
    {*b=*t;}
    }
    }
    }
    void somme(int *som,int *t)
    {*som=*som+*t;
    }
     
     
    int main()
    {
    int a;
    int i;
    int x, b;
    printf("entrer la quantitée:\n");
    scanf("%d",&a);
    for(i=0;i<a;i++)
    {
    printf("saisissez la valeur : \n");
    scanf("%d",&a+1+i);
    somme(&som,&a+1+i);
    printf("la somme vaut %d\n",som);
    min_max(&x,&b,&a+i+1,&i);
    }
    printf("la max vaut %d et le min vaut %d",x,b);
    return 0;
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Que veut dire cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d", &a + 1 + i);
    On écrit en gros après a, mais dans un espace qui n'a pas été réservé. Pourquoi ne pas utiliser une autre variable ?

    Il faudrait aussi changer le nom des variables en n_valeurs, derniere_valeur, min, et max, ça serait plus clair...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Que veut dire cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d", &a + 1 + i);
    On écrit en gros après a, mais dans un espace qui n'a pas été réservé. Pourquoi ne pas utiliser une autre variable ?

    Il faudrait aussi changer le nom des variables en n_valeurs, derniere_valeur, min, et max, ça serait plus clair...
    C'est tout à fait ça, je ne sais pas comment faire pour reserver l'espace étant donné que l'on fixe le nombre de valeur à entrer avec le scanf, donc j'ai stocké les infos les une à la suite des autres. C'est surement la cause de l'erreur de segmentation.


    Dsl pour la presentation
    , c'est vrai qu'il n'était pas necessaire de faire une globale, j'aurai pu définir som dans le main.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est tout à fait ça, je ne sais pas comment faire pour reserver l'espace étant donné que l'on fixe le nombre de valeur à entrer avec le scanf,
    Si le nombre de valeurs est fixé à l'exécution, tournes-toi vers l'allocation dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      int a;
      int * tab;
    ....
      printf ("entrer la quantitée:\n");
      scanf ("%d", &a);
      tab = malloc (a*sizeof *tab);
      if(tab != NULL)
      {
        for(i=0;i<a;i++)
        {
           printf("saisissez la valeur : \n");
           scanf("%d",tab+i); 
    ....

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par diogene Voir le message
    Si le nombre de valeurs est fixé à l'exécution, tournes-toi vers l'allocation dynamique
    Ne pas se laisser intoxiquer par les désirs farfelus du P.O. Pour le moment, il n'est nul besoin de tableaux ici...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par goldensun Voir le message
    le but de l'exo c'était de faire un programme qui permet d'entrer le nombre de valeur que l'on va entrer, puis de entrer ces valeurs, de les sommer, et aussi de dire qu'elle est la valeur min et la valeur max.
    J'ai réussit à faire le programme mais j'ai une erreur de segmentation lorsqu'on doit sortir de la boucle.
    Un minimum de présentation montre qu'on respecte le lecteur...
    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 <stdio.h>
     
    int som = 0;
     
    static void min_max (int *x, int *b, int *t, int *i)
    {
       if (*i == 0)
       {
          *b = *t;
          *x = *t;
       }
       else
       {
          {
             if (*t > *x)
             {
                *x = *t;
             }
             if (*t < *b)
             {
                *b = *t;
             }
          }
       }
    }
    static void somme (int *som, int *t)
    {
       *som = *som + *t;
    }
     
    int main (void)
    {
       int a;
       int i;
       int x, b;
       printf ("entrer la quantitée:\n");
       scanf ("%d", &a);
       for (i = 0; i < a; i++)
       {
          printf ("saisissez la valeur : \n");
          scanf ("%d", &a + 1 + i);
          somme (&som, &a + 1 + i);
          printf ("la somme vaut %d\n", som);
          min_max (&x, &b, &a + i + 1, &i);
       }
       printf ("la max vaut %d et le min vaut %d", x, b);
       return 0;
    }
    • Une globale ? Pourquoi ?
    • Que signifie pour toi '&a + 1 + i' ?
    • Attention à l'abus de pointeurs. une analyse rapide montre qu'on peut en supprimer la moitié.
    • Tu as brisé une règle simple qui veut qu'une variable ne serve qu'à une chose. Or ici, tu utilises 'a' pour 2 fonctions. Le comportement est ... étrange ...

    ceci me parait raisonnable :
    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
     
    entrer la quantitee:
    3
    saisissez la valeur :
    1
    la somme vaut 1
    saisissez la valeur :
    2
    la somme vaut 3
    saisissez la valeur :
    3
    la somme vaut 6
    la max vaut 3 et le min vaut 1
     
    Process returned 0 (0x0)   execution time : 6.124 s
    Press any key to continue.
    avec :
    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
    50
     
    #include <stdio.h>
     
    static void min_max (int *x, int *b, int t, int i)
    {
       if (i == 0)
       {
          *b = t;
          *x = t;
       }
       else
       {
          {
             if (t > *x)
             {
                *x = t;
             }
             if (t < *b)
             {
                *b = t;
             }
          }
       }
    }
    static void somme (int *som, int t)
    {
       *som = *som + t;
    }
     
    int main (void)
    {
       int a;
       int i;
       int x, b;
       int som = 0;
     
       printf ("entrer la quantitee:\n");
       scanf ("%d", &a);
       for (i = 0; i < a; i++)
       {
          int v;
          printf ("saisissez la valeur : \n");
          scanf ("%d", &v);
          somme (&som, v);
          printf ("la somme vaut %d\n", som);
          min_max (&x, &b, v, i);
       }
       printf ("la max vaut %d et le min vaut %d\n", x, b);
       return 0;
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Une globale ? Pourquoi ?
    Que signifie pour toi '&a + 1 + i' ?
    C'est les adresses qui suivent celle de a.

    Attention à l'abus de pointeurs. une analyse rapide montre qu'on peut en supprimer la moitié.
    ça signifit juste que je ne maitrise pas encore les pointeurs.

    Tu as brisé une règle simple qui veut qu'une variable ne serve qu'à une chose. Or ici, tu utilises 'a' pour 2 fonctions. Le comportement est ... étrange ...
    Il s'agit du même a, il me semble.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par goldensun Voir le message
    C'est les adresses qui suivent celle de a.
    Et tu penses qu'elles sont valides ?

    Il s'agit du même a, il me semble.
    Oui, et c'est bien le problème Dans main(), l'un sert pour déterminer le nombre de valeurs et le même sert pour saisir la valeur. La boucle fait donc n'importe quoi.

    Si je saisie a=3 pour 3 valeurs, puis a=1 comme première valeur, la boucle s'arrête... J'ai mis du temps à comprendre pourquoi...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Et tu penses qu'elles sont valides ?

    Nan car il y a des chances que l'espace mémoire de cette adresse soit déjà occupé.
    Oui, et c'est bien le problème Dans main(), l'un sert pour déterminer le nombre de valeurs et le même sert pour saisir la valeur. La boucle fait donc n'importe quoi.

    Si je saisie a=3 pour 3 valeurs, puis a=1 comme première valeur, la boucle s'arrête... J'ai mis du temps à comprendre pourquoi...
    Il saisit dans les adresses qui suivent donc la valeur de a reste intacte "&a+1+i" c'est dans les cases mémoires qui ont des adresses de ce type que les infos sont stockés, donc je ne touche pas au a après la saisie.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par goldensun Voir le message
    Nan car il y a des chances que l'espace mémoire de cette adresse soit déjà occupé.
    C'est surtout une adresse invalide. C'est donc bien une erreur que j'ai corrigée.
    Il saisit dans les adresses qui suivent donc la valeur de a reste intacte "&a+1+i" c'est dans les cases mémoires qui ont des adresses de ce type que les infos sont stockés, donc je ne touche pas au a après la saisie.
    Oui, mais comme j'ai corrigé, je tombe sur ce bug.

    Je ne te demande pas de justifier tes erreurs, mais de les corriger.

Discussions similaires

  1. des exos sur les boocles
    Par zeyd dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 27/11/2005, 18h03
  2. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  3. Dev c++ en rade sur les pointeurs ?...
    Par Magicien d'Oz dans le forum C
    Réponses: 17
    Dernier message: 13/10/2005, 19h38
  4. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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