1

Bonjour à tous,

j'ai créé un bout de code pour récupérer le contenu d'une variable (CHN) de 15 caractères sur la calculatrice.

FILE *f = fopen (nomchaine, "r");
fgets(x,15,f);
fclose (f);

DrawStr(10,10,x,A_NORMAL);

Cela marche très bien dans VTI avec un AMS 2.04

Par contre j'ai une erreur "accès illicite à la mémoire" quand j'execute ce programme sur ma babasse qui a un AMS 2.08.

Merci de votre aide


2

tout d'abord, commence, après ton fopen, par véirifier si le fichier a bien été ouvert
(autrement dit, si la valeur retournée par fopen est différente de NULL)

ensuite, au niveau du format des fichiers STR sur Ti, je me demande s'ils ne commencent pas par un 0, et finissent par un 0.
auquel cas, il faudrait que tu sautes le 0 de départ.
après vérification, il semblerait que, effectivement, un fichier STR commence par un octet valant 0, puis ensuite, la chaîne de caractères, terminée par un 0 comme le veut la norme C. Il te faut donc, je pense, sauter le premier caractère du fichier.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

3

En fait là tu ouvres le fichier en mode texte (mode "r"), mais le mode texte ne marche qu'avec des "vrais" fichiers texte (TEXT). Pour utiliser d'autres types de données, comme des chaînes de caractères, il faut passer par le mode binaire ("rb"). Une fois que tu l'as ouvert comme ça, effectivement comme le dit squale il faut zapper le premier caractère qui sera tjs un 0 (sinon tu auras une chaîne vide), puis tu peux lire ta chaîne.

Enfin fais attention, si le contenu de la chaîne fait plus de 15 caractères, ton prog risque de planter (chaîne hyper longue), donc pense à rajouter un truc comme x[15]=0 juste après le fgets (si tu as déclaré un buffer de 16 octets)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

4

Merci de m'avoir répondu si rapidement !

Ca ne marche toujours pas. sick

En fait j'ai fait une boucle qui fouille dans un repertoire de la TI (ici "chaines") composé uniquement de chaînes STR, et qui doit afficher à l'écran le nom de la chaîne et le contenu:

SYM_ENTRY *SymPtr = SymFindFirst (SYMSTR ("chaines"), 1);
push_END_TAG ();

char *noms;
char names[] = "";
char *x;

while (SymPtr)
{
push_ANSI_string (SymPtr->name);
strcpy(noms,SymPtr->name);


DrawStr(4,y,noms,A_NORMAL);


FILE *f = fopen (noms, "rb");
fgets(x,10,f);
fclose (f);

DrawStr(50,50,x,A_NORMAL);

SymPtr = SymFindNext ();
}

Voilà je ne trouve pas l'erreur...

Merci pour votre aide

5

tu déclares ds pointeurs noms et x, mais tu ne leur fait correspondre aucun espace mémoire.
donc, quand tu écris vers ces pointeurs (avec le strcopy pour noms, et avec le fgets pour x), tu écris n'importe où en mémoire
et donc, tu corrompt de la mémoire => la calculatrice va devenir instable
donc ça plantera à un moment ou à un autre

ce que tu peux faire, plutot que de déclarer tes pointeurs et de ne jamais dire sur quoi ils pointent, c'est de déclarer des tableaux de chars, un peu comme ça :
char noms[18];
(18 : 8+8 pour les noms de fichier et de répertoire, +1 pour l'antislash entre les deux, +1 pour le 0 de fin de chaine ; à toi d'adapter la taille si tu veux stocker autre chose)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

6

Ca marche déjà mieux, mais j'ai un problème avec le fgets.

J'ai déclaré un tableau de char pour le x, mais j'arrive pas à mettre le contenu de ma variable STR dedans.
(j'utilise le même code que plus haut).

7

T'as pas dû lire mon post en entier neutral
Pollux :
En fait là tu ouvres le fichier en mode texte (mode "r"), mais le mode texte ne marche qu'avec des "vrais" fichiers texte (TEXT). Pour utiliser d'autres types de données, comme des chaînes de caractères, il faut passer par le mode binaire ("rb"). Une fois que tu l'as ouvert comme ça, effectivement comme le dit squale il faut zapper le premier caractère qui sera tjs un 0 (sinon tu auras une chaîne vide), puis tu peux lire ta chaîne.

Enfin fais attention, si le contenu de la chaîne fait plus de 15 caractères, ton prog risque de planter (chaîne hyper longue), donc pense à rajouter un truc comme x[15]=0 juste après le fgets (si tu as déclaré un buffer de 16 octets)


« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

Pour zapper le premier caractère je fais comment ? hum

Je pensait utiliser:

FILE *f = fopen (noms, "rb");

fseek(noms,1,,SEEK_SET);

fgets(xx,sizeof(xx),noms);
fclose(f);


mais ça marche pas...

9

fseek(f, ...), pas noms happy

ou sinon tu peux faire fgetc(f) (ton prog sera sans doute plus petit comme ça)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

J'ai rectifié, mais je n'arrive toujours pas a recupérer le contenu de ma STR mur

short c;
short xx[10];

FILE *f = fopen (noms, "rb");

for(c==0;c==9;c++)
{
xx[c] = fgetc(f);
}

fclose(f);


Personne n'a d'exemple concret ?
Merci

11

euh...
- déjà c==0 n'a rien à voir avec c=0
- ensuite c'est pas c==9 que tu voulais mettre, c'est c!=9
- enfin c'est pas ce que je voulais dire, je parlais de remplacer le fseek() par un fgetc() (c'est pas impossible que fseek() soit buggée) :
FILE *f = fopen (noms, "rb");
fgetc(f); // on ignore le premier caractère, ça sera toujours un '\0'
fgets(xx,sizeof(xx),f);
fclose (f);

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

12

Merci beaucoup ça marche !

top