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.

/* 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; }