1

voila mon code
char *buff0=malloc(12);
char *buff1=malloc(9);
char *buff2=malloc(3);
char af[2];
short c=0;

clrscr();
buff0=getvar("passw");
c=strlen(buff0);
DrawStr(1,1,buff0,A_NORMAL);
ngetchx();
clrscr();
buff0+=1;
strncpy(buff1,buff0,;
DrawStr(1,1,buff1,A_NORMAL);
ngetchx();
clrscr();
buff0+=8;
strncpy(buff2,buff0,2);
sprintf(af,"%d",c);
DrawStr(1,1,buff2,A_NORMAL);
DrawStr(1,12,af,A_NORMAL);
ngetchx();

free(buff0);
free(buff1); free(buff2);


mai kan le prog arrive a free(buff0); il plante j'ai une adresse error pk???? alors que les autres marche quand j'enleve free(buff0); ????

2

buff0+=1;

ça change l'adresse du pointeur : il ne pointe plus sur ce qui avait été retourné par malloc, mais un octet plus loin
=> qd tu essaye de libérer, ça ,n'essaye pas de libérer e bloc alloué par malloc... mais un octet plus loin... donc ça plante
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

hum...
1) était-ce nécessaire de créer (encore) un nouveau topic plutôt que de continuer dans un ancien?
2) <buff0=getvar("passw");> --> ne modifie pas le contenu de la zone désignée par buff0 (la zone allouée), mais modifie son adresse (i.e. buff0 pointe désormais vers la valeur renvoyée par getvar, et on a perdu toute trace de la zone allouée : elle est partie dans le vide intersidéral et gaspillera la mémoire de la calc jusqu'au prochain reset). Il y a en outre de fortes chances pour que l'adresse renvoyée par getvar() soit une adresse temporaire et donc invalide...

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

4

alors comment je fai pour le liberer???

5

alors comment je fai pour le liberer???

bah, tu en conservce une copie, à la limite, si tu as vraiment besoin de lle modifier... et tu effface la copie, qui pointera sur ce qui a été renvoyé par malloc
cela dit, Pollux soulève un point interessant smile
(je n'ai fait que survoler très briévement ton code, et qd j'ai vu le buff0+=1, j'ai pas cherché plus loin)
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

(je n'ai fait que survoler très briévement ton code, et qd j'ai vu le buff0+=1, j'ai pas cherché plus loin)

idem, mais c'était un autre bout du code smile

<half-troll>
Rha là là, si les jeunes faisaient de l'assembleur avant de se mettre au C, ils feraient pas toutes ces erreurs-là...
</>

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

7

ben oui mai je voi pas comen faire pour faire free alors ???? car il fo bien le libere

8

Le problème est bien plus grave que de ne pas libérer la mémoire. Après l'appel à getvar(), buff0 pointe sur une variable temporaire (enfin j'imagine, mais je n'ai pas le code de getvar()), et donc ton programme risque de faire complètement n'importe quoi (et s'il ne le fait pas maintenant, il le fera au moment où tu t'y attends le moins et où ça sera le plus difficile à débugger...)

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

9

voila get var

char *getvar(const char *var)
{
//Init
short size=0;
ESI e;
SYM_ENTRY *sym;
char *v=0;
sym=DerefSym(SymFind(SYMSTR(var)));
size = ((MULTI_EXPR*) HeapDeref (sym->handle))->Size + 2;
e=HToESI(sym->handle);
v=(char *)GetStrnArg(e);
return v-size+sizeof(v)+3;
}

g trop besion de libere c pour ca smilesmile

10

Alors c pas une variable temporaire, donc tu peux te contenter de faire strcpy(buffer0,getvar(...))

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

11

et c'est quoi la difference avec buff0=getvar("passw");????????

12

ben ca change rien ca plante kan meme lol

13

bon j'ai resolut mon probleme mai j'en ai encore un voila avec ce code la.
buffer+=9;
strncpy(buff2,buffer,2); f=atoi(buff2);


j'avance mon pointeur buffer de 9 le copie dans buff2 et copie le contenue de buff2 en chiffer dans f mai mon probleme c'est qu'il ya "12" dans buff2 et que f est egale a 2 pareille quand il ya 25 f est egale a 5 pourquoi????

14

Surement un problème d'avalcement de ton buffer ...
essaye avec :
strncpy(buff2,buffer+8,2);

15

ok merci nikel smilesmilesmile

16

c juste pke ca commence à zéro koi ...

17

cerede2000 : Elle est un peu grosse ta signature wink
avatar
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.