Partage
  • Partager sur Facebook
  • Partager sur Twitter

Encore les pointeurs.

    3 avril 2021 à 11:01:24

    Bonjour,

    J'ai un fichier .csv avec une seule colonne remplie de floats. Je connais sa taille mais à l'avenir elle pourrait changer.

    Je voudrais remplir un tableau avec les floats.

    En suivant les cours j'ai compris qu'il fallait allouer la mémoire de mon tableau dynamiquement et j'essaye de le faire sans succès.

    J'ai donc écrit une première fonction qui mesure le tableau : elle me renvoie un entier et elle fonctionne.

    Son code :

    -------------------------------------------------------------

    int Longueur_fichier(char Nom_chemin_fichier[100])
    
    {
    
        int Taille_fichier =0;
    
        char texte [256];
    
         FILE *fic = fopen(Nom_chemin_fichier, "r"); // Je crée un pointeur de type FILE chemin pour Mac
    
          if (fic == NULL)
    
        {
    
            printf("caguade\n");
    
            exit(1);
    
        }
    
            while(fgets(texte,255,fic)!=NULL)
    
                Taille_fichier++;
    
            fclose(fic);
    
        return Taille_fichier;
    
         }



    --------------------------------------------------------------

    Ensuite dans mon main je crée un pointeur

    float *Tableau=NULL;

    Et une nouvelle fonction qui  alloue et remplie ce tableau avec les valeurs du fichier

    void Rempli_alloc(float *Adresse_Du_Tableau_a_remplir, int Taille_Du_tableau, char Nom_chemin_fichier[100])
    
    {        
    
            char texte [256];
    
            int i=0;
    
            Adresse_Du_Tableau_a_remplir = malloc(Taille_Du_tableau*sizeof(float)); //j'alloue de la mémoire pour mon Tableau: i*la taille de mon type de donnée (ici 4 octets car float). 
    
            //Dans mon pointeur j'ai l'adresse du début de mon allocation (si ok) ou NULL (si caguade).
    
            if (Adresse_Du_Tableau_a_remplir == NULL) // Si l'allocation a échoué
    
            {
    
                exit(2); // On arrête immédiatement le programme
    
            }
    
        FILE *fic = fopen(Nom_chemin_fichier, "r");
    
           while(fgets(texte,255,fic)!=NULL) // fgets fait défiler les éléments du fichier
    
        {
    
            *(Adresse_Du_Tableau_a_remplir+i) = strtof(texte,NULL); // Dans le contenu de l'adresse je converti en float le texte que fgets m'a récupéré
    
            printf(" toto %.2f\n", *(Adresse_Du_Tableau_a_remplir+i)); // j'affiche (pour test)
    
            i++;
    
        }
    
       fclose(fic);
    
    }



    Le test avec le printf à la fin se passe bien : je vois défiler mes floats

    Par contre de retour dans mon main, quand j'essaye de visualiser le contenu de ce tableau avec par exemple

    printf("Tabl%f\n",*Tableau);

    Mon programme se bloque ce qui me fait penser qu'un truc n'est pas encore bien compris avec les pointeurs.

    Une âme charitable pour m'expliquer ou je me trompe ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      3 avril 2021 à 11:29:30

      Ton problème vient du passage de paramètres aux fonctions. Le pointeur que tu envois à la fonction et copié dans le paramètre de la fonction. Le paramètre lui est une variable locale à la fonction, qui n'existe donc que dans la fonction.

      Donc si tu veux modifier le pointeur de la fonction main dans la fonction, il faut envoyer son adresse à la fonction afin que la fonction puisse accéder aux pointeur de la fonction main via son adresse. C'est le même principe que pour scanf. 

      Une autre solution, c'est de retourner l'adresse du tableau depuis la fonction et de l'affecter au pointeur.

      Et il ne faudra pas oublier la libération de la mémoire (un malloc, un free).

      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2021 à 13:32:50

        Merci rouloude. 

        J'ai compris et j'ai réussi à retourner l'adresse du pointeur.

        A+

        • Partager sur Facebook
        • Partager sur Twitter

        Encore les pointeurs.

        × 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