HANDLE *handle;

IroS> Regarde un cours de C sur l'arithmétique des pointeurs... Ajouter un entier à un "HANDLE *" et à un "char *", ça ne fait pas la même chose...
Vertyos
: Je comprends pas comment t'as pu faire cette erreur alors que tu viens juste de recopier mot à mot (même les commentaires !) le code de Kevin...
Pollux :
Petites remarques :
* pas besoin de réaffecter le numéro de handle, HeapUnlock ne le change pas
* pas besoin de mettre des parenthèses autour de HeapGetLock()
* pas besoin de tester si le handle est locké, HeapUnlock marche même sur un handle non locké
Sinon tu es sûr que size+add+2 est bien à une valeur "raisonnable" ? Parce qu'à part un bug à un autre endroit du code qui corrompt le heap, je vois pas...
void _main(void)
{
SYM_ENTRY *sym = FindProgramVar();
if (!sym) return;
sym->handle = HeapUnlock(sym->handle);
HANDLE *handle = HeapDeref(sym->handle);
short add=100,size=*(unsigned short*)handle;
//Modifie la taille
HANDLE h=HeapRealloc(sym->handle,size+add+2);
//Si ça a réussi
if (h)
{
// Met à jour le pointeur handle
handle=HeapDeref(h);
// Pointe "old" sur le tag avant redimensionnement
//char *old=(char*)(handle+*(unsigned short*)handle+1);
char *old= (HToESI (sym->handle));
// Ajoute 10 octets à la variable (partie 2)
*(unsigned short*)handle=size+add;
// Pointe "p" sur l'octet precedant le tag
char *p=old-1;
// cherche le mot nul (pas while(*--p || *--p) à cause de l'évaluation paresseuse)
while(*(p--) || *p) p-=3;
// déplace la table de relogements
memmove(p+add,p,old-p);
// Réécrit le tag
*(HToESI (sym->handle)) = 243;
}
}
Pollux :
... tu veux vraiment pas lire un tuto sur le C ? (celui de squale92 par exemple)
Parce que là "handle" (qui n'a rien avoir avec un handle, d'ailleurs, tu peux éventuellement appeler ça un handle déréférencé si tu veux, mais c'est un pointeur vers un bloc mémoire [par opposition à handle = numéro de bloc mémoire] ) n'a aucune raison d'être un HANDLE *... C'est un pointeur vers un bloc mémoire (que l'on peut identifier par un HANDLE si on veut, mais ça n'a rien à voir), ce n'est pas un pointeur vers un tableau de HANDLE...
Pollux
: Résultat quand tu fais l'addition, il considère qu'il doit prendre l'adresse du "*(unsigned short*)handle+1"-ème élément de handle vu comme un tableau de HANDLE, ce qui n'est pas la même chose que si on le déclare comme un "char *"... cf tuto C pour plus d'explication.
IroS
: pour le nom des variables, c'est comme pour les commentaires (cf. #60)
Pollux
: Résultat quand tu fais l'addition, il considère qu'il doit prendre l'adresse du "*(unsigned short*)handle+1"-ème élément de handle vu comme un tableau de HANDLE, ce qui n'est pas la même chose que si on le déclare comme un "char *"... cf tuto C pour plus d'explication.
j'ai pas tout compris ce que tu essais de dire là
IroS :
topics/17996-surement-deja-demande-self-pointing#23
moi quand je lis le commentaire "... et un pointeur sur son handle "handle"" j'écris "HANDLE *handle"si ça peut te faire plaisir je l'appelerai autrement
PpHd :
>D'ailleurs, le hack de Kevin ne marchera plus si TI ajoute de la RAM (ça a l'air bien parti pour, avec la suppression du ghost) AMS 3.00 detecte dynamiquement la taille de la RAM.
> euh, ça marche pas si c dans le ghost space... Ca marche dans le ghost space.
Pollux :
Euh mais je ne vois marqué nulle part que c'est un HANDLE *, tu te mélanges les pinceaux... cf ./74 et ./75.