Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement de logiciels
  4. C
  5. [Question] Un FILE* en argument de fonction

[Question] Un FILE* en argument de fonction

Scheduled Pinned Locked Moved C
14 Posts 4 Posters 3.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • nellN
    nellN
    nell
    wrote on last edited by
    #1

    <p>Hey, je commence un projet en C et j'ai un problème avec une fonction</p>
    <p>Je résume rapidement la fonction:</p>
    <p> </p>
    <p>Un fichier texte est composé de plusieurs lignes, chaque ligne contient 3 chiffres, une coordonnnée x, une coordonnée y et une valeur à mettre à ces coordonnées dans la grille. La fonction remplie d'abord la grille avec des 0, puis récupères les valeurs du fichiers pour les insérer dans la grille aux bonnes coordonnées.</p>
    <p> </p>
    <p>Ma fonction ne marche pas et fait planter le programme et j'ai vraiment du mal à la corriger, vous auriez une solution? (J'ai des doutes sur la syntaxe des arguments de la fonction...)</p>
    <pre class="ipsCode prettyprint">
    void lire_Grille(FILE* nomFichier[400],int grille[][9])
    {
        int i, j;
        for (i=0; i<9;i++)
        {
            for (j=0;j<9;j++)
            {
                grille[i][j]=0;
            };
     
        };
        i = fgetc(nomFichier);
        do
        {
            j = fgetc(nomFichier);
            grille[i][j] = fgetc(nomFichier);
            k = fgetc(nomFichier);
            while (k==" " || k=="\n")
            {
                k=fgetc(nomFichier);
            };
            i = k;
        } while (i!=EOF);
    }
    </pre>

    What is the ratio of the time I spend solving problems to the time I spend scaling successes?

    1 Reply Last reply
    0
    • D
      D
      davydavek
      wrote on last edited by
      #2

      <p>Je pense que le problème vient du premier argument de ta fonction, ce n'est pas un FILE*, mais un tableau de 400 FILE*. Je pense que enlever le " [400] " après "monFichier" devrait le résoudre.</p>

      C# dev
      github.com/DavyWk

      1 Reply Last reply
      1
      • AlexMogA
        AlexMogA
        AlexMog
        Modérateur spécialisé
        wrote on last edited by
        #3

        <blockquote class="ipsQuote" data-cite="davydavek" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="15058" data-ipsquote-contentid="1446" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1420940681" data-ipsquote-username="davydavek"><div>
        <div>
        <p>Je pense que le problème vient du premier argument de ta fonction, ce n'est pas un FILE*, mais un tableau de 400 FILE*. Je pense que enlever le " [400] " après "monFichier" devrait le résoudre.</p>
        </div>
        </div></blockquote>
        <p>+1, je rajoutes aussi que tu es en C, essaye de respecter les normes internationales qui ont été mises en place, elles sont pas là pour rien.</p>
        <p>(Pour info, les normes sont: ansiC et isoC).</p>
        <p>Pour vérifier que ton code respecte bien tout, et pour éviter des futures erreurs, je te conseille de compiler avec les flags suivants (sous gcc):</p>
        <p>-W -Wall -Werror -pedantic -ansi</p>
        <p>Tu verra, tu évite 90% des problèmes communs (comme la non initialisation des vars, le pointage foireux, etc...)</p>

        Multiplayer GameDev @ Unexpected
        

        Mon CV

        1 Reply Last reply
        2
        • nellN
          nellN
          nell
          wrote on last edited by
          #4

          <p>Merci! c'était une des erreurs et ça m'a permis de trouver l'autre du coup:</p>
          <p> </p>
          <p><span>i </span><span style="color:rgb(102,102,0);">=</span><span> fgetc</span><span style="color:rgb(102,102,0);">(</span><span>nomFichier</span><span style="color:rgb(102,102,0);">);</span></p>
          <p><span style="color:rgb(102,102,0);"><span style="color:rgb(34,34,34);">j </span><span>=</span><span style="color:rgb(34,34,34);"> fgetc</span><span>(</span><span style="color:rgb(34,34,34);">nomFichier</span><span>); </span> </span></p>
          <p> </p>
          <p>i et j prennent la valeur ascii du caractère, du coup après ça fait grille[48][53] et ça fait planter vu que la grille est une [9][9]</p>
          <p> </p>
          <p>Maintenant faut voir comment convertir, c'est là que je me dis que le Python c'était vachement pratique en fait x) Apparemment ce serait à faire avec sscanf</p>

          What is the ratio of the time I spend solving problems to the time I spend scaling successes?

          1 Reply Last reply
          0
          • D
            D
            davydavek
            wrote on last edited by
            #5

            <p>Les chiffres de 0 a 9 inclusif sont au indexes 48-57 de la table ASCII, il suffit donc de soustraire 48 au caractère.</p>
            <p> </p>
            <p>ex:</p>
            <p>'1' = 49</p>
            <p>49 -  48 = 1</p>
            <p> </p>
            <p>'6' = 54</p>
            <p>54 - 48 = 6</p>

            C# dev
            github.com/DavyWk

            1 Reply Last reply
            1
            • nellN
              nellN
              nell
              wrote on last edited by
              #6

              <p>Ah oui ça facilite tout en faisant comme ça en fait x)</p>
              <p> </p>
              <p>Merci beaucoup alors, la fonction marche exactement comme il faut 😄 </p>

              What is the ratio of the time I spend solving problems to the time I spend scaling successes?

              1 Reply Last reply
              0
              • D
                D
                davydavek
                wrote on last edited by
                #7

                <p>De rien, n’hésites pas a demander de l'aide si tu as d'autres questions 😉 </p>

                C# dev
                github.com/DavyWk

                1 Reply Last reply
                0
                • AlexMogA
                  AlexMogA
                  AlexMog
                  Modérateur spécialisé
                  wrote on last edited by
                  #8

                  <blockquote class="ipsQuote" data-cite="davydavek" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="15065" data-ipsquote-contentid="1446" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1420982858" data-ipsquote-username="davydavek"><div>
                  <div>
                  <p>Les chiffres de 0 a 9 inclusif sont au indexes 48-57 de la table ASCII, il suffit donc de soustraire 48 au caractère.</p>
                  <p> </p>
                  <p>ex:</p>
                  <p>'1' = 49</p>
                  <p>49 -  48 = 1</p>
                  <p> </p>
                  <p>'6' = 54</p>
                  <p>54 - 48 = 6</p>
                  </div>
                  </div></blockquote>
                  <p>La fonction <a href="http://pwet.fr/man/linux/fonctions_bibliotheques/atoi" rel="external nofollow">atoi </a>fais le café aussi à ce niveau là 😉 .</p>

                  Multiplayer GameDev @ Unexpected
                  

                  Mon CV

                  1 Reply Last reply
                  0
                  • D
                    D
                    davydavek
                    wrote on last edited by
                    #9

                    <p>fgetc retourne un int directement,  et atoi requiert un char*, donc dans ce cas ce n'est pas vraiment utile de l'utiliser</p>

                    C# dev
                    github.com/DavyWk

                    1 Reply Last reply
                    0
                    • AlexMogA
                      AlexMogA
                      AlexMog
                      Modérateur spécialisé
                      wrote on last edited by
                      #10

                      <blockquote class="ipsQuote" data-cite="davydavek" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="15070" data-ipsquote-contentid="1446" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1421004266" data-ipsquote-username="davydavek"><div>
                      <div>
                      <p>fgetc retourne un int directement,  et atoi requiert un char*, donc dans ce cas ce n'est pas vraiment utile de l'utiliser</p>
                      </div>
                      </div></blockquote>
                      <p>Effectivement, autant pour moi.</p>
                      <p>La technique du 48 fonctionne, mais il es plus conseillé d'utiliser directement la valeur du char, comme ceci:</p>
                      <p>49 - '0' = 1.</p>
                      <p>(ce qui se traduit par '1' - '0' = 1).</p>
                      <p>Voilàà:</p>

                      Multiplayer GameDev @ Unexpected
                      

                      Mon CV

                      1 Reply Last reply
                      1
                      • nellN
                        nellN
                        nell
                        wrote on last edited by
                        #11

                        <p>Hmm ok la différence de 2 char donne un int alors? c'est toujours bon à savoir 🙂 </p>
                        <p> </p>
                        <p>Je suis pratiquement à la fin du projet mais je bute sur un petit truc</p>
                        <p> </p>
                        <p>On a un int qui ressemble à ça:  grille[x][y].tab[z] (il a une valeur entre 0 et 9)</p>
                        <p>Le prof veut qu'on rende égal grille[x][y].tab à NULL</p>
                        <p>Seulement quand je le fais ça me dit que je peux pas assigner un void a un int.</p>
                        <p> </p>
                        <p>Alors j'ai testé *grille[x][y].tab=NULL Mais j'ai fait ça au hasard et je sais pas si c'est juste, vous auriez une idée? </p>
                        <p> </p>
                        <p>EDIT: J'ai mis la première case= '\0', on verra bien ce que ça donne</p>

                        What is the ratio of the time I spend solving problems to the time I spend scaling successes?

                        1 Reply Last reply
                        0
                        • AlexMogA
                          AlexMogA
                          AlexMog
                          Modérateur spécialisé
                          wrote on last edited by
                          #12

                          <blockquote class="ipsQuote" data-cite="nell" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="15103" data-ipsquote-contentid="1446" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1421100673" data-ipsquote-username="nell"><div>
                          <div>
                          <p>Hmm ok la différence de 2 char donne un int alors? c'est toujours bon à savoir 🙂 </p>
                          <p> </p>
                          <p>Je suis pratiquement à la fin du projet mais je bute sur un petit truc</p>
                          <p> </p>
                          <p>On a un int qui ressemble à ça:  grille[x][y].tab[z] (il a une valeur entre 0 et 9)</p>
                          <p>Le prof veut qu'on rende égal grille[x][y].tab à NULL</p>
                          <p>Seulement quand je le fais ça me dit que je peux pas assigner un void a un int.</p>
                          <p> </p>
                          <p>Alors j'ai testé *grille[x][y].tab=NULL Mais j'ai fait ça au hasard et je sais pas si c'est juste, vous auriez une idée? </p>
                          <p> </p>
                          <p>EDIT: J'ai mis la première case= '\0', on verra bien ce que ça donne</p>
                          </div>
                          </div></blockquote>
                          <p>Alors, pas du tout, un char moins un char = un char.</p>
                          <p>N'oublie pas qu'un char, c'est une valeur numérique d'un octet. (La différence, c'est qu'un int, cest 4 octets)</p>
                          <p>La conversion théorique de char en int est possible grâce à un cast. Le contraire peux provoquer des résultats surprenants si l'int dépasse 127 😉 . (ou 255 pour les unsigned)</p>
                          <p>Pour le NULL, n'oublie pas que NULL != 0.</p>
                          <p>En faite, NULL corresponds à une adresse mémoire, 0 à un int. (c'est un peu contradictoire, vue qu'une adresse mémoire est un int, mais là n'est pas la question, c'est pour bien séparer l'adresse NULL d'un simple 0).</p>
                          <p>Ainsi, un int peux avoir pour valeur 0, mais pas NULL.</p>
                          <p>A contrario, un pointeur peux avoir la valeur NULL et 0.</p>

                          Multiplayer GameDev @ Unexpected
                          

                          Mon CV

                          1 Reply Last reply
                          1
                          • arcanumA
                            arcanumA
                            arcanum
                            wrote on last edited by
                            #13

                            <p>255 c'est déjà un unsigned char (2^8 - 1), le char signé il monte jusqu'à 127 (2^7 - 1, puisque il y a un bit de signe)</p>
                            <p>Après pour le NULL il me semble que c'est juste un alias soit pour 0 soit pour (void*)0, la différence c'est pour la lisibité du code et savoir qu'on manipule un pointeur.</p>
                            <p> </p>
                            <p>Sinon Nell tu peux utiliser memset(grille[x][y].tab, 9, 0);  si tu veux l'initialiser à 0 🙂 </p>

                            Code : https://github.com/thearcanum
                            Les brises de l'aube ont des secrets à te raconter. Ne te rendors pas !

                            1 Reply Last reply
                            1
                            • AlexMogA
                              AlexMogA
                              AlexMog
                              Modérateur spécialisé
                              wrote on last edited by
                              #14

                              <blockquote class="ipsQuote" data-cite="arcanum" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="15156" data-ipsquote-contentid="1446" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1421228044" data-ipsquote-username="arcanum"><div>
                              <div>
                              <p>255 c'est déjà un unsigned char (2^8 - 1), le char signé il monte jusqu'à 127 (2^7 - 1, puisque il y a un bit de signe)</p>
                              <p>Après pour le NULL il me semble que c'est juste un alias soit pour 0 soit pour (void*)0, la différence c'est pour la lisibité du code et savoir qu'on manipule un pointeur.</p>
                              <p> </p>
                              <p>Sinon Nell tu peux utiliser memset(grille[x][y].tab, 9, 0);  si tu veux l'initialiser à 0 🙂 </p>
                              </div>
                              </div></blockquote>
                              <p>Décidément, faut vraiment que je dorme de temps à autres... En plus; j'ai bien précisé que c'était un octet u_u, faut vraiment que j'aille me coucher... XD</p>
                              <p>+1 pour le memset, après y'a toujours la technique de l'auto-memset via init du C ({0}) \o/.</p>
                              <p>Sinon oui, NULL est un define sur (void*)0 (tout comme TRUE est un define sur 1 et FALSE sur 0). Il est effectivement utilisé pour la lisibilité du code.</p>

                              Multiplayer GameDev @ Unexpected
                              

                              Mon CV

                              1 Reply Last reply
                              1

                              Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                              Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                              With your input, this post could be even better 💗

                              Register Login
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Login or register to search.
                              Powered by NodeBB Contributors
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups