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
Bonjour,
voici mon code C :
char createLogs(char pathLogs[], char retourCreateLogs[]) 
{ 
    char i = 0; 

    for (i=0 ; i<12 ; i++) 
    { 
         printf("%s\n", pathLogs[i]); 
    } 
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" 

    },  
    retourCreateLogs[12] = {0}; 

    createLogs(pathLogs, retourCreateLogs); 
} 


je veux passer mon double tableau à ma fonction mais j'ai une jolie fenêtre qui me dit que mon programme à cessé de fonctionner.
messages d'erreur :
warning: passing argument 1 of 'createLogs' from incompatible pointer type
note: expected 'char *' but argument is of type 'char (*)[100]'|
 
sur la ligne d'appel à la fonction et celle de déclaration de la fonction.
la console n'affiche rien excepté un statut étrange :
Process terminated with status -1073741510 (0 minutes, 7 seconds)


merci de me dire comment faire passer ce tableau.

A voir également:

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
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)

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);
0
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
la régularité c'est pour les tests ^^

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]'
0
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
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 !
0
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
en effet en déclarant pathLogs comme pointeur ça fonctionne tout de suite mieux.
merci à toi ;)
0
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
en fait j'ai encore :
warning: passing argument 1 of 'lectureLogs' from incompatible pointer type

à chaque fois que j'envoie pathLogs à une fonction (il y est inutilisable)
0
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
moi je ne sais pas ce qu'est "lectureLogs", ce serait peut-être bien de remettre ton code maintenant que tu l'as modifié !
0
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
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);  
}
0
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
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.
0
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
c'est à dire?
0
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
Tu écris :

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];
0
[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
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 :

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
0
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
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 !!!
0
[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
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
0
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
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.
0
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
"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...
0
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
détaille un peu, si il te plait.
0

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
merci à toi, tout fonctionne sans erreurs ;)
0