1

Bon encore une question de plus concernant l'utilisation des fichiers... Désolé ! grin

J'ai crée un fichier avec l'exemple donné dans la FAQ de TIGCC il est de type STR (0x2D) comment je peux changer ce type ? ( et mettre ce que je veux ) Et est ce que ça va modifier la structure du fichier ?

Dans un ancien topic du forum j'ai lu que Kevin lisait les fichiers avec des fonctions de
vat.h, quelqu'un (Kevin si t'es là wink ...) peut m'en dire plus ? J'ai bien regardé l'aide ( que je commence à comprendre peu à peu ) mais je ne vois pas comment on peut faire ! J'aimerai bien avoir un exemple de prog parce que c'est comme ca que je pige le mieux... (enfin que j'esssaie tongue )

2

Il faut changer les octets à la fin du fichier. Une chaîne de caractères est définie par le fait que le dernier octet de la variable est un STR_TAG. Il faut mettre un autre tag à la place.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Quel type veux-tu faire ?

4

De préférence un type qui ne soit pas accessible depuis le VAR-LINK, donc un type perso... Par exemple PRT !

5

Encore une chose, concernant la lecture du fichier avec vat.h, quelqu'un en sait plus ?

6

Alors vas voir ici.

7

Merci <ZdRUbAl> mais j'avais préçisé que j'aimerai bien éviter les fonctions de stdio.h qui prennent bcp de place dans les progs... Désolé d'être si exigeant smile

8

J'avais posté avant smile
Je devrais faire comme Kevin, relire mes posts ...
Et pour l'exemple, étant donné que je ne maitrise pas trop les fonctions de vat.h, mieux vaut attendre Kevin, qui les connait bien, lui oui.
[edit]Edité par ZdRUbAl le 18-02-2002 à 15:15:43[/edit]

9

[nosmile]Pour les fonctions de vat.h, tout dépend de ce que tu veux mettre dans le fichier. Il y a tellement de manières de les utiliser. Par exemple celle-ci (c'est du GCC 3, donc il faut TIGCC 0.92 minimum - c'est tellement plus pratique de pouvoir mettre les déclarations au plein milieu du code comme en C++):
unsigned char donnees[]={
 0,11, //taille du fichier
 'p','r','o','u','t', //tes données
 0,'P','R','T',0, //le nom du type, entouré de 2 caractères nuls
 OTH_TAG //type personnalisé
 };
HANDLE handle=HeapAlloc(13); //taille du fichier, le short donnant la taille compris
if (!handle) {ST_helpMsg("Not enough memory!")exit(0);} //"error checking"
memcpy(HeapDeref(handle),donnees,13);
HSym symbole=SymAdd($(fichier)); //il faudra mettre un nom plus clair que "fichier" :D
if (!*(unsigned long *)&symbole) {ST_helpMsg("Not enough memory!")exit(0);}
//encore une vérification - remarque l'astuce pour tester la non-nullité d'une structure entière
//N'aie pas peur, le *(unsigned long *)& ne génère aucun code. C'est juste la manière C
//de faire un transtypage qui fait réinterpréter des données existantes comme autre chose.
//(Il n'y a pas de reinterpret_cast en C.)
DerefSym(symbole)->handle=handle; //assigne le handle
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

