Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau de personnes avec nom et âges

    13 octobre 2021 à 17:23:30

    Hello tout le monde,

    Je vous écris car je débute en langage C, je me forme sur OCR, via le cours de Mathieu Nebra. 

    Dans le programme ci-dessous, je cherche à créer une liste de personnes en indiquant leurs nom, prénom et âge. 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Personne Personne;
    struct Personne
    {
        char nom[100];
        char prenom[100];
        int *age;
    };
    
    int main ()
    {
        int x = 0;
        printf("Combien de joueurs ? \n");
        scanf ("%d", &x); // Saisir le nombre de joueurs
        int i = 0;
        Personne joueurs[x];
        for (i = 0; i < x; i++)
        {
        printf ("Quel est le nom du joueur %d ? \n", i+1);
        scanf ("%s", joueurs[i].nom); // Ici, ça coince, le programme ne renvoie pas la chaîne de caractères.
        printf ("Quel est le prenom du joueur %d ? \n", i+1);
        scanf ("%s", joueurs[i].prenom); // Idem, le programme ne renvoie pas la chaîne de caractères.
        // Après tests, cela vient du \n après le %s ... //
        printf ("Quel age a le joueur %d ? \n", i+1);
        scanf ("%d", &joueurs[i].age);
        }
        for (i = 0; i < x; i++) // Séparer les deux étapes "for" pour d'abord enregistrer les joueurs et ensuite les nommer à l'écran //
        {
        printf ("Le joueur %d s'appelle %s %s \n", i+1, joueurs[i].prenom, joueurs[i].nom);
        }
        // Le programme s'arrête après le joueur 1, impossible de lui faire prendre un autre joueur.
        return 0;
    }

    Mon IDE me renvoie deux messages d'erreur:

    - le premier : cannot open output file

    - le second : ld returned 1 exit status

    Pouvez-vous me dire quelle est mon erreur svp ?

    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2021 à 17:42:36

      Salutousseul,

      Ces erreurs ne concernent pas ton code en lui-même: le 1er message, c'est le compilateur qui te dit qu'il n'a pas su créer un fichier, le second c'est le linker qui te dit qu'il n'a pas pu linker ton programme avec les librairies nécessaires (dû au 1er message).

      As-tu les droits pour écrire dans le répertoire ? Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?

      Edit: orthographe

      -
      Edité par edgarjacobs 13 octobre 2021 à 18:23:35

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        13 octobre 2021 à 18:08:42

        D'abord, ta variable age n'est pas définie correctement. Il faut écrire int age et non int *age.
        C'est déjà une bonne raison pour faire planter le programme.
        Mets-tu des espaces dans ton nom et ton prénom? Parce que %s s'arrête au premier "white space".
        C'est-à-dire espace tab, newline, return, etc.

        Tu utilises une VLA (Variable Length Array) pour définir ton tableau. Ce n'est pas souhaitable.

        Mais je suppose que tu n'as pas vu la mémoire dynamique avec malloc ...

        -
        Edité par PierrotLeFou 13 octobre 2021 à 18:12:33

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          13 octobre 2021 à 18:52:51

          edgarjacobs a écrit:

          As-tu les droits pour écrire dans le répertoire ? Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?


          J'ai bien les droits pour écrire dans le répertoire. Je précise d'ailleurs que c'est le seul programme, parmi tous ceux que j'ai faits jusqu'à présent, qui me met ce message d'erreur.

          PierrotLeFou a écrit:

          D'abord, ta variable age n'est pas définie correctement. Il faut écrire int age et non int *age.
          C'est déjà une bonne raison pour faire planter le programme.
          Mets-tu des espaces dans ton nom et ton prénom? Parce que %s s'arrête au premier "white space".
          C'est-à-dire espace tab, newline, return, etc.

          Tu utilises une VLA (Variable Length Array) pour définir ton tableau. Ce n'est pas souhaitable.

          Mais je suppose que tu n'as pas vu la mémoire dynamique avec malloc ...

          Je vais corriger ce souci avec la variable age. Pour être très honnête, j'ai vraiment beaucoup de mal à comprendre les pointeurs et leur fonctionnement.

          J'ai vu l'allocation dynamique aujourd'hui mais après avoir écrit ce code. Idem, j'ai encore du mal avec malloc ... Idéalement, il me faudrait un prof pour que je puisse bien tout assimiler mais en l'état, c'est pas possible.

          -
          Edité par NicolasTorelli 13 octobre 2021 à 18:55:18

          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2021 à 21:08:42

            Les pointeurs, c'est drôlement compliqué. Je serais toi, je n'utiliserais les pointeurs que pour faire des passages par adresse, en tout cas dans un premier temps. L'allocation dynamique, ça aussi c'est compliqué (de nombreux plantages en proviennent). Je te suggère donc de continuer à suivre le cours même si tu n'as pas bien compris les pointeurs. Ça ne t'empêchera de lire et écrire dans des fichiers, par exemple : ils ont le type FILE*, mais il n'est pas indispensable de savoir pourquoi il y a une étoile (il faut juste ne pas l'oublier). Et tu n'auras qu'à manipuler des tableaux statiques.

            (Ce que je dis est très personnel, c'est au cas où NicolasTorelli aurait les mêmes difficultés que j'ai eues à mes débuts en C, langage que j'ai d'abord détesté parce que je me prenais tout le temps des erreurs de segmentation...)

            • Partager sur Facebook
            • Partager sur Twitter
              13 octobre 2021 à 21:46:49

              Salut, pour éviter d'utiliser une VLA tu peux définir une taille maximale de ton tableau et proposer à l'utilisateur de quitter la boucle quand il en a envie en faisant attention de ne pas dépasser la taille maximale. Sinon tu n'as pas besoin de manipuler des pointeurs ici mais tu dois quand même connaître un minimum la notion d'adresse car tu utilises ce concept avec scanf()
              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2021 à 23:47:43

                NicolasTorelli a écrit:

                (...) Mon IDE me renvoie deux messages d'erreur:

                - le premier : cannot open output file (...)

                edgarjacobs a écrit:

                (...) Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?

                +1

                Comme le dit edgardjacob, si le fichier est ouvert, le compilateur ne peut le créer. Cela arrive si ton exécutable est toujours lancé au moment où tu tentes de créer une nouvelle version de ton programme.

                Tu peux avoir oublié de fermer ton programme, ou, éventuellement ton programme n'est plus visible, mais s'il a crashé et ne s'est pas terminé correctement, et il peut être resté résident en mémoire.

                Tu peux afficher la liste des processus pour tuer un programme planté. Sous Windows tu peux utiliser le "gestionnaire de tâches" : https://www.malekal.com/le-gestionnaire-de-taches-de-windows/ ou, en version bourrin, redémarrer ta machine.

                Dans tous les cas, corrige le bogue signalé par PierrotLeFou pour éviter les futurs plantages.

                • Partager sur Facebook
                • Partager sur Twitter
                  14 octobre 2021 à 1:35:02

                  Je suis d'accord avec l'idée de définir untableau de longueur fixe.
                  Supposons que tu le mets de longueur 1000, ça fera environ 200000 octets en mémoire (200 Kb)
                  Ce n'est pas la fin du monde. Et je crois que tu vas te fatiguer avant le programme ...
                  Alors, si tu mets une longueur de 100 personnes, ce sera très bien pour avancer dans ton projet.
                  Il y a plusieurs sites sur le web qui parlent des pointeurs. En voici un:
                  https://web.maths.unsw.edu.au/~lafaye/CCM/c/cpoint.htm
                  Tu peux faire une recherche avec les mots clés:  langage C pointeurs
                  etc.
                  Je n'ai pas mis celui de Zeste de Savoir, je le trouve trop technique pour un débutant (c'est mon avis ...)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                  Tableau de personnes avec nom et âges

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown