Partage
  • Partager sur Facebook
  • Partager sur Twitter

Structure et fscanf

Sujet résolu
    26 novembre 2020 à 11:21:25

    Bonjour,

    Je dois créer une application de réservation de ressources fictives (CPU/GO) pour plus de modularité je récupère les éléments de bases d'un fichier (de manière simple 1 ligne = 1 ville avec son nombre de GO et de CPU disponible) et je veux mettre le tout dans une structure.

     struct dataStruct {
        char ville[20];
        int go[20];
        int cpu[20];
    };
    
    struct dataStruct * data;

    L'objectif est simple avoir pour une case X le nom de la ville et les valeurs associés dans les tableaux GO/CPU.

    void InitDataFromFile() {
        FILE* file = NULL;
        file = fopen("data.txt","r");
        taille = nbLigne(file);
    
        if(file != NULL) {
            for(int i = 0; i < taille; i++) {
               fscanf(file,"%s %d %d", &data->ville[i],&data->go[i],&data->cpu[i]);
            }
        }
        else {
            printf("erreur file");
        }
    }

    Je fais donc ça, qui est assez simple, d'ailleurs avant j'avais 2 structures dont 1 qui pointait sur la première et cela marchait mais la syntaxe était longue et j'ai voulu raccourcir le tout dans 1 seul pour mettre en place de la mémoire partagé ensuite.

    Mon problème est double : Quand le tout marchait avec 2 structures impossible de modifier les valeurs (Si je changeais une valeur j'avais le code ASCII à la place du nombre de CPU par exemple)

    Actuellement, j'ai un segfault sur fscanf() (le fichier s'ouvre bien, le nombre de lignes est bien récupérer..) je vous ai épargner tout le traitement des valeurs de retour mais c'est bien fscanf() qui ne marche pas et qui n'écrit pas les valeurs pour chaque ville dans ma structure.

    Le fichier est très simple

    NomVille chiffre1 chiffre2

    ...

    Je vous remercie d'avance !


    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2020 à 11:40:59

      Salut DnsAznt,

      dans cette ligne :
      struct dataStruct * data;
      tu déclares data comme étant un pointeur sur struct, mais à aucun moment dans ton code tu alloues de la mémoire (avec malloc) pour stocker dans cette variable pointeur une adresse mémoire valide. C'est la raison principale du plantage.

      Soit tu fais cela, soit tu déclares directement une :
      struct dataStruct data;
      (et tu changes ton code pour mettre des . au lieu des ->)
      Ensuite, dans ton fscanf, lorsque tu passes une variable tableau, tu n'as pas besoin d'utiliser l'opérateur esperluette "&", car le C passe tout seul le pointeur vers le premier élément du tableau.

      Cependant, je pense que tu devrais revoir ta structure de données, car ton champ ville ne colle pas.

      Tu devrais faire une struct pour stocker le nom d'une ville (donc un tableau de char) et tes deux chiffres (donc deux int et pas deux tableau de 20 int) et ensuite déclarer un tableau de cette struct pour le nombre de lignes que tu veux stocker (par exemple, un tableau de 20 struct).

      -
      Edité par Dlks 26 novembre 2020 à 11:55:02

      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2020 à 11:50:47

        Dlks a écrit:

        Salut DnsAznt,

        dans cette ligne :
        struct dataStruct * data;
        tu déclares data comme étant un pointeur sur struct, mais à aucun moment dans ton code tu alloues de la mémoire (avec malloc) pour stocker dans cette variable pointeur une adresse mémoire valide. C'est la raison principale du plantage.
        Soit tu fais cela, soit tu déclares directement une :
        struct dataStruct data;
        (et tu changes ton code pour mettre des . au lieu des ->
        Ensuite, dans ton fscanf, lorsque tu passes une variable tableau, tu n'as pas besoin d'utiliser l'opérateur esperluette "&", car le C passe tout seul le pointeur vers le premier élément du tableau.

        -
        Edité par Dlks il y a moins de 30s


        Merci de ta réponse !

        En effet j'ai changer la structure (en enlevant les tableaux de int) et en créant un tableau de cette structure mais le problème se pose avec l'accès ?

        Je crois que shm() (mémoire partagé) n'accepte pas les pointeurs donc je ne pourrais pas faire passer mes données (ma structure du coup?) non?

        -
        Edité par DnsAznt 26 novembre 2020 à 12:06:12

        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2020 à 12:06:34

          Tu poses maintenant une nouvelle question qui n'est pas claire. Si tu veux travailler avec un tableau de pointeurs sur struct, fais le et réserve la mémoire nécessaire avec malloc(). Si tu ne veux pas, ne le fais pas et déclare un tableau de struct.

          Dans les deux cas tu pourras obtenir l'adresse mémoire de choses à partager, si c'est ce que tu veux faire.

          L'avantage de déclarer un tableau de struct est que tu devras partager un seul espace mémoire.

          Si tu as une nouvelle question en relation avec shm poste un nouveau sujet avec des explications claires sur ton problème et ta question et quelqu'un de compétent pourra peut-être t'aider, car ta question semble ne plus avoir de lien avec ton problème initial.

          PS : si tu modifies tes post en réponse à un post postérieur, on n'y comprend plus rien dans la discussion, ou alors on est obligés de répercuter les changements dans la discussion dans nos propres messages (ce que j'ai dû faire). La conséquence est que l'historique des échanges est en réalité supprimé. Je pense que c'est mieux d'éviter de faire cela sur le forum.

          -
          Edité par Dlks 26 novembre 2020 à 12:33:35

          • Partager sur Facebook
          • Partager sur Twitter
            26 novembre 2020 à 13:11:06

            Dlks a écrit:

            Tu poses maintenant une nouvelle question qui n'est pas claire. Si tu veux travailler avec un tableau de pointeurs sur struct, fais le et réserve la mémoire nécessaire avec malloc(). Si tu ne veux pas, ne le fais pas et déclare un tableau de struct.

            Dans les deux cas tu pourras obtenir l'adresse mémoire de choses à partager, si c'est ce que tu veux faire.

            L'avantage de déclarer un tableau de struct est que tu devras partager un seul espace mémoire.

            Si tu as une nouvelle question en relation avec shm poste un nouveau sujet avec des explications claires sur ton problème et ta question et quelqu'un de compétent pourra peut-être t'aider, car ta question semble ne plus avoir de lien avec ton problème initial.

            PS : si tu modifies tes post en réponse à un post postérieur, on n'y comprend plus rien dans la discussion, ou alors on est obligés de répercuter les changements dans la discussion dans nos propres messages (ce que j'ai dû faire). La conséquence est que l'historique des échanges est en réalité supprimé. Je pense que c'est mieux d'éviter de faire cela sur le forum.

            -
            Edité par Dlks il y a 35 minutes


            Tu as raison, c'était pas clair mais en fait tu as répondu à ma question ("L'avantage de déclarer un tableau de struct est que tu devras partager un seul espace mémoire.") je l'avais formuler autrement (d'où ma modification) en tout cas merci de ta réponse  cela m'a débloqué !
            • Partager sur Facebook
            • Partager sur Twitter

            Structure et fscanf

            × 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