OVH Cloud OVH Cloud

Type Statement

15 réponses
Avatar
Charles
Bonjour,

Mon programme VB comporte plus de 400 variables et=20
matrices; j'ai regroup=E9 les variables dans des "Type" ce=20
qui simplifie grandement la lecture et l'utilisation du=20
code; J'aimerais en faire de m=EAme pour les matrices mais=20
la capacit=E9 des "Type" semble tr=E8s limit=E9e; Message=20
d'erreur "Compile Error : Fixed or static data can't be=20
larger than 64k". Mes matrices ont une taille de (1 to 7,=20
1 to 500) soit une matrice par "Type"; aucun interet donc;=20
Y-a-t-il un moyen de contourner cette limite de taille?=20
J'ai entendu parler de "Classe"?
Merci

10 réponses

1 2
Avatar
Zoury
Salut Charles! :O)

la capacité des "Type" semble très limitée; Message
d'erreur "Compile Error : Fixed or static data can't be
larger than 64k".



euh.... quoi ?! :Oo

64k (65355 octets) c'est beaucoup plus qu'il n'en faut pour représenté
n'importe quel "Objet"..


Mes matrices ont une taille de (1 to 7,
1 to 500) soit une matrice par "Type"; aucun interet donc;



Tu veux faire un tableau pour chacun des Types que tu as créer ?
Peux-tu nous faire un bref survol de ces variables, de leur utilité et des
relations pouvant exister entre ces variables ?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/
Avatar
Charles
Je vais donc essayer d'être plus clair sur ma question;
J'ai fait un programme de calcul de flux nécessitant bcp
de tableaux à deux dimensions du type :

Dim tableau1 (1 to 7, 1 to 500) as double

Vu que j'en ai bcp (près de 200), j'aimerais les déclarer
et par la même les regrouper à l'intérieur de "Type" pour
faciliter l'utilisation et la modification du code. Par
exemple :

Type Categorie1
tableau1 (1 to 7, 1 to 500) as double
tableau2 (1 to 7, 1 to 500) as double
tableau3 (1 to 7, 1 to 500) as double
End Type

Public Cat1 as Categorie1

etc...avec plusieurs categories regroupant plusieurs
tableaux.

Problème: j'ai droit au message d'erreur
suivant : "Compile Error : Fixed or static data can't be
larger than 64k".

J'ai donc l'impression que le "Type" n'admet pas de
tableau de dimension importante. J'ai raté qqchose dans
les déclarations ou il faut procéder autrement pour
regrouper des tableaux dans des catégories?

Merci d'avance pour la réponse
Charles


-----Message d'origine-----
Salut Charles! :O)

la capacité des "Type" semble très limitée; Message
d'erreur "Compile Error : Fixed or static data can't be
larger than 64k".



euh.... quoi ?! :Oo

64k (65355 octets) c'est beaucoup plus qu'il n'en faut


pour représenté
n'importe quel "Objet"..


Mes matrices ont une taille de (1 to 7,
1 to 500) soit une matrice par "Type"; aucun interet




donc;

Tu veux faire un tableau pour chacun des Types que tu as


créer ?
Peux-tu nous faire un bref survol de ces variables, de


leur utilité et des
relations pouvant exister entre ces variables ?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/


.



Avatar
Zoury
Ok c'est plus clair.

