1

Slt à tous !!

J'aimerai comprendre pourquoi j'ai une erreur "Protected Memory violation" quand j'essaie lire un fichier texte de la façon :


char chaine[20];
FILE *fichier_data;
fichier_data = fopen("TIShellD.TEXT", "r");

fread (chaine,1,1,fichier_data);

DrawStr(10,10,chaine, A_NORMAL);




Au passage, j'aimerai savoir comment faire pour exécuter un programme avec des paramètres depuis tigcc exemple :

txtrider("fichierdecompresse");

Merci d'avance

2

Il ne faut pas mettre le .TEXT smile Accessoirement, ton code ne lit qu'un seul caractère du fichier texte (et pas 20).

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

3

Slt!!

Merci pour m'avoir répondu si rapidement smile

Je viens d'essayer d'enlever le .TEXT, maintant ça plante pas, mais ça affiche n'importe quel caractère, je vais essayer de comprendre pourquoi, ça doit sûrement être une histoire de pointeur.


Merci beaucoup

4

Merci beaucoup en fait ça affiche bien ce qu'il faut mais je sais pas pour quelle raison l'écran de virtual ti se mette à "manger" des caractères

5

Rhalala...
1.bon, tout d'abord sais-tu comment est faite une chaine en C ?
Apparemment non. Une chaine se termine avec un 0, qui sert de marqueur de fin pour toutes les routines qui manipulent ces
chaines. Ensuite, ton fread lis 1 char dans le fichier mais si les reste de ton tableau (tab[1]->tab[19]) ne contiens aucun 0,
DrawStr est capable d'afficher plein de chars jusqu'a ce qu'il trouve un 0->plantage assuré.

2.N'oublie pas de vérifier que ton fopen t'as renvoyé une valeur correcte.

3.les noms TI ne comportent que des minuscules.

4.si ca ne marche tjs pas poste ton code en entier.

6

BenTIGCC :
Au passage, j'aimerai savoir comment faire pour exécuter un programme avec des paramètres depuis tigcc exemple :
txtrider("fichierdecompresse");

