liza Le 29/11/2005 à 15:19 Bonjour tout le monde,
j'ai vraiment besoin d'aide pour mon code:
char **matrice;
matrice=(char**)malloc(27*sizeof(char*));
for(i=0; i<28; i++)
{
matrice[i]=(char *)malloc(29*sizeof(char));
}
//remplit la matrice
matrice[0] = "########\n";
matrice[1] = "# #\n";
matrice[2] ="# $## ###\n";
matrice[3] ="# ## ##\n";
matrice[4] ="#@ .# #\n";
matrice[5] ="### #\n";
matrice[6] =" # ######\n";
matrice[7] =" ####";
matrice[4][1]='@';
Ca me fait un segmentation fault a la derniere ligne. Pourtant je peut afficher ce qu'il y a dans cette case (sans la modifier). (desolee pour les accents, je suis sur un clavier americain).
Merci beaucoup pour votre aide.
liza
(je ne les vois pas perso)

Que cache le pays des Dieux ? -
Forum Ghibli -
Forum LittéraireLa fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
aze Le 29/11/2005 à 16:32 st que quand tu fais un matrice[0] = "########\n"; en fait ce qui se passe c'e tu modifies le pointeur qui se trouve dans la case matrice[0]
en gros tu écrases la valeur renvoyée par malloc (donc tu ne pourras plus libérer la mémoire allouée) et tu la remplaces par l'adresse de la chaine de caractère à l'intérieur de ton programme. c'est juste un pointeur qui est changé, il n'y a pas de recopie
=>strcpy comme l'a conseillé godzil
mais sinon une question plus technique :
les chaines sont dans le segment data du programme c'est bien ça ?
et il y a un seqfault car le segment est en lecture seule ? (ou tout au moins une partie de ce segment)
liza Le 29/11/2005 à 17:10 desolee pour les crochets.
matrice_jeu [ 0] = "########\n";
matrice_jeu [ 1] = "# #\n";
matrice_jeu [ 2] ="# $## ###\n";
matrice_jeu [ 3] ="# ## ##\n";
matrice_jeu [ 4] ="#@ .# #\n";
matrice_jeu [ 5] ="### #\n";
matrice_jeu [ 6] =" # ######\n";
matrice_jeu [ 7] =" ####";
matrice [5] [1] = '@';
j'espere que c'est plus lisible comme ca.
Nu: qu'est-ce que tu veux dire par segment data?
Si j'ai bien compris, vous voulez dire qu'au lieu de matrice [ i] = "...";
je devrais ecrire strcpy(matrice [ i], "...");
un tableau de chaînes, c'est un tableau de tableaux de caractères, autrement dit une matrice de caractères... (enfin, sauf que les longueurs de chaque chaîne ne sont pas forcément les mêmes)
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
aze Le 29/11/2005 à 21:18 c'est exactement ce qu'elle a fait : un tableau de chaine$
liza> voila c'est ce que hibou a répondu mais en fait je posais la question à ceux qui connaissent bien l'architecture des programmes etc
Boaf... ca peut etre vu comme cela... de tte facon, ces considération ne sont pas interessantes pour le sujet
liza Le 30/11/2005 à 18:04 hello tout le monde!!!
Merci beaucoup pour vos réponses. Je l''ai fait avec strcpy et ça marche maintenant.
Pour ce qui est de savoir si c'est vraiment une matrice ou un tableau de chaines de caracteres tu as raison the_chojin, c'est plutôt ce que je voulais faire (le tableau de chaines) mais comme je l'ai appelée matrice dans mon code j'ai fini par ne plus vraiment faire la différence.
Maintenant, le problème que j'ai c'est encore un segmentation fault mais au moment de la désallocation. En fait je la fait comme ça:
for( i = 0; i < nb_lignes; i++)
{
free(matrice_jeu [ i]);
}
free(matrice_jeu);
Je ne vois pas où est le problème.
Et il y a autre chose. Si j'écris la matrice dans un fichier texte et que je la récupère ligne par lignes en faisant
fgets(matrice [ i],nb_colonnes+2 ,fich); (fich est mon pointeur sur le fichier et le nb_colonnes (nombre de colonnes) est correctement récupéré)
j'ai un segmentation fault au niveau des malloc. Et là je ne comprends rien du tout.
Ça fait beaucoup de questions à la fois, je sais, mais c'est mas première année d'informatique et je suis loin de tout maîtriser (vous avez du vous en rendre compte lol).
liza
oui, le code pour libérer est correct (enfin, sous réserve que l'allocation soit correcte et que les pointeurs n'aient pas été modifiés entre-temps), donc si ça plante c'est peut-être que tu as corrompu la mémoire avant... le problème avec les corruptions de mémoire c'est qu'il faut regarder tout le code pour savoir ce qui fait foirer : par exemple, dans un premier temps tu peux désactiver tout ce qu'il y a entre malloc() et free() pour vérifier que ça marche effectivement, puis réactiver progressivement une partie du code jusqu'à ce que ça re-plante ^^
pour fgets, d'où vient le +2 ? combien d'octets as-tu alloué à matrice[i] ?
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
depuis le début, elle bosse avec ca, y'a certainement une raison !
Link Le 30/11/2005 à 21:21 Il y a une petite erreur: Tu alloues de la place pour 27 lignes, mais tu en remplis 28 (de 0 à 27)

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
liza Le 02/12/2005 à 20:40 je viens de regler le probleme de la desallocation.
the_chojin et Link: vous aviez raison c'etait juste un probleme de nombre de lignes.
maintenant je me colle a mon probleme de fichier.
Pollux: oufff!!!! je n'ai pas ete obligee de "reprendre" tout mon code (mais si ca se trouve je devoir le faire a cause du fichier. arggg!!!).
nEUrOO: en effet il y a une raison. ca fait partie d'un projet que j'ai a faire, un espece de sokoban en mode manuel et automatique et le prof test nos codes avec des matrices contenues dans des fichiers.
merci encore pour votre aide a tous.
liza> Par contre la fonction strcpy est à proscrire. Oublie définitivement son existence et utilise strncpy à la place.
Pollux> exact, mais un tableau de pointeurs sur tableaux n'est pas le type de structure de données approprié du coup.
Link Le 06/12/2005 à 19:06 Tu as la même chose avec les nouvelles fonctions C-Run-Time de Visual Studio 2005, ou encore avec les fonctions de strsafe.h... (Comme StringCchCopy/StringCbCopy, StringCchCat, et surtout StringCchPrintfEx!)

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Link Le 08/12/2005 à 11:45 En plus plus se snprintf :
1) Elle assure que le buffer sera terminé par un caractère nul (c'est pas le cas de snprintf, du moins chez eux :/ )
2) Elle retourne l'adresse de la suite du buffer et la taille restante, parfait pour utiliser plusieurs de ces fonctions à la suite.
De plus, la version Cb permet de passer un sizeof au lieu d'un nombre de caractères, utile quand on programme en TCHAR ou en UNICODE.

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.