geogeo :
Voici l'endroit où j'utilise cette méthode et ce avec des Listes de 15 items maximum.
//Efface un bonus
void DeleteBonus (unsigned char item)
{
//Interruption
INT_START_BONUS=FALSE;
//Coordonnées
memcpy ((void *)(BONUS_xpos+item),(void *)(BONUS_xpos+item+1),(nbrBonus-item-1)<<1);
memcpy ((void *)(BONUS_ypos+item),(void *)(BONUS_ypos+item+1),(nbrBonus-item-1)<<1);
//Compteur animation
memcpy ((void *)(BONUS_SHOWANIM+item),(void *)(BONUS_SHOWANIM+item+1),nbrBonus-item-1);
//Sprites
memcpy ((void *)(BONUS_TYPE+item),(void *)(BONUS_TYPE+item+1),nbrBonus-item-1);
memcpy ((void *)(BONUS_SPRITE_ANIM+item),(void *)(BONUS_SPRITE_ANIM+item+1),nbrBonus-item-1);
nbrBonus--;
INT_START_BONUS=TRUE;
}
Et c'est faux! Remplace
memcpy par
memmove!
Nan mais là ça va à coup sûr boguer. Sauf que ce sera bien entendu au moment où tu t'y attendras le moins, et tu ne comprendras pas pourquoi.
Que fais la fonction memcpy au juste, est-il possible de voir la source de cette fonction???
Elle copie en général toujours dans le même sens, donc elle a une chance sur 2 d'écraser avant d'avoir fini de copier (et encore, la chance sur 2 n'est pas garantie, elle peut aussi
toujours écraser les données si source et destination se chevauchent). Donc bogue garanti.
memmove fait attention de ne pas écraser avant d'avoir copié (en général en choisissant le bon sens pour copier).
Et
attention,
strcpy se comporte comme
memcpy! J'ai vu beaucoup trop de sources boguées qui utilisent
strcpy sur des sources et destinations qui se chevauchent.

Par exemple cette perle d'un certain Romain Liévin:
/*
Remove beginning & ending '"' from files.
The string is modified in place !
*/
char* tail_long_filename(char *file)
{
char *p = file;
if( (file[0] != '\"') && (file[strlen(file)] != '\"') )
return file;
strcpy(file, ++p); /* remove first quote */
p[strlen(p)-1] = '\0'; /* remove last quote */
return file;
}
Il y avait cette horreur dans le
tprbuilder de
TIGCC jusqu'à la version 1.0.7. La version 1.0.8 livrée avec toutes les versions actuelles de
TIGCC contient ma correction:
/*
Remove beginning & ending '"' from files.
The string is modified in place !
*/
char* tail_long_filename(char *file)
{
char *p = file;
if( (file[0] != '\"') && (file[strlen(file)] != '\"') )
return file;
p++;
memmove(file, p, strlen(p)+1); /* remove first quote */
p[strlen(p)-1] = '\0'; /* remove last quote */
return file;
}