1573Fermer1575
GodzilLe 26/05/2010 à 19:36
des "unsigned char" serait a mon avis plus aproprié pour a et b que des int mais bon c'est tres perso.

Tester ferror une seule fois ? tu ferrais mieux de tester le retour de ta fonction write, ferror peux ne pas te donner une info fiable, et puis ça evite de faire 1500 tours de boucles alors que tu peux sortir de suite, et sans compter que le pbm sur UNE ecrite peux etre temporaire et que les suivantes fonctionnent correctement...


Je te conseille plutot, si tu veux pas te faire chier a tester tout les retours de faire un truc genre :
char readUint16_t (FILE* stream, uint16_t* target) { unsigned a, b; if ((fread (&a, 1, 1, stream) != 1) || (fread (&b, 1, 1, stream) != 1)) return 1; *target = ((a&0xFF) << 8) | (b & 0xFF); return 0; } void saveHighscore(...) { int err = 0; [...] for (i = 0; (i < numberEntries) && (err == 0); i++) { err = 0; err += (fread (&(cData[i].playerName), 1, 20, scoresFile) != 20)?1:0; err += readUint16_t (scoresFile, &(cData[i].score)); err += readUint16_t (scoresFile, &(cData[i].BV)); err += readUint16_t (scoresFile, &(cData[i].V)); err += readUint16_t (scoresFile, &(cData[i].TV)); err += readUint16_t (scoresFile, &(cData[i].lostATGuns)); err += readUint16_t (scoresFile, &(cData[i].lostAAGuns)); err += readUint16_t (scoresFile, &(cData[i].lostARTGuns)); err += readUint16_t (scoresFile, &(cData[i].lostTanks)); err += readUint16_t (scoresFile, &(cData[i].lostRecons)); err += readUint16_t (scoresFile, &(cData[i].lostInfanteries)); err += readUint16_t (scoresFile, &(cData[i].lostFighters)); err += readUint16_t (scoresFile, &(cData[i].lostBombers)); err += readUint16_t (scoresFile, &(cData[i].killedATGuns)); err += readUint16_t (scoresFile, &(cData[i].killedAAGuns)); err += readUint16_t (scoresFile, &(cData[i].killedARTGuns)); err += readUint16_t (scoresFile, &(cData[i].killedTanks)); err += readUint16_t (scoresFile, &(cData[i].killedRecons)); err += readUint16_t (scoresFile, &(cData[i].killedInfanteries)); err += readUint16_t (scoresFile, &(cData[i].killedFighters)); err += readUint16_t (scoresFile, &(cData[i].killedBombers)); } if (err > 0) /* Do whatever you want in case of one or more error, and here you know how much error you have */ }

J'ai inversé la valeur de retour de va fonction de lecture

Les "& 0xFF" peuvent paraitre superflu, mais evite bien des soucis dans certain cas "étrange". Prefere utiliser un ou logique ( | ) au + quand tu agence des octets entre eux, l'utilisation de | est plus logique que le "+", et si tu te plante du nombre de décallage (voir tu fais expres pour X ou Y raison) le + n'a pas le meme sens que le | (ie (3 << 1) | 3 n'a pas la meme valeur que (3<<1) + 3)