Malloc d'un tableau double entree

Fermé
Nico - 27 nov. 2003 à 19:33
ilimo Messages postés 32 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 2 juin 2006 - 28 nov. 2003 à 14:36
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);
}
A voir également:

6 réponses

ilimo Messages postés 32 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 2 juin 2006 4
28 nov. 2003 à 08:36
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..
2
ilimo Messages postés 32 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 2 juin 2006 4
28 nov. 2003 à 14:21
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...
1
ilimo Messages postés 32 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 2 juin 2006 4
28 nov. 2003 à 14:36
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..
1
CyberLudo2013
28 nov. 2003 à 00:42
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.
0

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 ?

@++
0
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
0