1

bonjour je voulais avoir un conseil par rapport à une routine pour augmenter la taille d'un fichier text, voici mon code:

void resize_file(void)
{
FILE *f;
HANDLE handle;
unsigned temp;

HSym hsym = FindSymInFolder (SYMSTR (name), SYMSTR ("mlc"));

f=fopen(name,"rt");
handle=HeapPtrToHandle(f);
temp=f->alloc;
fclose(f);

if (!(handle=HeapRealloc(handle,temp+4)))
{
exit(0);
}

SYM_ENTRY *SymPtr = (DerefSym (hsym));
SymPtr->handle = handle;


}

le problème c'est que je part d'un fichier texte mais le fichier produit n'est plusau format text mais expression. alors je n'arrive pas à le réutiliser.
donc est-ce que ce n'es tpas la bonne routine ou faut 'il rajouter qq chose pour pouvoir avoir acces à nouveau au fichier texte??

2

Pour le fait que le fichier produit devienne EXPR: tu ne sembles pas déplacer le tag (TEXT_TAG) qui signale la fin du texte.
Par ailleurs:
* tu ne sembles pas avoir changé les deux premiers octets du fichier, qui indiquent aux applications la taille des éléments de la VAT;
* tu n'as pas du tout besoin du bloc fopen / HeapPtrToHandle / fclose wink
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3

alors déjà un grand merci d'avoir répondu aussi vite! chinois
j'ai pu réglé la taille voici le code :

void resize_file(void)
{
FILE *f;
HANDLE handle;
unsigned temp;

HSym hsym = FindSymInFolder (SYMSTR (name), SYMSTR ("mlc"));

f=fopen(name,"rt");
handle=HeapPtrToHandle(f);
temp=f->alloc;
fclose(f);

if (!(handle=HeapRealloc(handle,temp+4)))
{
exit(0);
}

SYM_ENTRY *SymPtr = (DerefSym (hsym));
SymPtr->handle = handle;
MULTI_EXPR *VarPtr = HeapDeref (SymPtr->handle = handle);
VarPtr->size=temp+4;

}

Par contre pour le déplacement de TEXT_TAG j'obtiens un crash de l'émulateur lorsque je fais:
VarPtr->Expr[temp+3]=TEXT_TAG;
la caltos rame puis plante! mur
il faut surement le faire d'une autre manière, ou peut etre qu'il y a une étape qui manque...

enfin
* tu n'as pas du tout besoin du bloc fopen / HeapPtrToHandle / fclose

je faisais ça pour obtenir le handle du fichier name ainsi que sa taille, mais apparemment il y a beaucoup plus simple, cependant je n'ai pas réussi à trouver comment...

ps:désolé si ce sont des question bêtes, mais je suis une gros noob pam et j'ai envie d'apprendre comment faire.

4

J'ai plus le code exact en tête, mais je sais qu'il y a des tutorials, en français et en anglais wink
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

5

et où est ce que je peux trouver ces tutoriels?

6

Salut.
Pour commencer tu n'as pas pas besoin de fopen, fclose, ....
1- pour rechercher la variable
    SYM_ENTRY *sym = SymFindPtr(SYMSTR(varname_included_folder),0);
2- pour recuperrer le HANDLE
    HANDLE handle = sym->handle;
3- pour pointer au debut
    char *begin = HeapDeref(handle);
4- pour lire la taille
    unsigned short size = *(unsigned short *)begin + BYTE_VARSIZE; // BYTE_VARSIZE = 2 ( nbr de byte oqp par la taille d'un fichier )
5- pointer a la fin du fichier
    char *end = begin+size-1;
    Un fichier TEXT fini par les caracteres { 0, 224 }


Ce que tu dois faire pour augmenter la Taille d'un fichier c'est :
1- Calculer la nouvelle taille du fichier
    unsigned short newsize = size + nbr_byte_a_ajouter_au_fichier;
2- Reallouer le Handle a la nouvelle taille
    handle = HeapRealloc( sym->handle , newsize );
3- Actulisation du handle et pointeur sur debut de la Variable
    sym->handle = handle;
    begin = HeapDeref( handle );
4- Ecriture de la nouvelle Taiille du Fichier
    *(unsigned short *)begin= (unsigned short)( newsize - BYTE_VARSIZE );// les 2 bytes oqp par la taille ne sont pas pris en compte par le TIOS
6- Pointer a la fin du fichier realloué
    end = begin + newsize - 1;
6- Ecriture des 2 bytes { 0, 224 } a la fin du fichier TEXT
    *(end - 1 )= 0;
    *end = 224;

[EDIT] : J'ai corrigé l'erreur suivante dans la 2ème partie du code :
newsize au lieu de size

voila c'est tout je crois smile

7

ok je vais testé ça! merci beaucoup pour vos réponses rapides et claires!!!!

8

merci pour la correction! wink
je l'avais vu et corrigée... cependant (aie aie aie) je n'y arrive toujours pas wuand je tente de réaliser l'augmentation de taille l'emulateur crash et indique une erreur au niveau de la memoire... mais je ne sais pas à quel niveau j'ai loupé: j'ai rententé plusieurs fois sans parvenir au résultat escompté.
d'ailleur (je ne sais pas si ça à voir) mais la taille trouvée par unsigned short size = *(unsigned short *)begin + BYTE_VARSIZE; // BYTE_VARSIZE = 2 ( nbr de byte oqp par la taille d'un fichier ) donne une taille différente de celle indiquée dans le menu var-link: par exemple le fichier test fait 13 octet, et l'algorytme indique que le fichier fait 49octet confus est ce que c'est normal?

9

Ca devrait être "unsigned short size = *(unsigned short *)begin", non ?

Si tu as des fichiers de taille impaire, attention à ne pas lire des mots de 16 bits ou des longs de 32 bits à des adresses impaires: le processeur ne sait pas faire, et ça donne "Address Error". Peut-être est-ce le plantage que tu vois.
Ici, tu n'as pas de chances d'être banni parce que tu ne comprends pas ça... mais sur d'autres forums, ça arrive.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

10

Lionel Debroux ->

Merci pour la correction.

samy ->

Tu veux bien poster ton code à l'aide du lien Sources juste en dessous des Smileys

11

bon finalement j'ai réussi et je vous doit une fiere chandelle. alors encore un grand merci à tout les deux!!!! smile
Lionel Debroux (./9) :
Ici, tu n'as pas de chances d'être banni parce que tu ne comprends pas ça... mais sur d'autres forums, ça arrive.

oua en gros ce sont des forum pour les professionnels et les gros débutant n'y ont pas leur place! j'ai eu de la chance de tomber sur yaronet boing
andoh_wilfried (./10) :
Tu veux bien poster ton code à l'aide du lien Sources juste en dessous des Smileys

bon comme tu peux t'en douter l'erreur ne venait pas de ton code mais de moi: j'avais deux pointeur (pour le nom du fichier que tu appeles varname_included_folder) l'un était "temp" et l'autre "tmp" et j'ai biensur interverti les deux! mur et meme en faisant mes revifications je n'ai pas trouver l'erreur du premier coup!!! Donc je suis désolé: veuillez accepté mes plus plattes excuses chinois

12