Malloc d'un tableau double entree

Nico -  
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);
}

6 réponses

  1. ilimo Messages postés 32 Statut Membre 4
     
    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
  2. ilimo Messages postés 32 Statut Membre 4
     
    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
  3. ilimo Messages postés 32 Statut Membre 4
     
    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
  4. CyberLudo2013
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ludo
     
    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
  7. Nico
     
    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