Probleme de malloc sur un tableau de pointeur. - C - Programmation
Marsh Posté le 23-01-2008 à 20:03:46
1) Oui il te faut un char** code, puis tu alloues code pour N pointeurs, puis code[i] comme tu as fait.
2) Je ne sais pas si ça se suit dans la mémoire. Mais, si j'ai bien compris, tu veux savoir si tu peux redimentionner code[i] après coup? Si oui pas de problèmes. Mais il faudrait avoir plus de précisions.
Marsh Posté le 23-01-2008 à 20:05:19
char** code = malloc( n*sizeof(char*));
et ensuite ton code d'allocation des code[i]
Marsh Posté le 23-01-2008 à 20:07:12
Il n'y a aucune raison que les 4 zones allouées se suivent
edit: avec
code[0]=(char*)malloc(6*sizeof(char));
code[1]=(char*)malloc(6*sizeof(char));
code[2]=(char*)malloc(6*sizeof(char));
code[3]=(char*)malloc(6*sizeof(char));
Marsh Posté le 23-01-2008 à 20:09:33
D'ailleurs le cast (char*) est inutile et même à ne pas utiliser ça pourrait juste servir à cacher une erreur.
Edit: et puis le gets est aussi à proscrire. fgets est pas mal.
Edit2: et aussi penser à vérifier les retours de malloc
Marsh Posté le 23-01-2008 à 20:14:58
Code :
|
Code :
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRGLL !
Ne jamais, jamais, JAMAIS utiliser la fonction gets().
Elle est dépréciée depuis, pfiou, plein d'années, et ce pour une excellente raison : il n'y a aucun contrôle de taille, donc tu n'as aucun moyen de vérifier qu'il n'y a pas de dépassement de capacité : stockage de données dans un espace trop petit => débordement mémoire => comportement indéfini (i.e. des fois ça marche, des fois ça semble marchouiller et ça fait n'importe quoi, ou alors ça plante dans d'atroces souffrances).
Code :
|
Yup.
Code :
|
Ça ne se code pas au hasard en effet.
Essaie de zieuter les informations sur cette page :
http://mapage.noos.fr/emdel/notes.htm#pointeurs
Code :
|
Je ne comprends pas bien ce que tu souhaites faire.
Si c'est allouer n chaînes de taille fixe dans un seul et unique buffer, il te suffit de définir un char* dont la taille vaut n fois la taille d'une chaîne. Mais il va te falloir gérer ça correctement ce qui, puisque tu débutes, me semble prématuré pour le moment, surtout que je ne vois pas bien le gain que cela peut t'apporter ici.
Alloue donc un char** correctement pour commencer.
Marsh Posté le 23-01-2008 à 20:23:04
GENIAL ce forum !! Des énormes merci !
je mets en application tout ça, et je vous montre la fonction que je dois réaliser en fait...
a dans quelques dizaines de minutes ^^
Marsh Posté le 23-01-2008 à 21:29:48
Alors, si j'ai compris et bien lu ce que vous m'avez dis;
void generateur(int version, int taille,int nbpartie, char **code)
{
int i;
**code=malloc((nbpartie)*sizeof(char));
if(**code==NULL)
{
printf("Impossible d'allouer la memoire !!!" );
}
for(i=0;i++;i<(nbpartie))
{
*(code+i)=malloc((taille+1)*sizeof(char));
if(*(code+i)==NULL)
{
printf("Impossible d'allouer la mÈmoire !!!" );
}
(*(code+i))[taille+1]='\o'
}
}
La, theoriquement, je dois avoir tout ce qu'il faut pour commencer a le remplir.
Sachant que c'est un fonction qui doit générer "NBPARTIE" codes de "TAILLE" caracteres. ( 1 à 8 caractères possibles)
Ensuite, une fois que j'aurais ce satané tableau: je le remplirai en fonction de la version ( 1 ou 2) , qui determinera si tout les caracteres seront differents ou si c'est sans importance.
En fait, c'est le debut d'un master mind... le gros reste a faire ^^
Merci.
ps: comment je mets mes parties de code dans un cadre du forum comme vous ?
Marsh Posté le 23-01-2008 à 22:40:22
pour mettre dans un cadre le code en couleur met le entre les balises [\code=cpp] et [/\code] (sans \)
Code :
|
Une fois que t'as alloué ton tableau de char* donc un char** et chacune des cases de ce tableau, tu peux écrire ce que tu veux dedans
Marsh Posté le 23-01-2008 à 23:00:39
Encore une fois, merci beaucoup ça m'a été de grande utilité, je vais pouvoir continuer le reste... super!
Marsh Posté le 24-01-2008 à 16:50:25
jeunestomac a écrit : Encore une fois, merci beaucoup ça m'a été de grande utilité, je vais pouvoir continuer le reste... super! |
Et apprends à utiliser les balises de code. C'est expliqué dans les règles du forum...
Marsh Posté le 24-01-2008 à 17:29:31
D'ailleurs je viens de découvrir que on peut utiliser des balises [ code = nom_du_langage] [ / code] à la place [ code ] [ / code ] tout court. C'est pas marqué ça dans les régles. Le fait qu'on puisse faire disparaître les numéros de lignes par double clic est également à découvrir tout seul
Marsh Posté le 24-01-2008 à 23:13:50
ngkreator a écrit : D'ailleurs je viens de découvrir que on peut utiliser des balises [ code = nom_du_langage] [ / code] à la place [ code ] [ / code ] tout court. C'est pas marqué ça dans les régles. Le fait qu'on puisse faire disparaître les numéros de lignes par double clic est également à découvrir tout seul |
Wahou! et moi qui m'emmerde toujours à les virer à la main merci
Marsh Posté le 25-01-2008 à 06:45:28
ptitchep a écrit : |
Euh, la technique ancestrale consistait à 'répondre' et à copier/coller à partir de la réponse...
Mais le coup du double-click, oui, je l'avais oublié. C'est vrai que c'est pratique...
Marsh Posté le 23-01-2008 à 19:48:37
Bonsoir a tous !!
Alors, malgré des recherches poussées, je n'ai toujours pas compris comment faire un chose comme ce ci;
c'est un exemple pour me faire comprendre.
char *code[4];
int i;
code[0]=(char*)malloc(6*sizeof(char));
code[1]=(char*)malloc(6*sizeof(char));
code[2]=(char*)malloc(6*sizeof(char));
code[3]=(char*)malloc(6*sizeof(char));
for(i=0;i<4;i++)
{
gets(code[i]);
}
for(i=0;i<4;i++)
{
puts(code[i]);
}
Il s'agit donc d'un tableau de 4 pointeurs pointant vers des chaînes de 5 caractères ( si j'ai compris jusque la ^^)
J'ai deux questions;
1) Je voudrais savoir comment allouer dynamiquement le nombre de pointeur dans ce tableau car il devra varier dans mon programme, genre;
char **code
avec ensuite un malloc, mais alors je ne comprends pas comment, un INT, un CHAR ?, j'ai essayé plusieurs possibilités... rien n'y fait !
2)
Est ce que ceci
code[0]=(char*)malloc(6*sizeof(char));
code[1]=(char*)malloc(6*sizeof(char));
code[2]=(char*)malloc(6*sizeof(char));
code[3]=(char*)malloc(6*sizeof(char));
se suit dans la memoire de l'ordi, car je souhaiterai faire
code[0]=(char*)malloc(4*6*sizeof(char));
J'espere avoir ete clair...
j'ai absolument besoin d'aide la dessus, je remercie deja celui qui saura faire la lumiere... car faut absolument que je comprenne pour un projet...
Tchuss