Envoyer un double tableau à une fonction en C

Résolu
pandageek Messages postés 379 Statut Membre -  
pandageek Messages postés 379 Statut Membre -
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 19031 Statut Modérateur 3 020
 
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 379 Statut Membre 4
 
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 19031 Statut Modérateur 3 020
 
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 379 Statut Membre 4
 
en effet en déclarant pathLogs comme pointeur ça fonctionne tout de suite mieux.
merci à toi ;)
0
pandageek Messages postés 379 Statut Membre 4
 
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 19031 Statut Modérateur 3 020
 
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 379 Statut Membre 4
 
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 19031 Statut Modérateur 3 020
 
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 379 Statut Membre 4
 
c'est à dire?
0
KX Messages postés 19031 Statut Modérateur 3 020
 
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 6373 Statut Contributeur 1 106
 
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 19031 Statut Modérateur 3 020
 
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 6373 Statut Contributeur 1 106
 
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 379 Statut Membre 4
 
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 19031 Statut Modérateur 3 020
 
"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 379 Statut Membre 4
 
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 379 Statut Membre 4
 
merci à toi, tout fonctionne sans erreurs ;)
0