Utilisateur anonyme
-
29 déc. 2005 à 13:22
t_pabo
Messages postés1Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention 3 janvier 2006
-
3 janv. 2006 à 11:33
Bonjour à tous!
Alors voila, j'ai un petit problème tout bête mais je n'arrive pas à la résoudre et mes recheches ne m'ont pas trop éclairé.
Je souhaite remplir un tableau à 2 dimensions char tableau[][].
Je connais la taille maximale des chaines que je souhaite mettre dans le tableau : longueur_max=10
Mais je ne sais pas à l'avance combien de chaines différentes je vais devoir entrer dans mon tableau. Je récupère cette information au cours de l'exécution: int nb_chaine.
J'ai donc déclaré un tableau: char tableau[nb_chaine][longueur_max].
Jusque là, pas de problèmes!
Le hic c'est que je ne sais pas comment le remplir avec mes différentes chaines.
Ces chaines sont contenues dans une liste chainée que je parcours du début à la fin en pointant sur le champ où se trouve la chaine.
Pouvez vous me renseigner sur la manière de remplir ce tableau?
(ou peut-être connaissez vous des liens qui pourraient m'éclairer?)
Je vous remercie par avance!!
Djib
A voir également:
Remplir un tableau de caractere en c
Mettre une chaine de caractere dans un tableau en c - Meilleures réponses
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 29 déc. 2005 à 13:34
Tu les remplis avec strcpy (tu copie chaque chaine une par une)
Par contre si char tableau[nb_chaine][longueur_max] marche avec ton compilo, ce sera pas forcément le cas. Normalement les indices pour la déclaration de tableau doivent être des constantes
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 29 déc. 2005 à 14:27
Ton tableau doit au moins avoir la premiere dimension de connue pour faire simple, sinon tu vas te prendre la tete avec les réallocations et le tralala...
Pour ce faire fixe un indice max pour le nombre de chaines que tu puisses avoir et alloue les chaines au fur et a mesure.
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20132 29 déc. 2005 à 14:47
Je confirme ce que vecchio56 dit : en C on ne peut pas allouer de tableau lorque l'on ne connait pas la taille a la compilation. Pour ce faire tu peut faire ceci :
char **Tableau;
char *Tab;
long i;
Tableau = (char**)malloc(nb_chaine * sizeof(char*));
i = 0;
while(i < nb_chaine)
{
Tableau[i] = (char*)malloc(longueur_max);
strncpy(Tableau[i], /*ta source*/, longueur_max - 1);
Tableau[i][longueur_max - 1] = 0;
i++;
}
/*ne pas oublier de liberer la emoire une fois que tu ne t'en sert plus*/
i = 0;
while(i < nb_chaine)
{
if(Tableau[i])
free(Tableau[i]);
i++;
}
free(Tableau);
Tu remarquera que j'ai préférer utiliser strncpy qui permet de copier un nombre preci d'élément. Cela evite que si ta source fait 30 lettres tu en copie 30 aussi. Je force le 0 en fin de chaine pour la rendre utilisable car les strncpy et strcpy ne copient pas le \0. (possibilitée d'utiliser calloc(1, longueur_max) ce qui permet d'allouer une zone memoire comme malloc, mais en la mettant à 0)
Le travail c'est la santé, ne rien faire c'est la préservé !!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 29 déc. 2005 à 15:27
Moi ma vision c'est que de les compilateurs ont un peu chacun leur norme donc je choisis d'abord le compilateur et puis je l'exploie pour avoir le meilleur code
Tout d'abord un grand merci pour toutes vos réponses!
Je n'ai pas encore eu le temps de les tester mais je vais m'y mettre et je rapporterai le résultat ici.
Petite précision à propos de mon compilateur: je ne l'ai pas mentionné et je m'en excuse mais en fait je ne connais pas son nom. En fait je code sur un serveur Open VMS et j'utilise le compilateur qu'il y'a dessus.
Pour la longueur de la chaine, elle est fixe: #define longueur max 10
mais pour le nombre de chaines, cela dépend du nombre de structures chainées.
Donc je ne peux le connaitre à l'avance.
En tout cas merci beaucoup à vous et à bientôt pour des nouvelles!
Me revoilà!
Donc après quelques essais, il semble que je n'ai pas encore la bonne solution. Je vais tacher de donner plus de détails pour permettre une meilleure compréhension de ce que je souhaite faire.
J'utilise une bibliothèque de fonctions graphiques appelées SMG. Cela me permet entre autre de créer des menus. voici le prototype de la fonction:
D'ordinaire, je créer un menu en "dur" c'est à dire que je passe à cette fonction un tableau dont je connais les dimensions. Par exemple:
#define NB_CHOIX 3
#define LONGUEUR_MAX_CHOIX 8
...
char liste_choix[NB_CHOIX][LONGUEUR_MAX_CHOIX]={"choix1","choix2","choix3"};
seulement, là je ne sais pas combien de choix je vais avoir avant l'exécution.
Alors pour les solutions proposées:
char **Tableau et char *Tableau[MAX_STR], la fonction smg$creer_menu ne marchera pas,j'ai une erreur.
Pour le strcpy: j'ai fait:
#define TAILLE_MAX_ITEM 10
...
char items_menu[nb_items_menu][TAILLE_MAX_ITEM];
int i;
for (i=0;i<nb_items_menu;i++)
{
strcpy(items_menu[i][TAILLE_MAX_ITEM],p->nom);
p=p->suivant;
}
Mais là j'ai des warnings:
-"An Array is being accessed outside the bounds specified for the array type"
-"items_menu[i][TAILLE_MAX_ITEM]" de type char va être converti en pointeur de char.
Voilà! J'espère que les choses sont un peu mieux définies maintenant.
En tout cas, merci beaucoup pour votre patience et pour votre aide que j'apprécie grandement! Bonne journée à vous!
A bientôt!
Djib
Il semblerait que ce soit bien ça! Je m'étais effectivement bien planté sur le strcpy... Il faut que je continue un peu le développement de mon application pour être sûr mais ça doit être bon!
Pour ce qui est du tableau, je suis catégorique, c'est bien items_menu[nb_items_menu][TAILLE_ITEM_MAX].
Vraiment un grand grand merci de m'avoir débloqué!
Grâce à votre aide, je suis finalement parvenu à débloquer le truc.
J'avais quelques soucis avec un simple strcpy du coup j'ai utilisé un strncpy selon le modèle de la source de ctx_man.
Voilà ce que ça donne:
while (p != NULL)
{
strncpy(items_menu[i],p->chaine,TAILLE_MAX_ITEM-1);
items_menu[i][TAILLE_MAX_ITEM-1] = 0;
p = p->suivant;
i++;
}
Encore une fois merci beaucoup pour votre patience et pour votre aide!
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 29 déc. 2005 à 16:54
strcpy(items_menu[i][TAILLE_MAX_ITEM],p->nom);
non, le premier paramètre doit être un pointeur, ou un tableau ici:
strcpy(items_menu[i],p->nom);
Après, est ce que c'est char items_menu[nb_items_menu][TAILLE_MAX_ITEM]; ou char items_menu[TAILLE_MAX_ITEM][nb_items_menu], j'arrive jamais à m'en souvenir