Tu utilises EXECUTE_IN_GHOST_SPACE et un appel bas-niveau au programme (en rajoutant 0x40000 à l'adresse). Pour passer le paramètre, avant de faire ton appel bas-niveau, tu mets le paramètre sur la pile d'expressions:
// passage du paramètre
ESI old_estack=top_estack;
push_END_TAG();
push_zstr("toto");
// appel bas-niveau:
EX_patch(fptr+0x40000,fptr+size+0x3ffff);
ASM_call(fptr+0x40000);
// restauration de la pile d'expression
top_estack=old_estack;
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é

7

Euh, Kevin, excuse moi, mais je crois qu'on a affaire à un nioob là wink

8

Et alors? Les étapes précédant mon extraît de code sont dans la FAQ. http://tigcc.ticalc.org/doc/faq.html#49. (Mais supprime l'appel à enter_ghost_space et utilise EXECUTE_IN_GHOST_SPACE à la place. enter_ghost_space est dépassé et peut faire tout planter si tu ne sais pas exactement ce que tu fais!)
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é

9

Et d'ailleurs, tu ferais mieux d'appeler hibview que txtrider. Raison: pas besoin de kernel.
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

gni

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

11

"1.bon, tout d'abord sais-tu comment est faite une chaine en C ?
Apparemment non. Une chaine se termine avec un 0, qui sert de marqueur de fin pour toutes les routines qui manipulent ces chaines"


Je sais bien, mais mon tableau était initialisé avant (j'allais pas tout recopier, c'était pour comprendre pourquoi ça plantait, c'est tout...) et je dois dire que j'ai du mal à ne plus utiliser des choses du genre

char *chaine = new char[20];


Au fait, c'est normal que mon fread ne lise qu'un caractère, car il faut que je scanne chaque caractères du fichier, et là, ce n'était qu'un test avec de faire ma boucle.

et je comprends pas pourquoi tu me réponds ça alors que j'avais dis un post plus haut que ça marchait et que c'était à cause de virtual ti qui m'affichait pas bien les caractères (zoom*2 résout le problème)....


Merci Kevin pour m'avoir répondu

12

si ça plantait c'était que à cause du ".TEXT" que j'avais mis dans mon fopen...

13

mon tableau était initialisé avant

Hé non. En C, il n'y a jamais d'initialisation sans '=' ou sans manipulation explicite. Il faut que tu rajoutes 'memset(chaine,0,sizeof(chaine))'.
Au fait, c'est normal que mon fread ne lise qu'un caractère

Y a même une fonction fait pour ça, ça s'appelle fgetc.

Et sinon, vérifie _toujours_ le résultat de tes appels : vérifie pour fopen, pour malloc si tu fais de l'allocation de mémoire, et n'oublie pas le fclose et le free qui vont avec (sinon plantages/memory leaks/comportements bizarres assurés).

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

14

Pollux
:
mon tableau était initialisé avant
Hé non. En C, il n'y a jamais d'initialisation sans '=' ou sans manipulation explicite. Il faut que tu rajoutes 'memset(chaine,0,sizeof(chaine))'.
Ou bien à la déclaration : char chaine[20]={};
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

15

Ah oui, c'est vrai. D'ailleurs au début GTC traitait ça comme un nop (et ça me semble plus logique), mais comme je me suis rendu que TIGCC faisait comme ça, ça fait effectivement un memset.

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

16

fichier_data = fopen("TIShellD.TEXT", "r");
terdit (provoque une erreur de protection mémoire). Donc, si tu enlèves le .TEXT ça marchera, mais si le fichier n'existe pas, tu te retrouveras dans le même cas qu'avant; la solution pour éviter tout problème est de vérifier que fichier_data n'est pas NULL:fichier_data = fopen("TIShellD.TEXT", "r"); if (fichier_data==NULL) { exit(960); //Undefined variable }C'est normal, car fopen te renverra NULL si le fichier n'a pas pu être ouvert. Et lire à partir de NULL est inOù tu remplaceras le exit(960) par le code que tu veux exécuter si le fichier n'existe pas (généralement libérer la mémoire, signaler une erreur à l'utilisateur et quitter). Ne fais PAS de fclose si fichier_data==NULL. Tu peux aussi trouver des constructions du type if (!fichier_data) ce qui est équivalent à if(fichier_data==NULL).
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

17

"exit(x);" ne balance pas l'erreur numéro x, non?

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

18

Si il renvoie l'erreur n!
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

19

OK. Depuis quand?

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

20

Alors là je ne sais pas, il faut regarder dans les mises à jours de TIGCC.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

21

void exit (short code);

Forced termination of the program.

exit terminates the program (it may be called from any nesting level). Before termination, any registered "exit functions" (posted with atexit) are called. ANSI proposes that exit also closes all open files. Such behaviour is not implemented here, you need to do it manually if necessary.
code is the exit status. Value of 0 is used to indicate a normal exit. If code is nonzero, an error message dialog which corresponds with code code will be displayed before exiting. Note that this is not the same as throwing error code using ER_throwVar. Throwing an error is much more "barbaric" method for exiting from the program. Among others, by throwing an error, no registered "exit functions" will be called.
960 = Undefined variable, ce qui est à peu près juste dans notre cas...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

22

Brunni
: Et lire à partir de NULL est interdit (provoque une erreur de protection mémoire).

Non, pire, ça lit n'importe quoi sans broncher. La protection de la mémoire basse n'empêche que les écritures.
Pollux
: "exit(x);" ne balance pas l'erreur numéro x, non?

Il ne balance pas l'erreur, il l'affiche avec ERD_dialog et quitte normalement. Si tu veux balancer une erreur, ça se fait avec #define ENABLE_ERROR_RETURN et ER_throw (qui marche comme exit, mais de manière un peu plus "barbare", par exemple, les fonctions enregistrées avec atexit ne sont pas exécutées).
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é

23

Il ne balance pas l'erreur, il l'affiche avec ERD_dialog et quitte normalement. Si tu veux balancer une erreur, ça se fait avec #define ENABLE_ERROR_RETURN et ER_throw (qui marche comme exit, mais de manière un peu plus "barbare", par exemple, les fonctions enregistrées avec atexit ne sont pas exécutées).

Evidemment roll De toute façon, ça, c'est implementation-defined. On pourrait aussi faire avec ENABLE_ERROR_RETURN & co.

Et donc ça y est depuis qd?

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

24

Longtemps. grin (exit depuis très longtemps, pour ENABLE_ERROR_RETURN, je ne sais plus exactement, mais longtemps aussi.)
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é

25

Au temps pour moi smile

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

26

Non, pire, ça lit n'importe quoi sans broncher.
C'est clair, il va prendre ce qu'il y a à l'adresse (long)NULL pour un pointeur sur une structure FILE, et y lire non?
La protection de la mémoire basse n'empêche que les écritures.
Ca je ne savais pas smile Parfois j'obtiens des erreurs bizarres, la barre noire se dessine à moitié (50aine d'octets sont noircis), puis ça bloque une seconde environ, puis la barre noire est terminée et Address Error est affiché. A quoi est-ce dû?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

27

A quoi est-ce dû?

A un crash gni

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

28

Non mais à quoi est-ce du le fait qu'address error n'apparaît qu'une seconde plus tard? smile
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

29

Sur VTi ou sur real calc ?

30

Sur VTI, mais il me semble déjà avoir vu sa sur real calc, mais maintenant j'ai un doute.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741