Allocation memoire : malloc ou pas malloc dans ce cas ci ...

Signaler
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Bonjour,

Je voudrais remplir un tableau avec le contenu d'un fichier texte avec le code ci-dessous :



#define MaxBoardSize 10

int main()
{
    char board[MaxBoardSize][MaxBoardSize];

    initboard(board[MaxBoardSize]);
}

void initboard(char *bd[MaxBoardSize])
{
     FILE *fp;
     char *fl = &boardfile
     char *CurLine=malloc(MaxBoardSize*(sizeof(int)));
     int i=0;

     fp=fopen(fl, "r");
     if(fp==NULL)
     {
         fprintf(stderr, "The board file does'nt exist\n");
         exit(EXIT_FAILURE);
     }
     while(fgets(CurLine,MaxBoardSize+1,fp)!=NULL)
     {
         strncpy(bd[i],CurLine,MaxBoardSize);
         i++;
     }
}

Je me demande si la definition du tableau qui est soulignée réserve la memoire ou bien je dois faire un malloc ? parce que quand j'execute ca plante avec un probleme de memoire : The system DLL kernel32.dll was relocated in memory. The application will not run properly ...

Merci d'avance

9 réponses

Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
nt main()
{
    char board[MaxBoardSize][MaxBoardSize];

    initboard((char*)board);
}

void initboard(char *bd)
{
    FILE * fp=fopen(&boardfile
, "rt");
   
    while(fgets(bd,MaxBoardSize,fp)!=NULL)
    {
        bd += MaxBoardSize;
    }
}

Essaye avec ça, mais cela dépend de ton fichier en entrée..

:D
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Et pardon, pas besoin du malloc.

:D
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Fermeture du fichier ???

ciao...
BruNews, MVP VC++
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009

initboard((char*)board);
}

void initboard(char *bd)
{
FILE * fp=fopen(&boardfile, "rt");

while(fgets(bd,MaxBoardSize,fp)!=NULL)
{
bd += MaxBoardSize;
}
}

C'est sur c'est plus court :)

Mais ca initboard((char*)board) :

- Pq tu mets (char *)board et pas char * board ?
- Qd on a un tableau a 2 dimensions, il faut passer au moins une des dimensions a la fonction non ? void initboard(void initboard(char *bd[MaxBoardSize]) ou void initboard(char *bd, int height, int width) par exemple ? non ?
- bd += MaxBoardSize; qd tu fais ca, t'es sur que chaque ligne du tableau est contigue en memoire ?

Merci
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009

excellente idee :)
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Ben justement, ca marche dans cet exemple car ton allocation est contigue ( equivalent a char board[MaxBoardSize * MaxBoardSize];

- Pq tu mets (char *)board et pas char * board ?
    (char *)board  -> cast char** en char*

- Qd on a un tableau a 2 dimensions, il faut passer au moins une des
dimensions a la fonction non ? void initboard(void initboard(char
*bd[MaxBoardSize]) ou void initboard(char *bd, int height, int width)
par exemple ? non ?
    Le problème n'est pas le nombre de dimension mais l'accès a tes données, si elles sont contigues, il suffit de connaitre l'adresse du premier element. Si pas contigu, tu ne peut pas faire
    bd += MaxBoardSize; mais bd[i++] (en gros...)

:D
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009

Ouchhhh ca plante sans aucun resultat, j'ai 2 warnings :

warning: passing arg 1 of `fopen' from incompatible pointer
warning: passing arg 1 of `fclose' from incompatible pointer type

#define boardfile "board.txt"

int main()
{
char board[MaxBoardSize][MaxBoardSize];

initboard((char*)board);
return 0;
}

void initboard(char *bd)
{
FILE *fp=fopen(&boardfile, "rt");

if(fp==NULL)
{
fprintf(stderr, "The board file does'nt exist\n");
exit(EXIT_FAILURE);
}
while(fgets(bd,MaxBoardSize,fp)!=NULL)
{
bd += MaxBoardSize;
}
fclose(&boardfile);
}

Le contenu de board.txt :

0000000000
0000000000
0000000000
0000000000
0099009900
0099009900
0000000000
0000000000
0000000000
0000000000
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Evidement :
#define boardfile "board.txt" -> boardfile n'est pas une variable donc pas d'adresse

fopen(boardfile, "rt");
fclose(boardfile);

:D
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009

effectivement plus de warning ... ni d'erreur mais ca marche pô ... enfin ca plante windows ...