PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Retourner un tableau d'objets dynamique
Retourner un tableau d'objets dynamique
Débuté par no, 10 aoû. 2004 06:10 - 1 réponse
Posté le 10 août 2004 - 06:10
Bonjour,

J'aimerai avoir des fonctions qui ne servent qu'à allouer dynamiquement des
objets ; mais lorsqu'on revient de ces fonctions, l'objet est automatiquement
libéré de la mémoire.

Voici les extraits de code:

---------------------------------------------

FleurCollection est une classe

fleurs est un tableau dynamique

FIN

---------------------------------------------------
Fleur est une classe

i est entier

FIN

PROCEDURE Constructeur(i est entier)
:i = i
----------------------------------------------------
PROCEDURE creerFleurs()

fc est une FleurCollection
mesFleurs est un tableau dynamique de 10 Fleur dynamique
i est un entier

POUR i=1 A 10
mesFleurs[i] = allouer une Fleur(i)
FIN

fc:fleurs = mesFleurs

RENVOYER fc

-----------------------------
PROCEDURE init()

roses est une FleurCollection dynamique
roses = creerFleurs()

--------------------------------
Le programme démarre init(), alloue correctement la mémoire, mais le destructeur
de fleurCollection est appelé juste après "RENVOYER fc", donc il semblerait
qu'on retourne fc et après on le libère. Résultat: je ne peux plus utiliser
la variable "roses" puisque je reçois le message:
"Erreur à la ligne 16 du traitement Procédure globale init.
L'objet dynamique roses a déjà été libéré."

J'ai Windev8 version 01-80310g.

Merci pour votre aide,

Sébastien
Posté le 10 août 2004 - 18:06
Il est normal que fc soit détruit avant RENVOYER fc. Tu as déclaré FC de manière
statique, la variable n'existera donc que dans la fonction. Techniquement
je pense que roses reçoit bien un tableau mais non alloué. Change fc en FleurCollection
dynamique, alloue-le et renvoie-le. Tant qu'il existera une référence vers
ce tableau, il ne sera pas libéré implicitement.

"Sébastien" <no@spam.com> wrote:


Bonjour,

J'aimerai avoir des fonctions qui ne servent qu'à allouer dynamiquement

des
objets ; mais lorsqu'on revient de ces fonctions, l'objet est automatiquement
libéré de la mémoire.

Voici les extraits de code:

---------------------------------------------

FleurCollection est une classe

fleurs est un tableau dynamique

FIN

---------------------------------------------------
Fleur est une classe

i est entier

FIN

PROCEDURE Constructeur(i est entier)
:i = i
----------------------------------------------------
PROCEDURE creerFleurs()

fc est une FleurCollection
mesFleurs est un tableau dynamique de 10 Fleur dynamique
i est un entier

POUR i=1 A 10
mesFleurs[i] = allouer une Fleur(i)
FIN

fc:fleurs = mesFleurs

RENVOYER fc

-----------------------------
PROCEDURE init()

roses est une FleurCollection dynamique
roses = creerFleurs()

--------------------------------
Le programme démarre init(), alloue correctement la mémoire, mais le destructeur
de fleurCollection est appelé juste après "RENVOYER fc", donc il semblerait
qu'on retourne fc et après on le libère. Résultat: je ne peux plus utiliser
la variable "roses" puisque je reçois le message:
"Erreur à la ligne 16 du traitement Procédure globale init.
L'objet dynamique roses a déjà été libéré."

J'ai Windev8 version 01-80310g.

Merci pour votre aide,

Sébastien