Déclaration dynamique d'un tableau de chaines de caracteres

Signaler
Messages postés
6
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
23 décembre 2006
-
Messages postés
2
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
5 décembre 2003
-
Bonjour à tous !
J'essaie de déclarer un tableau de chaines de caractéres dynmiquement, j'ai essayé cette methode, ca ne fonctionne pas, la compilation marche, mais au run time, il y'a une erreur du genre : la memoire ne peut pas etre 'read' ! comme dirais mon prof d'info ! lol

char** Tableau = new char* [SIZE];

Je ne vois absoluement pas l'erreur que j'ai faite, enfin, c les joies de la programmation !!!!

Paulien - La Rochelle - BTS IRIS

10 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Classique, tu as un tableau de POINTEURS, faut ensuite allouer pour chacun la memoire.
BruNews, ciao...
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
Entre Rochelais j'aimerais bien t'aider mais la je ne pige pas le blem.
Ce que BruNews t'a répondu ne me semble pas correcte du tout, on peut tout à fait faire comme tu as fais sans allouer à chaque espace mémoire une valeur. C'est bien d'ailleur l'interêt de cette méthode. Dis moi quel est ton compilateur ? Sous quel environnement tu programme ? et enfin quel est la taille de ton SIZE ?
A+.
Bouba
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
salut bouba, comment pas correct ???
Il dit bien "TABLEAU de chaines", si c'est le cas ou sont les tableaux char que chaque ptr va referencer ?
A moins qu'il n'ait calculer SIZE en rapport ...
BruNews, ciao...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Ce que veux expliquer BruNews et ce qui m'apparait comme la solution du problème:

#define SIZE ...
#define CHAINE1 ...
#define CHAINE2 ...

char** Tableau = new char* [SIZE];

Tableau[0]=new char [strlen(CHAINE1) + 1];
strcpy(Tableau[0], CHAINE1);

Tableau[1]=new char [strlen(CHAINE2) + 1];
strcpy(Tableau[1], CHAINE2);

// Utilisation ...

// Libération de la mémoire
for(int i=0;i<SIZE;i++)
delete [] Tableau[i];

delete [] Tableau;

Kaid
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ben voile, on arrive au meme point, alloc des differents espaces pour chaque string et maintenant oui que va tourner.
et vive La Rochelle.
BruNews, ciao...
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
Ouai, en y repensant tu as raison, excuse.
A+.
Bouba
Messages postés
77
Date d'inscription
lundi 15 avril 2002
Statut
Membre
Dernière intervention
16 juin 2004

Juste un dernier ajout pour expliquer pourkoi tu avais ce message "memoire ne peut etre lue"...
Ce que tu as fait est un tableau de pointeurs de chaine de char de taille SIZE. Or par defaut le compilateur met dans ces adresses memoires une valeur ( par ex: 0xcdcdcdcd) qui est une adresse memoire non lisible. Voila pourquoi tu as cette erreur... En dynamique, trois choses a faire tout le temps:
1/ Allocation de la memoire utile
2/ Initialisation des valeurs de la memoire à NULL dans le cas de pointeurs. (exactement ton cas)
3/ Ne pas oublier de deallouer proprement sans fuite memoire...
Wala,
Bon dev,
<<-- H@ldwin -->>
Messages postés
6
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
23 décembre 2006

Merci a tous de l'aide que vous m'apportez, le probléme est que je ne peux pas definir de constantes, en effet, la taille du tableau doit etre declaree en dynamique, c une variable calculée, et les chaines sont aussi insérées en dynamique dans le tableau (à l'execution et non a la compilation), en fait, je fais un generateur de pages html, qui contiendra un nombre de photos precisé par l'utilisateur, et l'utilisateur entrera lui même les chaines de caractére pour les commentaires de chaque photo, ensuite, lorsque je construit ma page html, je fais une boucle sur le nombre de photos en affichant a chaque fois le commentaire correspondant a la photo. Voila donc le probleme
Merci
PAulien
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
tu n'es pas oblige d'utiliser des constantes en allocation dynamique. Par contre les new, avis perso, sont valables pour instancier une classe car ils appellent le constructeur mais ici malloc ferait l'affaire en moins de code genere. Si tu vises win32 alors HeapAlloc() sera encore + direct.
BruNews, ciao...
Messages postés
2
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
5 décembre 2003

Alllo, j'imagine que tu veux un tableau a deux dimensions.
tu dois donc allouer de la mémoire dynamiquement a un premier tableau

variable = new char*[position]

ce tableau point vers un autre tableau ou tu vas copier tes caracteres

premier tableau[position] = new char[poisition];

Donc chacune des cases du premier tableau pointe vers un autre tableau a une dimension.