a propos de char ** - C - Programmation
Marsh Posté le 28-10-2005 à 11:55:09
result[i] = entry->d_name;
entry->d_name ne t'appartient pas. tu dois le copier
et pour éviter un double parcours, man realloc
Marsh Posté le 28-10-2005 à 12:01:19
realloc j'ai essayé ms j'ai absolument rien compris .
*(file+1) on peut aussi faire file[i] ms ca sait pas le plus important.
Enfin pour result[i] = entry->d_name tu veux dire que je doit faire un strcpy?
Marsh Posté le 28-10-2005 à 12:09:57
Un strcpy cause un segment fault dans mon cas .
Peux-tu m'explique le realloc?
Marsh Posté le 28-10-2005 à 12:13:55
super-tupapau a écrit : Un strcpy cause un segment fault dans mon cas . |
t'es un marrant, copier oui, mais copier où ...
Marsh Posté le 28-10-2005 à 12:14:41
Merci cela fonctionne parfaitement mais j'ai pas compris pourquoi je devais dupliquer la chaine?
Marsh Posté le 28-10-2005 à 12:19:31
voila avec un realloc:
Code :
|
Marsh Posté le 28-10-2005 à 13:20:52
Après avoir lu le man sur readdir j'ai pu voir que c'etait un tableau de caractères qui était retourné et pas un pointeur sur un tableau de caractère.
Marsh Posté le 28-10-2005 à 13:23:03
et quand bien même : ton entry, il pointe on ne sait où ... encore une fois, voir la doc.
Marsh Posté le 28-10-2005 à 20:36:14
[...] |
Marsh Posté le 28-10-2005 à 21:56:33
Taz a écrit : pas standard. |
spa standard strdup
j'ai vérifié t'as raison
j'ai appris un truc, pourtant je m'en sers souvent et j'aurais mis ma main à couper que c'était standard.
En plus c'est bien utile comme fonction dommage.
Marsh Posté le 28-10-2005 à 23:10:48
jesus_christ a écrit : spa standard strdup |
Pas standard ISO, mais c'est quand même POSIX.2
Et vu qu'il utilise dirent.h (POSIX.1), de toute manière, il peut utiliser strdup().
Marsh Posté le 28-10-2005 à 23:12:50
ouais mais bon c'est l'ISO que je considère comme standard, POSIX c'est gentil mais fork() aussi c'est POSIX et ça marche pas terrible sous win
merci pour l'info
Marsh Posté le 28-10-2005 à 23:16:58
Euh oui si on veut vraiment du code portable, c'est ISO.
Je disais juste que vu qu'il s'était déjà engagé dans du POSIX, un strdup() de plus ou de moins ne faisait pas grande différence.
Marsh Posté le 29-10-2005 à 08:39:45
chrisbk a écrit :
|
juste pour être aussi HS : sémantiquement c'est l'écriture la + juste
edit
Marsh Posté le 30-10-2005 à 15:04:52
je voudrais savoir si il etait possible de faire ceci:
Code :
|
et apres de l'allouer avec malloc ptr en sachat que ma_struct et déclararé avant.
Marsh Posté le 30-10-2005 à 18:01:15
ok ms je n'y arrive pas:
Code :
|
Le compilateur me retourne erreur: request for member name in something not a structure or union
Marsh Posté le 30-10-2005 à 18:50:33
c'est moi ou la définition de ta struct est foireuse.
De plus selon toi, quel est le type de *list ?
Marsh Posté le 30-10-2005 à 18:56:06
Pour le type *list de toute facon c'un pointeur donc c 4 qui sera retourner koi qu'il arrive.
Pour la definition de ma structure explique stp?
Marsh Posté le 30-10-2005 à 19:07:41
arch est une variable globale dans ton programme, je doute que c'est ça que tu voulais obtenir !
(pour t'en convaincre, tu peux très bien faire arch.name = NULL; )
J'aurais plutôt écrit struct arch {...};
Ensuite, ton list aura come type "struct arch ***"
Donc list[i] n'aura pas "arch*" comme type mais bien "arch**"
Et arch** n'a pas le type d'un pointeur sur une structure, tu ne peux donc pas écrire list[i]->name;
remarque : il est très rare de se servir de "pointeurs de pointeurs de pointeurs"
Marsh Posté le 30-10-2005 à 19:19:01
ok ca se complique trop je vais faire autrement c'est pas tres pratique comme ca.
Marsh Posté le 30-10-2005 à 19:52:44
je trouve pas d'autre solution en fait je voulais faire un tableau de pointeur sur des structures.
Marsh Posté le 31-10-2005 à 01:15:05
super-tupapau a écrit : je voudrais savoir si il etait possible de faire ceci:
|
Oui, et tu peux même utiliser realloc(). Avec NULL c'est pareil que malloc().
Marsh Posté le 31-10-2005 à 01:16:39
super-tupapau a écrit : je trouve pas d'autre solution en fait je voulais faire un tableau de pointeur sur des structures. |
Comme d'hab :
|
Marsh Posté le 31-10-2005 à 12:06:40
Le problème ne vient pas du malloc voila le code:
Code :
|
ligne de compilation: gcc -Wall -W -O2 -pedantic -o diskclean main.c
ca donne:
main.c:58: erreur: request for member name in something not a structure or union
main.c:59: erreur: request for member name in something not a structure or union
main.c:60: erreur: request for member chemin in something not a structure or union
main.c:61: erreur: request for member chemin in something not a structure or union
main.c:62: erreur: request for member next in something not a structure or union
main.c:63: erreur: request for member subdir in something not a structure or union
Marsh Posté le 31-10-2005 à 12:26:27
super-tupapau a écrit : Le problème ne vient pas du malloc voila le code: |
Ce code ne compile pas.
Il faut poster du code complet, compilable (sauf erreurs), mais réduit au minimum qui montre le défaut.
Marsh Posté le 31-10-2005 à 12:40:59
ok voila tous le programme:
Code :
|
Marsh Posté le 31-10-2005 à 13:05:27
super-tupapau a écrit : ok voila tous le programme:
|
Une étoile de trop...
diskc_arch *list = NULL; |
Citation :
|
Ben non. Relire la doc de strdup(). Il fait l'allocation tout seul...
list[i]->name = strdup( entry->d_name ); |
Quand à la libération, un simple free() est bien optimiste!
Il faut tout parcourir et libérer tout ce qui a été alloué sans couper la branche sur laquelle on est assis...
Marsh Posté le 31-10-2005 à 13:37:16
j'ai compris!
quand je même ceci:
Code :
|
ca donne un pointeur sur un pointeur sur un pointeur.
j'ai donc supprimer mit
Code :
|
comme ca j'ai plus d'erreur de compilation ms un segment fault avec list[i]->name = strdup( entry->d_name );
et pour le free je ferais comme ca?
Code :
|
Marsh Posté le 31-10-2005 à 13:45:54
super-tupapau a écrit : j'ai compris!
|
Ben oui. Tu as alloué le tableau mais pas les éléments...
Citation :
|
Insuffisant. Chaque strdup() doit être compensé par un free(). C'est dans la doc, tu ne l'as donc pas lue malgré mon insistance ? Mais qu'est-ce qu'il faut faire pour se faire entendre ?
Marsh Posté le 28-10-2005 à 11:42:05
Rebonjour pour ce qui m'ont déjà aidé ( ). Maintenant je pense bien maitriser les pointeurs et je fait un petit programme qui est chargé de rechercher les fichiers en doubles dans un groupe dossier ( par exemple le dossier personnel ) malgrès tout un problème persiste sur char ** et char *[].
voici le code erroné:
Le programme affiche bien les fichiers du dossier /home/pierre ms certain sont coupés ou "collé" à d'autre. Il n'y a aucune erreur de segmentation le problème vient surment au niveau de:
puisque quand je met un printf("%s\n", *(result + i)); dans la boucle while de la fonction diskc_readir cela me retourne parfaitement les dossiers et fichiers.
Merci bcp de votre aide.