Envoyer un double tableau à une fonction en C
Résolu/Fermé
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
-
Modifié par pandageek le 26/09/2012 à 22:34
pandageek Messages postés 359 Date d'inscription samedi 6 août 2011 Statut Membre Dernière intervention 27 mai 2014 - 30 sept. 2012 à 13:45
pandageek Messages postés 359 Date d'inscription samedi 6 août 2011 Statut Membre Dernière intervention 27 mai 2014 - 30 sept. 2012 à 13:45
A voir également:
- Envoyer un double tableau à une fonction en C
- Double ecran - Guide
- Whatsapp double sim - Guide
- Fonction si et - Guide
- Tableau croisé dynamique - Guide
- Tableau word - Guide
5 réponses
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
26 sept. 2012 à 23:18
26 sept. 2012 à 23:18
Ce que tu fais ce n'est pas un double tableau, mais un tableau de chaînes de caractères. Alors oui une chaîne de caractère c'est un tableau, mais dans ce cas tout est pointeur et on ne s'en sort plus.
Bref, essayes comme ceci (j'ai enlevé ce qui ne servait à rien, remets les si tu veux)
Remarque : si c'est pour afficher des informations aussi régulières que ça, c'est inutile de créer à la main tes pathlogs, utilises ta boucle !
Bref, essayes comme ceci (j'ai enlevé ce qui ne servait à rien, remets les si tu veux)
void createLogs(char* pathLogs[]) { int i; for (i=0 ; i<12 ; i++) printf("%s\n", pathLogs[i]); } int main() { char* pathLogs[12] = { "txt\\0.txt", "txt\\1.txt", "txt\\2.txt", "txt\\3.txt", "txt\\4.txt", "txt\\5.txt", "txt\\6.txt", "txt\\7.txt", "txt\\8.txt", "txt\\9.txt", "txt\\10.txt", "txt\\11.txt" }; createLogs(pathLogs); return 0; }
Remarque : si c'est pour afficher des informations aussi régulières que ça, c'est inutile de créer à la main tes pathlogs, utilises ta boucle !
for (i=0 ; i<12 ; i++) printf("txt\\%d.txt\n", i);
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
27 sept. 2012 à 20:12
27 sept. 2012 à 20:12
la régularité c'est pour les tests ^^
en mettant :
et :
j'obtiens :
en mettant :
(ligne pointé par l'erreur) char createLogs(char *pathLogs[], char retourCreateLogs[])
et :
createLogs(pathLogs, retourCreateLogs);
j'obtiens :
note: expected 'char **' but argument is of type 'char (*)[100]'
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
Modifié par KX le 27/09/2012 à 20:30
Modifié par KX le 27/09/2012 à 20:30
Quand je mettais "j'ai enlevé ce qui ne servait à rien, remets les si tu veux", je pensais à faire des modifications correctes. De toute évidence retourCreateLogs doit être construit comme pathLogs, c'est à dire comme je l'ai fait hier, et non pas comme tu l'avais fait au départ !
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
27 sept. 2012 à 22:32
27 sept. 2012 à 22:32
en effet en déclarant pathLogs comme pointeur ça fonctionne tout de suite mieux.
merci à toi ;)
merci à toi ;)
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
27 sept. 2012 à 23:15
27 sept. 2012 à 23:15
en fait j'ai encore :
à chaque fois que j'envoie pathLogs à une fonction (il y est inutilisable)
warning: passing argument 1 of 'lectureLogs' from incompatible pointer type
à chaque fois que j'envoie pathLogs à une fonction (il y est inutilisable)
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
27 sept. 2012 à 23:27
27 sept. 2012 à 23:27
moi je ne sais pas ce qu'est "lectureLogs", ce serait peut-être bien de remettre ton code maintenant que tu l'as modifié !
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
Modifié par pandageek le 27/09/2012 à 23:35
Modifié par pandageek le 27/09/2012 à 23:35
c'est a peu près la même fonction
char lectureLogs(char *pathLogs[], char *retourReadLogs[]) { char i = 0; FILE *folder = NULL; for (i=0 ; i<12 ; i++) { folder = NULL; if (existFolder(pathLogs[i], NULL)) { folder = fopen(pathLogs[i], "r"); fgets(retourReadLogs[i], 100, folder); } else { retourReadLogs[i] = "NULL"; } } fclose(folder); return 1; } int main() { char *pathLogs[12][100] = { "txt\\0.txt", "txt\\1.txt", "txt\\2.txt", "txt\\3.txt", "txt\\4.txt", "txt\\5.txt", "txt\\6.txt", "txt\\7.txt", "txt\\8.txt", "txt\\9.txt", "txt\\10.txt", "txt\\11.txt" }; char *retourReadLogs[12][1000]; lectureLogs(pathLogs,retourReadLogs); }
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
27 sept. 2012 à 23:46
27 sept. 2012 à 23:46
Il faut oublier les doubles tableaux, tu as des tableaux simples de char* et c'est déjà pas mal.
Ce n'est donc pas char *pathLogs[12][100] mais char* pathLogs[12], idem pour retourReadLogs.
Ce n'est donc pas char *pathLogs[12][100] mais char* pathLogs[12], idem pour retourReadLogs.
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
28 sept. 2012 à 00:10
28 sept. 2012 à 00:10
c'est à dire?
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
28 sept. 2012 à 06:38
28 sept. 2012 à 06:38
Tu écris :
Alors qu'il faudrait écrire :
Ton [100] est faux ! Ce que tu as c'est une liste de 12 chaînes de caractères, pas une matrice 12x100.
De même pour :
char *pathLogs[12][100] = { "txt\\0.txt", "txt\\1.txt",
Alors qu'il faudrait écrire :
char *pathLogs[12] = { "txt\\0.txt", "txt\\1.txt",
Ton [100] est faux ! Ce que tu as c'est une liste de 12 chaînes de caractères, pas une matrice 12x100.
De même pour :
char *retourReadLogs[12][1000];
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 28/09/2012 à 11:36
Modifié par [Dal] le 28/09/2012 à 11:36
Salut Pandageek, KX,
Je pense que ce serait bien de clarifier pourquoi Pandageek veut créer un "double tableau". Compte tenu de la nature des chaînes en C, ce qui serait exact, ce serait :
C'est à dire, non pas un tableau à deux dimensions de pointeurs sur des char, mais un tableau à deux dimensions de char. Note la disparition du * dans la déclaration.
Ce qui revient à dire : déclarer un tableau de dimension 12 dont chaque "rangée" peut contenir 100 char. Donc, de l'espace pour 12 chaînes C de taille maximale 100 (y compris le \0).
Pandageek : est-ce la raison pour laquelle tu veux veut faire un tableau à "deux dimensions" ?
Dal
Je pense que ce serait bien de clarifier pourquoi Pandageek veut créer un "double tableau". Compte tenu de la nature des chaînes en C, ce qui serait exact, ce serait :
char pathLogs[12][100] = { "txt\\0.txt", "txt\\1.txt", (...)
C'est à dire, non pas un tableau à deux dimensions de pointeurs sur des char, mais un tableau à deux dimensions de char. Note la disparition du * dans la déclaration.
Ce qui revient à dire : déclarer un tableau de dimension 12 dont chaque "rangée" peut contenir 100 char. Donc, de l'espace pour 12 chaînes C de taille maximale 100 (y compris le \0).
Pandageek : est-ce la raison pour laquelle tu veux veut faire un tableau à "deux dimensions" ?
Dal
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
28 sept. 2012 à 11:39
28 sept. 2012 à 11:39
char* pathLogs[12] est également correct, ce qui permet de passer n'importe quel char* dans le tableau, sans se limiter à 100 caractères, ni les utiliser inutilement quand il n'en utilise que 10 comme ici.
Le problème c'est que pandageek n'est pas cohérent entre les types des tableaux qu'il passe dans la fonction et ceux qui sont déclaré dans cette fonction.
En utilisant char* pathLogs[] dans la fonction c'est plus souple qu'un double tableau où l'on serait obligé de spécifier la taille du deuxième tableau : char pathLogs[][100]
Mais il faut bien sûr que le pathLogs déclaré dans le main soit de même type, et non pas un mélange des genre avec un char* pathLogs[12][100] qui serait alors un double tableau de char* et donc un triple tableau de char !!!
Le problème c'est que pandageek n'est pas cohérent entre les types des tableaux qu'il passe dans la fonction et ceux qui sont déclaré dans cette fonction.
En utilisant char* pathLogs[] dans la fonction c'est plus souple qu'un double tableau où l'on serait obligé de spécifier la taille du deuxième tableau : char pathLogs[][100]
Mais il faut bien sûr que le pathLogs déclaré dans le main soit de même type, et non pas un mélange des genre avec un char* pathLogs[12][100] qui serait alors un double tableau de char* et donc un triple tableau de char !!!
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 28/09/2012 à 11:58
Modifié par [Dal] le 28/09/2012 à 11:58
Oui, je suis d'accord avec toi char* pathLogs[12] est très bien pour l'initialisation de cette variable et optimise la mémoire puisque le compilateur connait la longueur des chaînes à insérer en les insérant à la suite de la déclaration et qu'on n'a visiblement pas besoin de 100 char.
Mais tu vois que notre ami Pandageek déclare de la même façon "retourReadLogs" et qu'il veut visiblement l'utiliser dans la fonction appelée pour stocker 100 char avec fgets.
C'est ce qui m'a mis la puce à l'oreille (bien qu'il mette parfois un indice 1000 et parfois un indice 100,... bref).
Maintenant, je ne peux que faire des suppositions, c'est à Pandageek de s'exprimer.
(il y a plein d'autres problèmes dans le code, mais déjà, ce serait bien de clarifier celui-là)
Dal
Mais tu vois que notre ami Pandageek déclare de la même façon "retourReadLogs" et qu'il veut visiblement l'utiliser dans la fonction appelée pour stocker 100 char avec fgets.
C'est ce qui m'a mis la puce à l'oreille (bien qu'il mette parfois un indice 1000 et parfois un indice 100,... bref).
Maintenant, je ne peux que faire des suppositions, c'est à Pandageek de s'exprimer.
(il y a plein d'autres problèmes dans le code, mais déjà, ce serait bien de clarifier celui-là)
Dal
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
29 sept. 2012 à 00:18
29 sept. 2012 à 00:18
en effet pour les chemins je n'ai pas optimisé la mémoire ^^
mais comme le dit Dal retour read logs et amené à contenir beaucoup de caractères donc préciser une taille est indispensable.
mais comme le dit Dal retour read logs et amené à contenir beaucoup de caractères donc préciser une taille est indispensable.
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
29 sept. 2012 à 00:27
29 sept. 2012 à 00:27
"préciser une taille est indispensable", ça dépend ce que tu fais.
Si c'est un tableau de pointeurs char*, tu peux remplacer ton tableau directement avec tes valeurs, sans te soucier de la taille que cela prendra. Et puis il y a l'allocation dynamique aussi...
Si c'est un tableau de pointeurs char*, tu peux remplacer ton tableau directement avec tes valeurs, sans te soucier de la taille que cela prendra. Et puis il y a l'allocation dynamique aussi...
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
29 sept. 2012 à 00:29
29 sept. 2012 à 00:29
détaille un peu, si il te plait.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pandageek
Messages postés
359
Date d'inscription
samedi 6 août 2011
Statut
Membre
Dernière intervention
27 mai 2014
4
30 sept. 2012 à 13:45
30 sept. 2012 à 13:45
merci à toi, tout fonctionne sans erreurs ;)