1

pourquoi le code ci-dessous bug-t-il de manière aléatoire?
char*** test(char ***tabl)
{
short i,j;
tabl = calloc (3,sizeof(**tabl)); 
for(i=0;i<3;i++) 
{ 
tabl[i]=calloc(4,sizeof(*tabl)); 
for(j=0;j<4;j++)tabl[i][j]=calloc(5,sizeof(char)); 
} 
strcpy(tabl[0][0],"aa");
return tabl;	
}
void _main(void)
{
char ***tabl=NULL;
tabl=test(tabl);
clrscr();
printf(tabl[0][0]);
 ngetchx();
free(tabl);
}

j'ai beau chercher, je ne trouve vraiment aucune erreur...
euh...

2

-- oups, pas vu le "return tabl" --

et il faudrait inverser **tabl et *tabl, même si en fait ça ne change rien ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

3

Ton bogue est que tu ne libères qu'un de tes nombreux blocs de mémoire, et qu'à force de leaker autant de blocs, tu atteins le maximum de handles.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

euh, 1+3*(1+4), c'est négligeable devant 2000 embarrassed

sinon ça a l'air correct... ça plante après bcp d'essais successifs ? et à quel moment ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

ah dsl en fait j'avais pas vu que j'avais une ligne de commande tout en bas de mon _main qui refaisait free(tabl) grin

mais maintenant la je plante et je ne comprend vraiment pas pourquoi.... j'ai vraiment j'ai trouvé l'endroit où ca plante et c'est vraiment etrange...
#include <tigcclib.h>
short taille[3];
void creation(void)
{
taille[0]=3;taille[1]=5;taille[2]=4;
char matr[3][5][4]={{"0","1","2","3","4"},{"00","01","02","03","04"},{"000","001","002","003","004"}};
FILE *f = fopen ("matrice", "wb"); 
if(f==NULL) {ST_helpMsg ("erreur");ngetchx();return;} 
fwrite(taille,sizeof(short),3,f);  
fwrite(matr, 4*sizeof(char), 15, f);
fputc (0, f); 
fputs ("data", f); 
fputc (0, f); 
fputc (OTH_TAG, f); 
fclose (f);	
}
char*** test(char ***matr)
{
short i,j;
FILE *f = fopen ("matrice", "rb"); 
if(f==NULL) {ST_helpMsg ("matrice introuvables");ngetchx();} 
fread(taille,sizeof(short),3,f);                                   
matr = calloc (taille[0],sizeof(**matr)); 
for(i=0;i<taille[0];i++) 
{ 
matr[i]=calloc(taille[1],sizeof(*matr)); 
for(j=0;j<taille[1];j++)matr[i][j]=calloc(taille[2],sizeof(char)); 
}
fread(matr, taille[2]*sizeof(char), taille[0]*taille[1], f);      
ngetchx();
fclose(f);// c'est ici que ce produit l'erreur : "adress error" ... c'est assez bizzare non?
clrscr();
printf(matr[0][0]);
ngetchx();
return matr;	
}
void _main(void)
{
creation();
char ***matr=NULL;
matr=test(matr);
clrscr();
printf(matr[0][0]);
ngetchx();
free(matr);
}

g aussi esayé ca mais ca marche pas non plus , ca me depasse la ...
char*** test(char ***matr)
{
short i,j;
FILE *f = fopen ("matrice", "rb"); 
if(f==NULL) {ST_helpMsg ("matrice introuvables");ngetchx();} 
fread(taille,sizeof(short),3,f);                                   
fclose (f);
matr = calloc (taille[0],sizeof(**matr)); 
for(i=0;i<taille[0];i++) 
{ 
matr[i]=calloc(taille[1],sizeof(*matr)); 
for(j=0;j<taille[1];j++)matr[i][j]=calloc(taille[2],sizeof(char)); 
}
FILE *f2=fopen("matrice", "rb"); 
fread(matr, taille[2]*sizeof(char), taille[0]*taille[1], f2);      
ngetchx();
fclose(f2);// tjours : "adress error" ... c'est bizzare ...
clrscr();
printf(matr[0][0]);
ngetchx();
return matr;	
}
euh...

6

erf...........

fread lit dans *un* tableau des éléments *consécutifs*, il va pas faire des indirections en fonction du type de ce que tu vas lire...

* soit tu fais une boucle avec plein de petits fread()
* soit tu crées un gros tableau (c'est ce qu'il y a de mieux : bien plus rapide) avec un seul calloc()

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

7

oups je viens de comprendre que ma deuxieme solution est fausse, vu que je commence par lire ma matrice et pas mon tableau de taille.. dsl
mais je pige pas vraiment ce que tu me dis pollux
dans mon premier cas ca doit marcher..
euh...

8

le premier cas de ./5 foire, parce que tu fais :

fread(matr,c*sizeof(char),a*b,f);

ce qui est équivalent à

fread(matr,a*b*c*sizeof(char),1,f)

et pas à

for (int i=0;i<a;i++)
  for (int j=0;j<b;j++)
    fread(matr[i][j],c*sizeof(char),1,f);

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

merci pollux
ca marche bien maintenant top
euh...

10

ca marche même pour l'écriture !
euh...

11

moué ca marche mais c'est vrai que c'est relativement lent ...
>>pollux, que voulez tu dire par :
* soit tu crées un gros tableau (c'est ce qu'il y a de mieux : bien plus rapide) avec un seul calloc()

c'est pas ce que j'ai fait ?
euh...

12

a ok, tu veux dire comme ca ;
char *tabl=calloc(nbcolonnes*nblignes*nbcaracteres,sizeof(char));
mais le probleme c'est que je sais pas acceder aux données d'un tel tableau : si je fais
*(tabl+(n°colonne+n°ligne)*nbdecaractere*sizeof(char)) ; (sachant que tabl[colonne][ligne][caractere] )
ca ne marche pas
euh...

13

tabl[(colonne*nblignes+ligne)*nbcaracteres+caractere] ...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

14

Plus simple:
char (*tabl)[nblignes][nbcaracteres]=calloc(nbcolonnes*nblignes*nbcaracteres,sizeof(char));
Ça permet d'y accéder comme à un tableau 3D classique.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

oui, c'est bien, sauf s'il veut après faire un truc plus fin (changer le nb de caractères de certaines chaînes...) En tout cas il ne faut pas perdre de vue qd on utilise un tableau 3D que ce n'est qu'un tableau 1D avec du sucre syntaxique, et que c'est fondamentalement différent d'un tableau de pointeurs vers un tableau de pointeurs...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)