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 :

Petit problème de pointeur [Débutant(e)]


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut Petit problème de pointeur
    Bonjour,
    me voila sur ce joli forum, afin de solliciter de nouveau votre aide.
    Je commence à programmer en c, et comme tout débutant dans ce chouette langage, les problèmes de pointeurs font vite leurs apparitions
    Je m'explique. Je dois réaliser un programme, ayant pour but de demander à un utilisateur de saisir la longueur, puis la largeur d'un rectangle, et calculer le périmètre et la surface du rectangle.... (et oui, c'est très pédagogique^^).
    Le problème, c'est que lorsque je compile, des jolies valeurs sortant tout droit du fin fond de la mémoire de mon ordi s'affiche, au lieu de m'afficher un périmètre, donc ça ressemble fortement au fameux problème de pointeurs

    Voici donc mon code, après de nombreuses lectures de forums...

    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
    51
    52
    53
    54
    55
    56
    #include <stdio.h>
    #include <stdlib.h>
     
    struct rectangle{
           int longueur;
           int largeur;
    };           
     
    /* Ici, normalement on initialise un rectangle */
    initialisation(struct rectangle *rec){
           printf("Veulillez saisir la longueur du rectangle : ");
           scanf("%d",rec->longueur);
     
            /* En commentaire, car je ne sais pas pourquoi, mais ça bloc le pgm */
           /*printf("Veulillez saisir la largeur du rectangle : "); 
           scanf("%d",rec->largeur);*/
    }
     
    /* Calcul le périmètre du rectangle */
    int perimetre(struct rectangle *rec){
          int p;
          p = 2*rec->longueur+2*rec->largeur;      
          return p;
    }
     
    /* Calcul la surface du rectange */
    int surface(struct rectangle *rec){
          int p;
          p = rec->longueur*rec->largeur; 
          return p;
    }
     
    /*Compare deux rectangle, mais sans grande importance pour le moment */
    /*int grandeur(struct rectangle rec1, struct rectangle rec2){
         
         if(surface(rec1)<surface(rec2))                              
              printf ("la longueur du plus grand rectangle est : %d, et ca largeur est : %d \n", rec2.longueur,rec2.largeur);
         else
              printf ("la longueur du plus grand rectangle est : %d, et ca largeur est : %d\n", rec1.longueur,rec1.largeur);
    }
    */
     
    int main(int argc, char *argv[]){
      struct rectangle rec;
      struct rectangle rec2;
     
     
      initialisation(&rec);
     
      printf ("le perimetre du rectangle est : %d \n",perimetre(&rec));
      printf ("la surface du rectangle est : %d \n", surface(&rec));
      //grandeur(rec,rec2);
     
      system("PAUSE");	
      return 0;
    }
    Merci d'avance pour votre aide,
    Cordialemnt

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    ton programme compile ? aucun warning ?
    ça me parait étrange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d",rec->longueur);
    scanf lit une entrée et l'enregistre dans un pointeur.
    rec->longueur est un int, et pas un pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = 2*rec->longueur+2*rec->largeur;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = rec->longueur*rec->largeur;
    attention sur ces lignes à la priorité des opérations, penser à utiliser des parenthèses pour clarifier le tout
    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 chevronné
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 2 155
    Points
    2 155
    Par défaut
    La largeur de ton rectangle n'est pas initialisé, (fonction initialisation)

    Il y a donc n'importe quoi dans ce champ et du coup quand tu l'utilise c'est la fête (fonction périmètre).

    Ce n'est pas un problème de pointeur.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Je vous remercie pour la rapidité de vos réponses.
    Je vais de suite essayer de mettre en parenthèses tout ça.
    Et non, je n'ai aucun warning à la compilation

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Je viens de "parenthèser" mes expressions, initialiser la largeur, de la même façon que pour la longueur, mais dès que j'initialise la largeur, le programme cesse de fonctionner.
    J'ai donc encore simplifié le code pour faire des tests tout simples.
    Voila 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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct rectangle{
           int longueur;
           int largeur;
    };           
     
    /* Ici, normalement on initialise un rectangle */
    initialisation(struct rectangle *rec){
           printf("Veulillez saisir la longueur du rectangle : ");
           scanf("%d",rec->longueur);
    }
     
    int main(int argc, char *argv[]){
     
      struct rectangle rec;
     
      initialisation(&rec);
      printf("la longueur vaut %d \n", rec.longueur);
     
       system("PAUSE");	
      return 0;
    }
    et le résultat étrange est en pièce jointe.
    Images attachées Images attachées  

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    C'est toujours dans ton scanf qu'il y a un souci : le deuxième argument est censé entre un pointeur sur int, et là, c'est un int...

    Je ne sais pas quel compilateur tu utilises, mais s'il s'agit de gcc, ajoute l'option -Wall pour avoir les warnings : gcc -Wall tonfichier.c -o nomdetonprogramme

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Voila, après bien du mal à retrouver mon mot de passe linux, j'ai enfin réussi à compiler avec gcc, et en effet, il y a de jolis warnings.

    Voici le résultat du -Wall en pièce jointe. Donc en effet, le int du scanf ne va pas, mais comment faire pour dire qu'on veut un pointeur sur int ?
    Images attachées Images attachées  

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Evite les PJ c'est pas très pratique à lire, préfère la balise code.

    Les messages de gcc sont généralement assez clairs. Tu as deux types de message : les avertissements et les erreurs. Les erreurs peuvent être dûes à des erreurs de syntaxe dans ton code par exemple.

    Comme tu peux le voir, gcc te dit à quel ligne il trouve des problèmes. ligne 9 par exemple il te dit que tu n'as pas précisé le type de retour pour ta fonction, et que par défaut, ce sera int. Ligne 11 il te dit que scanf attend un type int* (pointeur sur int) et que tu lui donnes un int. Il faut donc que tu ajoutes un '&'.

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Désolé pour les PJ, j'avais lancé linux avec virtualbox, pour pas relancer un pc, et je galérais un peu.
    J'ai ajouté un & comme indiqué, et effectivement, mon test marche impeccable.
    J'ai donc plu qu’à continuer, en espérant ne pas refaire d'erreur.
    Merci beaucoup de votre aide, qui une fois de plus a été d'une grande efficacité

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    T'es la première personne que j'aide ! D'habitude je me fais aider plutôt

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/04/2014, 01h02
  2. Petits problèmes de pointeurs
    Par Raikyn dans le forum C
    Réponses: 20
    Dernier message: 27/06/2012, 00h06
  3. Petit problème sur pointeurs de structures
    Par benjaminb dans le forum C
    Réponses: 5
    Dernier message: 05/01/2008, 21h08
  4. Réponses: 4
    Dernier message: 15/10/2006, 19h05
  5. petit problème avec pointeurs
    Par Kerod dans le forum C
    Réponses: 12
    Dernier message: 09/12/2005, 16h48

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