Pim89
a écrit :
Kevin >> ah bon ?? je savais pas ça ... pourquoi on peut pas ?
Thibaut l'a déjà expliqué.
Et la fonction memmove() par ex, elle retourne bien une adresse, et on peut bien faire :
void *dest = memmove(....);
dans une fonction non ???
Oui, mais ce n'est pas une variable locale de
memmove, c'est une adresse passée comme paramètre qui est renvoyée comme résultat.
Aussi, j'utilise cette fonction dans un programme :
char *open_file(char *str)
{
SYM_ENTRY *sym_entry1 = SymFindPtr(SYMSTR(str),0);
if (!sym_entry1 || !sym_entry1->handle)
return NULL;
char *file = (char *)HeapDeref(sym_entry1->handle);
if (!file)
return NULL;
return (file+2); // saute le mot qui donne la taille
}
que j'appelle dans n'importe quelle fonction comme cela :
char *file = open_file("gfx")
est elle dangereuse lors de son execution ?? car j'ai jamais eu de problème, j'ai tjs bien eu "file" qui pointer vers mes données externes.
Là, ça va:
(char *)HeapDeref(sym_entry1->handle);
ça renvoie l'adresse d'un bloc alloué, pas l'adresse d'une variable locale.
Mais attention à la réorganisation de la RAM! Il faudrait utiliser
HLock ici, pas
HeapDeref!
Pim89 a écrit :
Donc c'est sur, ce code là n'est nullement dangereux (pourtant Kevin semblait dire le contraire : "tous les 2 boggués") ???
Je parle bien de celui ci :
char *open_file(char *str)
{
SYM_ENTRY *sym_entry1 = SymFindPtr(SYMSTR(str),0);
if (!sym_entry1 || !sym_entry1->handle)
return NULL;
char *file = (char *)HeapDeref(sym_entry1->handle);
if (!file)
return NULL;
return (file+2); // saute le mot qui donne la taille
}
appelés comme ça dans main() par ex :
char *file = open_file("gfx")
Celui-là va, à part le problème de la réorganisation de la RAM.
Ben tant mieux si c'est sans risque, mais pourquoi Kevin a dit ça alors ??? peut-être qu'il n'avait pas vu que la variable qui recevait l'adresse de la fonction open_file() était un pointeur ?!
Non, le problème est là:
int *ma_fonction(void)
{
int resultat[2], variable_1, variable_2;
/*... ma fonction ...*/
resultat[0]=variable_1;
resultat[1]=variable_2;
[b]return resultat;[/b]
}
Là, tu renvoies un pointeur vers le tableau
resultat. Comme tu ne peux pas renvoyer un tableau entier, il te faut obligatoirement utiliser mon code du message #7 (ou alors allouer le tableau avec
malloc, mais là, tu risques d'oublier le
free - ma méthode, c'est-à-dire passer un buffer en paramètre, est plus pratique).