1

AddOn: Disclaimer:
déolé si ça parait indigeste mais comme je vois pas du tout d'où vient le problème, j'ai inclu une bonne partie de code.


J'ai des fread qui se mettent à planter au bout de plusieurs appels alors que le flux entrain d'être lu est valide. Je m'expliqe:
avant j'avais: (et ça marchait nickel)
.... beaucoup de code
int load_units(FILE *fp){
	int i;
	
	fread(&ul,sizeof(int),1,fp);
	
	up = (unit *)malloc_throw(ul * sizeof(unit));
	
	fread(up,sizeof(unit),ul,fp);
	
	for(i=0;i<ul;i++){
		up[i].sprite_light = (unsigned short *)malloc_throw(16 * sizeof(unsigned short));
		up[i].sprite_dark = (unsigned short *)malloc_throw(16 * sizeof(unsigned short));
		up[i].sprite_mask = (unsigned short *)malloc_throw(16 * sizeof(unsigned short));
		fread(up[i].sprite_light,sizeof(unsigned short),16,fp);
		fread(up[i].sprite_dark,sizeof(unsigned short),16,fp);
		fread(up[i].sprite_mask,sizeof(unsigned short),16,fp);
		
		up[i].name = (char *)malloc_throw(30 * sizeof(char));
		if(up[i].name_length){
			fread(up[i].name,sizeof(char),up[i].name_length,fp);
		}
	}
	
	return 1;
}
beaucoup de code


maintenant j'ai (et ça marche plus)

...

void malloc_masked_sprite(unsigned short *l, unsigned short *d, unsigned short *m){
	if((l = (unsigned short *)malloc_throw(16 * sizeof(unsigned short)))==NULL)
		printf("malloc l masked_sprite error");
	if((d = (unsigned short *)malloc_throw(16 * sizeof(unsigned short)))==NULL)
		printf("malloc d masked_sprite error");
	if((m = (unsigned short *)malloc_throw(16 * sizeof(unsigned short)))==NULL)
		printf("malloc m masked_sprite error");
}

...

void fread_masked_sprite(unsigned short *l, unsigned short *d, unsigned short *m, FILE *fp){
	unsigned short i;
	if((i=fread(l, sizeof(unsigned short), 16, fp))<16)
		printf("\nfread (l) masked_sprite error %d<16",i);
	if((i=fread(d, sizeof(unsigned short), 16, fp))<16)
		printf("\nfread (d) masked_sprite error %d<16",i);
	if((i=fread(m, sizeof(unsigned short), 16, fp))<16)
		printf("\nfread (m) masked_sprite error %d<16",i);
}

...

int load_units(FILE *fp){
	int i;
	
	fread(&ul,sizeof(int),1,fp);
	
	printf("\n<ul: %d>",ul);
	
	up = (unit *)malloc_throw(ul * sizeof(unit));
	
	fread(up,sizeof(unit),ul,fp);
	
	for(i=0;i<ul;i++){
		malloc_masked_sprite(up[i].sprite_light, up[i].sprite_dark, up[i].sprite_mask);
		fread_masked_sprite(up[i].sprite_light, up[i].sprite_dark, up[i].sprite_mask, fp);
		
		up[i].name = (char *)malloc_throw(30 * sizeof(char));
		if(up[i].name_length){
			fread(up[i].name,sizeof(char),up[i].name_length,fp);
		}
		printf("\n{%d : %s(%d)}",i,up[i].name,up[i].name_length);ngetchx();
	}
	
	return 1;
}

...


Si on regarde bien, ce code est exactement supposé faire la même chose que le précédent mais au bout de 9 ou 10 appels à la fonction fread_masked_sprite() les fread commencent à foirer. (y'en a un qui return 5 et tous les suiuvants retournent 0)

Pourtant, le fichier auquel je tente d'accéder est le même qu'avec l'ancien code.
J'ai passé 2 heures à essayer de comprendre ce qui n'allait pas mais ça n'a rien donnée.
Si vous avez une idée elle est bienvenue smile

--
dionoea

2

erreur trouvé (grace à l'aide du forum tigcc je l'admets). C'était une erreur de passage d'args dans la fonction. Il fallait utiliser des ** et pas des *.