Malloc d'un tableau double entree
Nico
-
ilimo Messages postés 32 Statut Membre -
ilimo Messages postés 32 Statut Membre -
J'ai un souci avec le prog ci dessou.En fait apres avoir mon malloc , j'essaie de stocker des valeurs , mais ca fait un segmentation fault , et je vois pas pk.Je doute de mon malloc , mais si il est faux , comment dois-je le faire ?
#include <fcntl.h>
#include <unistd.h>
typedef struct s_data
{
int nbline;
int nbchar;
int fd1;
int test2;
char **tab;
} t_data;
int my_get_line(char *file, t_data dat)
{
int line;
char *buff;
...
return (line);
}
int my_get_char(char *file, t_data dat)
{
int chars;
char *buff;
return (chars);
}
void stocktab(char *file, t_data dat)
{
char buff[1];
int x;
int y;
## ARRIVE LA CA SEGFAULTE ##
**dat.tab = 0;
#OU
dat.tab[0][0] = 0;
#######
}
int main(int ac, char **av)
{
t_data dat;
dat.fd1 = open(av[1], O_RDONLY);
dat.nbline = my_get_line(av[1], dat);
dat.nbchar = my_get_char(av[1], dat);
dat.tab = malloc((dat.nbline * dat.nbchar) * sizeof(**dat.tab));
stocktab(av[1], dat);
}
#include <fcntl.h>
#include <unistd.h>
typedef struct s_data
{
int nbline;
int nbchar;
int fd1;
int test2;
char **tab;
} t_data;
int my_get_line(char *file, t_data dat)
{
int line;
char *buff;
...
return (line);
}
int my_get_char(char *file, t_data dat)
{
int chars;
char *buff;
return (chars);
}
void stocktab(char *file, t_data dat)
{
char buff[1];
int x;
int y;
## ARRIVE LA CA SEGFAULTE ##
**dat.tab = 0;
#OU
dat.tab[0][0] = 0;
#######
}
int main(int ac, char **av)
{
t_data dat;
dat.fd1 = open(av[1], O_RDONLY);
dat.nbline = my_get_line(av[1], dat);
dat.nbchar = my_get_char(av[1], dat);
dat.tab = malloc((dat.nbline * dat.nbchar) * sizeof(**dat.tab));
stocktab(av[1], dat);
}
6 réponses
-
bonjour,
1- au lieu de :
dat.tab = malloc((dat.nbline * dat.nbchar) * sizeof(**dat.tab));
2- essaies :
dat.tab = (char**)malloc(dat.nbline * dat.nbchar * sizeof(*char));
3- dans ta fonction main :
a- le 2° argument est un double pointeur( char **av )
b- tandis que tu le passes en 1° argument pour les autres fonctions
c- mieux vaut respecter l'ordre des passages
d- en plus ce premier argument pour les autres fonctions, est un simple pointeur( char *file )
e- il faut passer des arguments du même type d'une fonction à une autre
4- Dans ta fonction " stocktab " il y une mise à zero :
::: **dat.tab = 0; : non pour les doubles étoiles
::: dat.tab[0][0] = 0; : non car ce n'est pas un tableau à 2 dimensions
5- essaies : dat.tab[0] = NULL;
::: c'est un tableau de pointeurs sur des pointeurs
6- en ce qui concerne " dat.fd1 = open(av[1], O_RDONLY); "
il me semble que " open " c'est pour ouvrir des fichiers..
tandis qu'ici on a un tableau " av[1] ".
je ne saisis pas exactement ce que tu veux faire..
donc je n'ai pas d'idée..
7- j'espère que ça aide.. -
très bien ..
la chose est simple :
1- ecrire un entier type " int " dans un fichier texte : "save.txt"
2- relire ce même entier dans un seconde temps pour s'en servir..
1-
a- pour ecrire : voici mon code :
void WriteToFile( int a = 1234)
{
FILE *ff;
ff = fopen("save.txt", "w");
char st[5];
itoa(a, st, 10);
fwrite (st , 1 , 4 , ff);
fclose(ff);
}
b- le probleme c'est que ça efface le contenu de tout mon fichier save, et je voudrais ajouter uniquement au début en effaçant la première ligne..
2-
a- pou lire : voici mon code :
void ReadFile(int b = 0)
{
FILE *fread;
fread = fopen("save.txt", "r");
char Txt[255];
fgets(Txt, 255, fread);
b = atoi(Txt);
fclose(fread);
}
une idée ?..
merci... -
désolé, je me suis trompé de section..
je sais pas pourquoi j'ai reçu une réponse sur ce message..
en pensant que ça concernait mon message, je ai répondu..
une erreur..
désolé encoe.. -
La ligne contenant le malloc effectivement me semble bizarre. Mais l'erreur principale de ce programme c'est que deux "*" devant une variable ne signifie pas tableau a deux dimension mais poiteur poitant sur un autre pointeur. Donc, il suffit d'une seul étoile. C'est probalement pour ca que ton programme plante a l'éxecution (et pas a la compilation). Après ca ne t'empêche pas d'assigner des valeurs sur deux dimensions dans ton pointeurs.
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
re salut !
Franchement au lieu d'essayer de débbugguer du code, dont on sait même pas ce a quoi il devait servir (et qui marche pas), dis nous plutot directement ce que tu voulais faire exactement ?
@++ -
Non mais c bon , merci de vos reponses.
EN fait pr moi comme la memoire est lineaire , malloquer un tableau de 4*5 ou autre , ca revenait tjrs a malloquer 20 cases , donc je me disais que malloc de 20 ca devait marcher.
Bref ca marche maintenant , merci