Tes tableaux font 28000 octets chacun il est donc normal que tu dépasses la
capacité de ceux-ci.. Tu devras (comme tu l'as mentionné) utiliser des
classes.

Voici un exemple de ton Type sous forme de classe (ajoute un module de
classe à ton projet) :
'***
' CCategorie1 - Module de classe
Option Explicit

Private m_dTableau1(1 To 7, 1 To 500) As Double
Private m_dTableau2(1 To 7, 1 To 500) As Double
Private m_dTableau3(1 To 7, 1 To 500) As Double

Public Property Get Tableau1(ByRef x As Long, ByRef y As Long) As Double
Tableau1 = m_dTableau1(x, y)
End Property

Public Property Let Tableau1(ByRef x As Long, ByRef y As Long, ByRef dValue
As Double)
m_dTableau1(x, y) = dValue
End Property

Public Property Get Tableau2(ByRef x As Long, ByRef y As Long) As Double
Tableau2 = m_dTableau2(x, y)
End Property

Public Property Let Tableau2(ByRef x As Long, ByRef y As Long, ByRef dValue
As Double)
m_dTableau2(x, y) = dValue
End Property

Public Property Get Tableau3(ByRef x As Long, ByRef y As Long) As Double
Tableau3 = m_dTableau3(x, y)
End Property

Public Property Let Tableau3(ByRef x As Long, ByRef y As Long, ByRef dValue
As Double)
m_dTableau3(x, y) = dValue
End Property
'***

La classe s'utilise ainsi :
'***
Option Explicit

Private Sub Main()

Dim cat1 As CCategorie1
Set cat1 = New CCategorie1

cat1.Tableau1(3, 4) = 5#
Debug.Print cat1.Tableau1(3, 4)

End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/
Avatar
Charles
Génial merci;
Une question supplémentaire si je peux abuser : quand je
déclare les tableaux au niveaux des Property Get et
Property Let, je code ne marche pas si je déclare les
variables x et y comme Integer mais marche quand je les
declare comme Variant (ce qui n'est pas génial je crois en
terme d'occupation mémoire);

Merci Encore
Charles

-----Message d'origine-----
Ok c'est plus clair.

Tes tableaux font 28000 octets chacun il est donc normal


que tu dépasses la
capacité de ceux-ci.. Tu devras (comme tu l'as mentionné)


utiliser des
classes.

Voici un exemple de ton Type sous forme de classe (ajoute


un module de
classe à ton projet) :
'***
' CCategorie1 - Module de classe
Option Explicit

Private m_dTableau1(1 To 7, 1 To 500) As Double
Private m_dTableau2(1 To 7, 1 To 500) As Double
Private m_dTableau3(1 To 7, 1 To 500) As Double

Public Property Get Tableau1(ByRef x As Long, ByRef y As


Long) As Double
Tableau1 = m_dTableau1(x, y)
End Property

Public Property Let Tableau1(ByRef x As Long, ByRef y As


Long, ByRef dValue
As Double)
m_dTableau1(x, y) = dValue
End Property

Public Property Get Tableau2(ByRef x As Long, ByRef y As


Long) As Double
Tableau2 = m_dTableau2(x, y)
End Property

Public Property Let Tableau2(ByRef x As Long, ByRef y As


Long, ByRef dValue
As Double)
m_dTableau2(x, y) = dValue
End Property

Public Property Get Tableau3(ByRef x As Long, ByRef y As


Long) As Double
Tableau3 = m_dTableau3(x, y)
End Property

Public Property Let Tableau3(ByRef x As Long, ByRef y As


Long, ByRef dValue
As Double)
m_dTableau3(x, y) = dValue
End Property
'***

La classe s'utilise ainsi :
'***
Option Explicit

Private Sub Main()

Dim cat1 As CCategorie1
Set cat1 = New CCategorie1

cat1.Tableau1(3, 4) = 5#
Debug.Print cat1.Tableau1(3, 4)

End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/


.



Avatar
Zoury
> je code ne marche pas si je déclare les
variables x et y comme Integer mais marche quand je les
declare comme Variant (ce qui n'est pas génial je crois en
terme d'occupation mémoire);



Qu'entends-tu par "ne marche pas" ? Tu obtiens une erreur ?

j'ai essayé ceci et ça fonctionne :
'***
' CCategorie1 - Module de classe
Option Explicit

Private m_dTableau1(1 To 7, 1 To 500) As Double
Private m_dTableau2(1 To 7, 1 To 500) As Double
Private m_dTableau3(1 To 7, 1 To 500) As Double

Public Property Get Tableau1(ByRef x As Integer, ByRef y As Integer) As
Double
Tableau1 = m_dTableau1(x, y)
End Property

Public Property Let Tableau1(ByRef x As Integer, ByRef y As Integer, ByRef
dValue As Double)
m_dTableau1(x, y) = dValue
End Property

Public Property Get Tableau2(ByRef x As Integer, ByRef y As Integer) As
Double
Tableau2 = m_dTableau2(x, y)
End Property

Public Property Let Tableau2(ByRef x As Integer, ByRef y As Integer, ByRef
dValue As Double)
m_dTableau2(x, y) = dValue
End Property

Public Property Get Tableau3(ByRef x As Integer, ByRef y As Integer) As
Double
Tableau3 = m_dTableau3(x, y)
End Property

Public Property Let Tableau3(ByRef x As Integer, ByRef y As Integer, ByRef
dValue As Double)
m_dTableau3(x, y) = dValue
End Property
'***


Note que personnellement, je conserverais le type Long au lieu de Integer
étant que les systèmes actuels sont optimisé pour le 32 bits (processeur,
bus de données, etc..) cela évite des convertions inutiles d'un type à
l'autre étant donnée que le système utilise un format sur 32 bits de toute
façon..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/
Avatar
Charles
J'obtenais l'erreur suivante : "Compile error :ByRef
Argument type mismatch" mais entre temps je crois avoir
compris; je déclarais x et y au sein de ma Sub Main() et
non en publique d'où le mismatch...
Ceci dit, tu me conseilles de les déclarer As Long toutes
mes variables donc. Jusqu'à présent les indices de boucles
qui augmentent avec un pas de 1 je les déclarais en
Integer et toutes les autres variables en Double.
Merci
Charles
-----Message d'origine-----
je code ne marche pas si je déclare les
variables x et y comme Integer mais marche quand je les
declare comme Variant (ce qui n'est pas génial je crois




en
terme d'occupation mémoire);



Qu'entends-tu par "ne marche pas" ? Tu obtiens une


erreur ?

j'ai essayé ceci et ça fonctionne :
'***
' CCategorie1 - Module de classe
Option Explicit

Private m_dTableau1(1 To 7, 1 To 500) As Double
Private m_dTableau2(1 To 7, 1 To 500) As Double
Private m_dTableau3(1 To 7, 1 To 500) As Double

Public Property Get Tableau1(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau1 = m_dTableau1(x, y)
End Property

Public Property Let Tableau1(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau1(x, y) = dValue
End Property

Public Property Get Tableau2(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau2 = m_dTableau2(x, y)
End Property

Public Property Let Tableau2(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau2(x, y) = dValue
End Property

Public Property Get Tableau3(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau3 = m_dTableau3(x, y)
End Property

Public Property Let Tableau3(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau3(x, y) = dValue
End Property
'***


Note que personnellement, je conserverais le type Long au


lieu de Integer
étant que les systèmes actuels sont optimisé pour le 32


bits (processeur,
bus de données, etc..) cela évite des convertions


inutiles d'un type à
l'autre étant donnée que le système utilise un format sur


32 bits de toute
façon..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/


.



Avatar
Charles
Bien je crois avoir répondu comme un grand à toutes mes
questions.
Je m'en permet une autre :
Avant d'utiliser les modules de classes, j'initialisais
mes matrices de la façon suivante :
Dim Tableau1 (1 to 7) as double
Erase Tableau1

Comment faire maintenant pour initialiser cat1.tableau1?

La lisibilité du tableau est incroyablement améliorée avec
les matrices sous cette forme.
Merci Encore
Charles

-----Message d'origine-----
J'obtenais l'erreur suivante : "Compile error :ByRef
Argument type mismatch" mais entre temps je crois avoir
compris; je déclarais x et y au sein de ma Sub Main() et
non en publique d'où le mismatch...
Ceci dit, tu me conseilles de les déclarer As Long toutes
mes variables donc. Jusqu'à présent les indices de


boucles
qui augmentent avec un pas de 1 je les déclarais en
Integer et toutes les autres variables en Double.
Merci
Charles
-----Message d'origine-----
je code ne marche pas si je déclare les
variables x et y comme Integer mais marche quand je les
declare comme Variant (ce qui n'est pas génial je






crois
en
terme d'occupation mémoire);



Qu'entends-tu par "ne marche pas" ? Tu obtiens une


erreur ?

j'ai essayé ceci et ça fonctionne :
'***
' CCategorie1 - Module de classe
Option Explicit

Private m_dTableau1(1 To 7, 1 To 500) As Double
Private m_dTableau2(1 To 7, 1 To 500) As Double
Private m_dTableau3(1 To 7, 1 To 500) As Double

Public Property Get Tableau1(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau1 = m_dTableau1(x, y)
End Property

Public Property Let Tableau1(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau1(x, y) = dValue
End Property

Public Property Get Tableau2(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau2 = m_dTableau2(x, y)
End Property

Public Property Let Tableau2(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau2(x, y) = dValue
End Property

Public Property Get Tableau3(ByRef x As Integer, ByRef y


As Integer) As
Double
Tableau3 = m_dTableau3(x, y)
End Property

Public Property Let Tableau3(ByRef x As Integer, ByRef y


As Integer, ByRef
dValue As Double)
m_dTableau3(x, y) = dValue
End Property
'***


Note que personnellement, je conserverais le type Long




au
lieu de Integer
étant que les systèmes actuels sont optimisé pour le 32


bits (processeur,
bus de données, etc..) cela évite des convertions


inutiles d'un type à
l'autre étant donnée que le système utilise un format




sur
32 bits de toute
façon..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/


.



.



Avatar
François Picalausa
Hello,

Tu peux gérer l'initialisation des données dans l'événement Initialize de la
classe:
Private Sub Class_Initialize()
'Initialisation des données
Erase MonTableau
End Sub

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Charles" a écrit dans le message
de news:472f01c47fdb$47640880$
Avant d'utiliser les modules de classes, j'initialisais
mes matrices de la façon suivante :
Dim Tableau1 (1 to 7) as double
Erase Tableau1

Comment faire maintenant pour initialiser cat1.tableau1?


Avatar
Charles
Bonjour,
J'ai en fait besoin d'initialiser les matices à différents
moments de ma boucle compte tenu de sous boucles; j'ai
donc fait une sub initialise() où j'ai écris Erase
Tableau1 mais le programme me renvoie le message d'erreur
suivant : "Compile Error : Variable Not Defined" de même
lorsque j'écris Erase cat1.Tableau1?
Il y a une étape que je n'ai pas dû saisir!
Merci
Charles
-----Message d'origine-----
Hello,

Tu peux gérer l'initialisation des données dans


l'événement Initialize de la
classe:
Private Sub Class_Initialize()
'Initialisation des données
Erase MonTableau
End Sub

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Charles" a écrit


dans le message
de news:472f01c47fdb$47640880$
Avant d'utiliser les modules de classes, j'initialisais
mes matrices de la façon suivante :
Dim Tableau1 (1 to 7) as double
Erase Tableau1

Comment faire maintenant pour initialiser cat1.tableau1?




.



Avatar
Zoury
> Erase cat1.Tableau1?
Il y a une étape que je n'ai pas dû saisir!



yep.. ;O)

cat1.Tableau1 est propriété renvoyant un type Double qui prend deux
paramètres. Ça ne renvoit pas un tableau (Double()) mais ça permet de
travailler avec le tableau contenu dans la classe. Si tu veux pouvoir vidé
tes tableaux depuis l'exérieur de la classe, créer toi des méthodes pour y
parvenir :

Ex :
'***
' à ajouter dans la classe
Private Sub ClearTableau1()
Erase m_dTableau1
End Sub
Private Sub ClearTableau2()
Erase m_dTableau2
End Sub
Private Sub ClearTableau3()
Erase m_dTableau3
End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/
1 2