nell Posté(e) January 10, 2015 Signaler Share Posté(e) January 10, 2015 (modifié) Hey, je commence un projet en C et j'ai un problème avec une fonction Je résume rapidement la fonction: 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. 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...) 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); } Modifié January 10, 2015 par nell Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
davydavek Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 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. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
AlexMog Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 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. +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. (Pour info, les normes sont: ansiC et isoC). 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): -W -Wall -Werror -pedantic -ansi Tu verra, tu évite 90% des problèmes communs (comme la non initialisation des vars, le pointage foireux, etc...) 2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
nell Posté(e) January 11, 2015 Auteur Signaler Share Posté(e) January 11, 2015 (modifié) Merci! c'était une des erreurs et ça m'a permis de trouver l'autre du coup: i = fgetc(nomFichier); j = fgetc(nomFichier); 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] 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 Modifié January 11, 2015 par nell Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
davydavek Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 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. ex: '1' = 49 49 - 48 = 1 '6' = 54 54 - 48 = 6 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
nell Posté(e) January 11, 2015 Auteur Signaler Share Posté(e) January 11, 2015 Ah oui ça facilite tout en faisant comme ça en fait x) Merci beaucoup alors, la fonction marche exactement comme il faut Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
davydavek Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 De rien, n’hésites pas a demander de l'aide si tu as d'autres questions Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
AlexMog Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 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. ex: '1' = 49 49 - 48 = 1 '6' = 54 54 - 48 = 6 La fonction atoi fais le café aussi à ce niveau là . Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
davydavek Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 fgetc retourne un int directement, et atoi requiert un char*, donc dans ce cas ce n'est pas vraiment utile de l'utiliser Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
AlexMog Posté(e) January 11, 2015 Signaler Share Posté(e) January 11, 2015 fgetc retourne un int directement, et atoi requiert un char*, donc dans ce cas ce n'est pas vraiment utile de l'utiliser Effectivement, autant pour moi. La technique du 48 fonctionne, mais il es plus conseillé d'utiliser directement la valeur du char, comme ceci: 49 - '0' = 1. (ce qui se traduit par '1' - '0' = 1). Voilàà: 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
nell Posté(e) January 12, 2015 Auteur Signaler Share Posté(e) January 12, 2015 (modifié) Hmm ok la différence de 2 char donne un int alors? c'est toujours bon à savoir Je suis pratiquement à la fin du projet mais je bute sur un petit truc On a un int qui ressemble à ça: grille[x][y].tab[z] (il a une valeur entre 0 et 9) Le prof veut qu'on rende égal grille[x][y].tab à NULL Seulement quand je le fais ça me dit que je peux pas assigner un void a un int. 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? EDIT: J'ai mis la première case= '\0', on verra bien ce que ça donne Modifié January 13, 2015 par nell Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
AlexMog Posté(e) January 14, 2015 Signaler Share Posté(e) January 14, 2015 (modifié) Hmm ok la différence de 2 char donne un int alors? c'est toujours bon à savoir Je suis pratiquement à la fin du projet mais je bute sur un petit truc On a un int qui ressemble à ça: grille[x][y].tab[z] (il a une valeur entre 0 et 9) Le prof veut qu'on rende égal grille[x][y].tab à NULL Seulement quand je le fais ça me dit que je peux pas assigner un void a un int. 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? EDIT: J'ai mis la première case= '\0', on verra bien ce que ça donne Alors, pas du tout, un char moins un char = un char. 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) 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) Pour le NULL, n'oublie pas que NULL != 0. 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). Ainsi, un int peux avoir pour valeur 0, mais pas NULL. A contrario, un pointeur peux avoir la valeur NULL et 0. Modifié January 14, 2015 par AlexMog 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
arcanum Posté(e) January 14, 2015 Signaler Share Posté(e) January 14, 2015 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) 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. Sinon Nell tu peux utiliser memset(grille[x][y].tab, 9, 0); si tu veux l'initialiser à 0 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
AlexMog Posté(e) January 14, 2015 Signaler Share Posté(e) January 14, 2015 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) 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. Sinon Nell tu peux utiliser memset(grille[x][y].tab, 9, 0); si tu veux l'initialiser à 0 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 +1 pour le memset, après y'a toujours la technique de l'auto-memset via init du C ({0}) \o/. 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. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.