Remplir un tableau avec des chaines de caractères (C) [Résolu]

Messages postés
5
Date d'inscription
mercredi 28 décembre 2005
Dernière intervention
30 décembre 2005
- 29 déc. 2005 à 13:22 - Dernière réponse :
Messages postés
1
Date d'inscription
mardi 3 janvier 2006
Derniè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
Afficher la suite 

Votre réponse

17 réponses

Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 13:34
0
Merci
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
Commenter la réponse de vecchio56
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
- 29 déc. 2005 à 14:27
0
Merci
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.

Exemple :

#define MAX_STR 64

char *myTab[MAX_STR]
...

for(i=0;i<nb_chaine;i++)
{
printf("\nVeuillez entrer la chaine numéro %i : ", i);
myTab[i] = (char *) malloc(longueur_max);
scanf("%s", myTab[i]);
}

A toit d'adapter le code en fonction de tes besoins. N'oublie pas de désallouer l'espace mémoire en fin de traitement.

Shell
Commenter la réponse de DeAtHCrAsH
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 14:37
0
Merci
Il a réussi a faire char tableau[nb_chaine][longueur_max], il n'y a donc pas besoin d'allocation dynamique ici
Commenter la réponse de vecchio56
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Dernière intervention
20 janvier 2013
- 29 déc. 2005 à 14:47
0
Merci
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é !!!
Commenter la réponse de ctx_man
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 14:53
0
Merci
tableau[nb_chaine][longueur_max] ou nb_chaine n'est pas une constante

On remarque que gcc (MinGW) accepte de faire ceci, mais pas VC++
Commenter la réponse de vecchio56
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
- 29 déc. 2005 à 14:54
0
Merci
vecchio56> Ce n'est qu'une autre solution a son problème, puis autant faire plus propre et moins spécifique

Shell
Commenter la réponse de DeAtHCrAsH
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 15:11
0
Merci
En quoi c'est moins spécifique?
Commenter la réponse de vecchio56
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
- 29 déc. 2005 à 15:22
0
Merci
Spécifique au compilateur!GCC VC7 Déclaration des dimensions obligatoires

Autant coder pour la majorité des compilateurs plutot qu'un.
Mais bon chacun sa vision des choses.

Shell
Commenter la réponse de DeAtHCrAsH
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 15:27
0
Merci
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
Commenter la réponse de vecchio56
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
- 29 déc. 2005 à 15:41
0
Merci
On dirait deux merdeux en train de se chamailler.
Entre ce post et l'autre sur les class ca commence a faire ^_^

Ca me dirait bien de coder pour un projet commun avec toi, risque d'y avoir de l'ambiance, mais aussi beaucoup d'apprentissage.

Shell
Commenter la réponse de DeAtHCrAsH
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 15:44
0
Merci
Tu n'a pas de chance, je travaille toujours seul, depuis que j'ai eu quelques soucis judiciaires suite à des travaux en equipe :)
Commenter la réponse de vecchio56
Messages postés
5
Date d'inscription
mercredi 28 décembre 2005
Dernière intervention
30 décembre 2005
- 29 déc. 2005 à 15:45
0
Merci
Bonjour!

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!

Djib
Commenter la réponse de djibfr
Messages postés
5
Date d'inscription
mercredi 28 décembre 2005
Dernière intervention
30 décembre 2005
- 29 déc. 2005 à 16:49
0
Merci
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:

void smg$creer_menu(int virtual_display_id,char liste_choix[][],int nb_choix)

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
Commenter la réponse de djibfr
Messages postés
5
Date d'inscription
mercredi 28 décembre 2005
Dernière intervention
30 décembre 2005
- 29 déc. 2005 à 18:01
0
Merci
Bonsoir!

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é!

Djib
Commenter la réponse de djibfr
Messages postés
5
Date d'inscription
mercredi 28 décembre 2005
Dernière intervention
30 décembre 2005
- 30 déc. 2005 à 10:14
0
Merci
Bonjour à tous!

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!

Djib
Commenter la réponse de djibfr
Messages postés
1
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
3 janvier 2006
- 3 janv. 2006 à 11:33
0
Merci
Bonjour,
Voila je suis étudiant et je cherche un serveur vms qui contient les bibliothèque SMG...
Pourrais tu me dire sur quel serveur tu travailles?
Commenter la réponse de t_pabo
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 29 déc. 2005 à 16:54
-2
Merci
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
Commenter la réponse de vecchio56

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.