Merci pour ton exemple ( et ton aide ) Kevin que je vais maintenant essayer de comprendre ( après l'avoir testé grin ) mais en ce qui concerne la lecture de ce même fichier, c'est possible avec vat.h d'éviter fread ( et le reste de stdio.h ) ? ? ? Parce que dans mon prog c'est ce qui me prend le plus de mémoire ! ! !

11

Normalement, oui.

12

Et tu sais comment faire ?

13

SYM_ENTRY *symentry=SymFindPtr($(fichier),0);
if (!symentry) {ST_helpMsg("File not found: fichier!")exit(0);}
HANDLE handle=symentry->handle;
if (!handle) {ST_helpMsg("File not found: fichier!")exit(0);}
/*Normalement, un fichier a toujours un handle, mais mieux vaut vérifier.
Et AMS efface parfois seulement le handle et pas le symbole entier quand il
efface certaines variables système (comme par exemple regeq).
Même si normalement, ça ne devrait pas te concerner.*/
unsigned char *fptr=HeapDeref(handle);


À ce point, tu peux accéder à fptr comme à n'importe quel autre tableau. Si tu veux lire autre chose qu'un unsigned char, fais quelque chose de type: unsigned short i=*(unsigned short *)(fptr+1234);. Et n'oublie pas qu'à *(unsigned short *)fptr, il y a la taille du fichier.
[edit]Edité par Kevin Kofler le 19-02-2002 à 12:18:13[/edit]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

Je pense avoir compris l'essentiel de ton exemple mais par contre je n'arrive pas à l'adapter correctement à mon programme. Je souhaiterai enregistrer des nombres ( positifs et inférieur à 1000 ) dans ce fichier. J'ai donc fait :

unsigned char donnees3[] = { 0 ,22 ,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0,'P','R','T',0,OTH_TAG};

HANDLE handleA=HeapAlloc(24);
if (!handleA) exit(0);
memcpy(HeapDeref(handleA),donnees3,24);
HSym symbole=SymAdd($(config));
if (!*(unsigned long *)&symbole) exit(0);
DerefSym(symbole)->handle=handleA;

Puis pour lire le fichier et vérifier son contenu :

SYM_ENTRY *symentry = DerefSym(SymFind($(config)));
if (!symentry) exit(0);
HANDLE handle=symentry->handle;
if (!handle) exit(0);
unsigned char *fptr=HeapDeref(handle);
unsigned short i=*(unsigned short *)(fptr[4]); // pour vérifier le deuxième nombre

Après je l'affiche :
printf("%d", i);

Mais je n'obtiens pas le bon résultat, peux tu me dire pourquoi ? Je n'ai pas réussi à déterminer si le problème venait de la lecture ou de l'écriture ( peut être des deux en fait... )

15

C'est à l'écriture. N'oublie pas que tu ne mets que des char avec cette méthode. Donc pour enregistrer un unsigned short, il faut le couper en 2. Par exemple:
unsigned char donnees3[] = { 0 ,38 ,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,'P','R','T',0,OTH_TAG}; 

HANDLE handleA=HeapAlloc(40); 
if (!handleA) exit(0); 
memcpy(HeapDeref(handleA),donnees3,40);
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

Je ne sais pas si tu as pas bien compris mon exemple où si j'ai du mal à utiliser le tiens ! Dans mon exemple précédent je souhaitais enregistrer 16 nombres ayant pour valeurs 1,2,3,4,5,6,7,8 et encore 1,2,3,4,5,6,7,8. Avec :

unsigned char donnees3[] = { 0 ,38 ,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,'P','R','T',0,OTH_TAG};

Je n'obtiens tjs pas le bon résultat, mais j'ai par contre de gros doute concernant la lecture du fichier. Je dois utiliser :

unsigned short i=*(unsigned short *)(fptr[4]); // pour vérifier le deuxième nombre

En regardant la valeur de i. Ou bien :

unsigned char *fptr=HeapDeref(handle);

Puis en regardant la valeur de fptr[4] ( ou peut être fptr[5] si il faut compter les 0 ).

Désolé de t'embêter avec toutes ces questions mais j'avoue que je suis un peu perdu !
fou J'espère que tu sauras trouver mes erreurs...

17

Ah oui, il y a aussi une erreur dans la lecture. Ce qu'il faut, c'est:
unsigned short i=*(unsigned short *)(fptr+4);
ou:
unsigned short i=*(unsigned short *)(&fptr[4]);
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

Bon, petit à petit on avance... Merci ! Par contre il me semble ( d'après quelques essais ) qu'avec ce type de fichier on peut enregistrer des nombres jusqu'a 255 et pas au delà, est il possible d'enregistrer des nombre plus grand ?

19

Tu le coupes en 2! Par exemple: 515=2*256+3, donc tu mets 2,3.
Si tu ne veux pas te fatiguer, tu peux toujours mettre: 515>>8,515&0xff.
Mais si tu veux une manière vraiment flexible d'écrire dans un fichier, n'utilise pas un tableau fixé à recopier avec memcpy, mais écris dans ton bloc au fur et à mesure.
[edit]Edité par Kevin Kofler le 19-02-2002 à 19:54:28[/edit]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité