PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → POO - Libération d'un tableau dynamique dans une classe
POO - Libération d'un tableau dynamique dans une classe
Débuté par Gerard, 06 aoû. 2003 19:24 - 7 réponses
Posté le 06 août 2003 - 19:24
Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un booléen
privé global (race_alloué) pour n'allouer ce tableau qu'une seule fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau depuis un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le tableau
dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau t_race j'ai
un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le constructeur du
premier objet ?

Merci ,

Gérard.
Posté le 07 août 2003 - 12:34
Moi je libererai le tableau dynamique dans le destructeur de l'objet qui a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de news:3f3128af@news....
Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un

booléen
privé global (race_alloué) pour n'allouer ce tableau qu'une seule fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau depuis un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le

tableau
dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau t_race

j'ai
un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le constructeur du
premier objet ?

Merci ,

Gérard.


Posté le 07 août 2003 - 18:01
Merci,
Oui, mais dans ce cas, je dois recharger le tableau, qui est global à la
classe, à chaque objet, donc un temps de traitement désastreux.
Le tableau étant unique et global pour tout les objets, je comptais le
charger en mémoire qu'une seul fois.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f321a35$1@news....
Moi je libererai le tableau dynamique dans le destructeur de l'objet qui a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de

news:3f3128af@news....
Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un
booléen

privé global (race_alloué) pour n'allouer ce tableau qu'une seule fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau depuis

un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le
tableau

dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau t_race
j'ai

un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le constructeur

du
premier objet ?

Merci ,

Gérard.





Posté le 07 août 2003 - 18:57
Ok, 2 solutions :
1- tu alloues ton tableau dans le code d'ouverture du projet et tu libère
ton tableau dans le code de fermeture du projet. (il faut passer par des
méthodes globale public car ton tableau est privé)
Note : avec cette solution le tableau est alloué même si tu n'a pas
d'objet instancié

2- le premier objet instancié alloue le tableau pour les suivant, le dernier
libéré libère le tableau (il va falloir compter le nombre d'instance dans un
entier long global à ta classe)
Note : avec cette solution quand il n'y a plus d'objet le tableau n'est
pas alloué, qd il y a en 15 en mémoire le tableau a été alloué une seule
fois.



"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de news:3f3266b4@news....
Merci,
Oui, mais dans ce cas, je dois recharger le tableau, qui est global à la
classe, à chaque objet, donc un temps de traitement désastreux.
Le tableau étant unique et global pour tout les objets, je comptais le
charger en mémoire qu'une seul fois.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f321a35$1@news....
Moi je libererai le tableau dynamique dans le destructeur de l'objet qui

a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3128af@news....

Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un
booléen

privé global (race_alloué) pour n'allouer ce tableau qu'une seule

fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau

depuis
un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le
tableau

dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau

t_race
j'ai
un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le

constructeur
du
premier objet ?

Merci ,

Gérard.








Posté le 08 août 2003 - 09:54
Je vais passer par ta solution 1, en forçant en début de projet un objet
inutile que je détruirai en fin de projet.
Merci

Gérard.


"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f3273e9$1@news....
Ok, 2 solutions :
1- tu alloues ton tableau dans le code d'ouverture du projet et tu libère
ton tableau dans le code de fermeture du projet. (il faut passer par des
méthodes globale public car ton tableau est privé)
Note : avec cette solution le tableau est alloué même si tu n'a pas
d'objet instancié

2- le premier objet instancié alloue le tableau pour les suivant, le

dernier
> libéré libère le tableau (il va falloir compter le nombre d'instance dans
un
entier long global à ta classe)
Note : avec cette solution quand il n'y a plus d'objet le tableau

n'est
pas alloué, qd il y a en 15 en mémoire le tableau a été alloué une seule
fois.



"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de

news:3f3266b4@news....
Merci,
Oui, mais dans ce cas, je dois recharger le tableau, qui est global à la
classe, à chaque objet, donc un temps de traitement désastreux.
Le tableau étant unique et global pour tout les objets, je comptais le
charger en mémoire qu'une seul fois.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f321a35$1@news....
Moi je libererai le tableau dynamique dans le destructeur de l'objet

qui
a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3128af@news....

Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un
booléen

privé global (race_alloué) pour n'allouer ce tableau qu'une seule
fois.


Pour le premier objet qui utilise la classe, j'alloue ce tableau
depuis

un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais

ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le
tableau

dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau
t_race

j'ai
un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le
constructeur

du
premier objet ?

Merci ,

Gérard.











Posté le 08 août 2003 - 13:41
Inutile d'instancier un objet puisque ton tableau est global (donc un membre
de classe et non d'instance)
Exemple (si tu le rend public)

MaClasse::MonTableau = alloue ...

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de news:3f334624@news....
Je vais passer par ta solution 1, en forçant en début de projet un objet
inutile que je détruirai en fin de projet.
Merci

Gérard.


"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f3273e9$1@news....
Ok, 2 solutions :
1- tu alloues ton tableau dans le code d'ouverture du projet et tu

libère
ton tableau dans le code de fermeture du projet. (il faut passer par des
méthodes globale public car ton tableau est privé)
Note : avec cette solution le tableau est alloué même si tu n'a pas
d'objet instancié

2- le premier objet instancié alloue le tableau pour les suivant, le
dernier

libéré libère le tableau (il va falloir compter le nombre d'instance

dans
un
entier long global à ta classe)
Note : avec cette solution quand il n'y a plus d'objet le tableau
n'est

pas alloué, qd il y a en 15 en mémoire le tableau a été alloué une seule
fois.



"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3266b4@news....

Merci,
Oui, mais dans ce cas, je dois recharger le tableau, qui est global à

la
classe, à chaque objet, donc un temps de traitement désastreux.
Le tableau étant unique et global pour tout les objets, je comptais le
charger en mémoire qu'une seul fois.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f321a35$1@news....
Moi je libererai le tableau dynamique dans le destructeur de l'objet
qui

a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3128af@news....

Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et

un
booléen
privé global (race_alloué) pour n'allouer ce tableau qu'une seule
fois.


Pour le premier objet qui utilise la classe, j'alloue ce tableau
depuis

un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau

mais
ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que

le
tableau
dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau
t_race

j'ai
un message d'erreur qui dit que t_race n'est pas un objet

dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le
constructeur

du
premier objet ?

Merci ,

Gérard.














Posté le 08 août 2003 - 16:31
OK,
Mais cette classe est portée dans pls appli (5.5 & 7.5), et la portabilité
est une priorité.
C'est pour cela, que dans le code de l'appli, je ne veux qu'utiliser des
objet, et non pas instencier des membres globaux, ce qui m'obligerais à
faire du copier/coller au niveau du code des applis, alors que ma classe est
dans le dictionnaire, et un seul click de la classe me permet de la charger.

Mais les dictionnaires me direz-vous !... oui, mais ça ralenti énormément.

Salut

Gérard.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f337b4e@news....
> Inutile d'instancier un objet puisque ton tableau est global (donc un
membre
de classe et non d'instance)
Exemple (si tu le rend public)

MaClasse::MonTableau = alloue ...

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de

news:3f334624@news....
Je vais passer par ta solution 1, en forçant en début de projet un objet
inutile que je détruirai en fin de projet.
Merci

Gérard.


"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f3273e9$1@news....
Ok, 2 solutions :
1- tu alloues ton tableau dans le code d'ouverture du projet et tu
libère

ton tableau dans le code de fermeture du projet. (il faut passer par

des
méthodes globale public car ton tableau est privé)
Note : avec cette solution le tableau est alloué même si tu n'a

pas
d'objet instancié

2- le premier objet instancié alloue le tableau pour les suivant, le
dernier

libéré libère le tableau (il va falloir compter le nombre d'instance
dans

un
entier long global à ta classe)
Note : avec cette solution quand il n'y a plus d'objet le tableau
n'est

pas alloué, qd il y a en 15 en mémoire le tableau a été alloué une

seule
fois.



"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3266b4@news....

Merci,
Oui, mais dans ce cas, je dois recharger le tableau, qui est global

à
la
classe, à chaque objet, donc un temps de traitement désastreux.
Le tableau étant unique et global pour tout les objets, je comptais

le
charger en mémoire qu'une seul fois.

"Percapita" <f.lambour@everlog.com> a écrit dans le message news:
3f321a35$1@news....
Moi je libererai le tableau dynamique dans le destructeur de

l'objet
qui
a
fait son allocation (dans ton cas la première instance)

"Gerard" <gkcc@wanadoo.fr> a écrit dans le message de
news:3f3128af@news....

Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race),

et
un
booléen
privé global (race_alloué) pour n'allouer ce tableau qu'une

seule
fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau
depuis

un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau
mais

ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit

que
le
tableau
dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau
t_race

j'ai
un message d'erreur qui dit que t_race n'est pas un objet
dynamique.


Question :
Comment libérer ce tableau global qui a été alloué dans le
constructeur

du
premier objet ?

Merci ,

Gérard.

















Posté le 11 août 2003 - 18:43
Ce que tu as besoin de faire, c'est donc, en parallèle de créer le tableau
global dans le premier objet créé, détruire le tableau global dans le dernier
objet détruit...

Pour ça, tu ajoute un membre global lInstances que tu incrémente dans le
constructeur et décrémente dans le destructeur.

Si, après décrémentation dans le destructeur, lInstances vaut 0, alors tu
détruit le tableau global.

Cordialement


"Gerard" <gkcc@wanadoo.fr> wrote:
Bjr à tous.
J'utilise un tableau dynamique déclaré privé global (t_race), et un booléen
privé global (race_alloué) pour n'allouer ce tableau qu'une seule fois.

Pour le premier objet qui utilise la classe, j'alloue ce tableau depuis

un
fichier dans le constructeur de l'objet.

Les objets suivant utilise uniquement le contenu de ce tableau mais ne
l'alloue plus.

Si je test le programme (mode test sous l'éditeur), WD me dit que le tableau
dynamique n'est pas libéré.

Si je rajoute en terminaison de classe la libération du tableau t_race

j'ai
un message d'erreur qui dit que t_race n'est pas un objet dynamique.

Question :
Comment libérer ce tableau global qui a été alloué dans le constructeur

du
premier objet ?

Merci ,

Gérard.