alexis Le 20/05/2002 à 21:57Edité par Boo le 20/05/2002 à 22:01 Vu que je suis en train de porter mon projet de compression sur ti, j'en suis venu a une question:
J'ai decidé d'ajouter les headers a la fin des fichiers compressés, a la manière du format zip, mais si je veux les lire, est-ce que je dois mettre un offset en debut de fichier pour sauter, au bon endroit pour obtenir les infos, ou bien je peux le fier aux indication de heapsize, pour sauter au bon endroit, c'est a dire a la fin du fichier, j'ai lu dans la doc, que heapsize, ne renvoie pas toujours la bonne taille de fichier, que heapcompress peut influer dans de rares cas sur le resultat...
Il y a t'il un moyen de se passer de ca, c'est a dire une autre fonction qui realise qqch, d'equivalent, ou que peut-on faire d'autre, pour obtenir a coup sur le bon nombre d'octets pour sauter a la fin du fichier.
En asm, j'utilisais toujours la taille fournie par l'handle, mais je ne sais pas a quelle fonction elle correspond, et vu ce qui est marqué dans la doc, si finalement c'est sur de donner la bonne taille...
Merci a ceux qui auront compris mon dilème et qui prendront le temps de repondre...
Je pense que le plus simple c'est quand même debut_prog + *(unsigned short*)HeapDeref(handle) + 1, ca te fait pointer sur le dernier octet du fichier.
>adr += *((short *) adr) + 1
N'oublie pas le unsigned! Sinon, ça ne marchera pas pour les fichiers de plus de 32 KO!
alexis Le 22/05/2002 à 20:45Edité par Boo le 22/05/2002 à 20:46
J'ai implémenté ca pour le mode binaire, ca devrait etre bon non?
short fresize(FILE *f1, int size) {
unsigned long fpos = (unsigned long)f1->fpos - (unsigned long)f1->base;
if(!f1) return EOF;
HeapUnlock(f1->handle);
if ((f1->alloc -= size) < 8 ) f1->alloc = 8;
HeapRealloc(f1->handle, f1->alloc);
f1->base = HLock(f1->handle);
f1->fpos = f1->base + fpos;
if (fpos >= f1->alloc) {
f1->fpos = f1->base + f1->alloc;
f1->flags|=_F_EOF;
}
f1->unget = EOF;
return 0;
}
Je crois que la ligne 12 sert a rien... faut que je l'enleve, vaut mieux que ca renvoit une erreur
Kevin Kofler Le 23/05/2002 à 00:50Edité par Kevin Kofler le 23/05/2002 à 00:54 Il y a eu des modifications dans les routines de fichiers depuis TIGCC 0.93, mais ça ne devrait pas affecter ta routine normalement.
Et ça serait bien si tu la contribuais à TIGCCLIB:
1. Teste-la bien!
2. Envoie-la à Sebastian Reichelt en lui disant que je suis d'accord. Mais il faut quand-même qu'un de nous deux (Sebastian ou moi) vérifie ces routines en détail avant de les mettre dans TIGCCLIB.
Mais ces noms de fonctions viennent d'où? De toi? Ou suivent-ils un standard particulier? Parce qu'il faudrait essayer de suivre un standard pour les noms s'il en existe un. Mais s'il n'y a pas de standard à suivre pour ces fonctions-là (et c'est ce qu'il me semble - c'est quand-même bizarre...), n'hésite pas à les contribuer avec les noms que tu viens de leur donner.
Bon, ces routines m'ont l'air OK, à part pour une chose:
22: if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {
48: if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {
Cette comparaison (présente une fois dans chacune de tes 2 routines) n'est-elle pas à l'envers?
Et évidemment, il faut aussi tester les routines en pratique.
Autre chose: ne serait-il pas une bonne idée de rajouter une fonction simple pour lire la taille d'un fichier rapidement? Une macro devrait suffir, de style:
#define fgetsize(__f1__) (peek_w((__f1__)->base))
Boudiou' mais elles servent à quoi ces fonctions ????????????

Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 :
www.ti-fr.com.
Quelques idées personnelles
ici.