Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Entrer un tableau en constante sur embedded VB

12 réponses
Avatar
Gabacho
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.

10 réponses

1 2
Avatar
Patrice Henrio
Dim table As Variant

table = Array(Array(1, 2, 3,4), Array(11,12,13,14))

Inconvénient de cette méthode, table est un variant, ainsi que chacun de ses
éléments : gestion plus longue avec transtypage
Avantage de cette méthode , table est un variant, ainsi que chacun de ses
éléments : chaque élément peut être d'un type différent, cela se traduira
par un variant

"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.



Avatar
X
Bonjour,

' déclaration en tête de form (global)
Option Explicit
Dim table(600, 150)

' OU

Dim table(600, 150) As mettre_le_type_de_variable

' utilisation
x = table(y, z)
table(y, z) = x
' on abandonne ainsi (0,0) (0,1) (1,0) ce qui permet de commencer à (1,1)
et d'éviter les erreurs...

--
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.



Avatar
Patrice Henrio
Pour commencer les tableaux à 1 : option base 1

Comme dit précédemment
Dim table(600,150), non seulement utilisera en mémoire 600*150*2 si le type
des éléments de table est integer 180000 octets
De plus les éléments seront par défaut numérotés de 0 à 599 et de 0 à 149.

Par ailleurs cela ne répond pas directement à la question posée : entrer en
une seule fois le tableau sans faire un parcours.


"X" a écrit dans le message de news:
u0%
Bonjour,

' déclaration en tête de form (global)
Option Explicit
Dim table(600, 150)

' OU

Dim table(600, 150) As mettre_le_type_de_variable

' utilisation
x = table(y, z)
table(y, z) = x
' on abandonne ainsi (0,0) (0,1) (1,0) ce qui permet de commencer à (1,1)
et d'éviter les erreurs...

--
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.







Avatar
X
La place c'est relatif : 180.000 o = 180ko / 512 Mo... bof... même si le
système en prend une partie...
(600) = 0 à 599, oui, désolé -> (1 to 600)...
Pour les variables (constantes), faudra bien entrer les valeurs, moi
j'aurais mis une boucle, car 150x600 ça devrait aller vite, mais c'est
possible que je n'aie pas compris la question :o)

--
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Patrice Henrio" a écrit dans le message de
news: %
Pour commencer les tableaux à 1 : option base 1

Comme dit précédemment
Dim table(600,150), non seulement utilisera en mémoire 600*150*2 si le
type des éléments de table est integer 180000 octets
De plus les éléments seront par défaut numérotés de 0 à 599 et de 0 à 149.

Par ailleurs cela ne répond pas directement à la question posée : entrer
en une seule fois le tableau sans faire un parcours.


"X" a écrit dans le message de news:
u0%
Bonjour,

' déclaration en tête de form (global)
Option Explicit
Dim table(600, 150)

' OU

Dim table(600, 150) As mettre_le_type_de_variable

' utilisation
x = table(y, z)
table(y, z) = x
' on abandonne ainsi (0,0) (0,1) (1,0) ce qui permet de commencer à (1,1)
et d'éviter les erreurs...

--
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.











Avatar
Gabacho
Bonjour,

merci pour vos réponses, je teste cela ce soir.
Effectivement, je souhaite mettre des données d'un fichier plat contenant
des tables
de mortalite en debut de code et eviter un acces à un fichier texte.
Pour le passage en variant, elle me permettra effectivement de placer en
début de ligne (table (i,0))le nom de la table en texte et les données dans
les autres (table(i,j)).

Encore merci à vous.



"Patrice Henrio" a écrit :

Pour commencer les tableaux à 1 : option base 1

Comme dit précédemment
Dim table(600,150), non seulement utilisera en mémoire 600*150*2 si le type
des éléments de table est integer 180000 octets
De plus les éléments seront par défaut numérotés de 0 à 599 et de 0 à 149.

Par ailleurs cela ne répond pas directement à la question posée : entrer en
une seule fois le tableau sans faire un parcours.


"X" a écrit dans le message de news:
u0%
> Bonjour,
>
> ' déclaration en tête de form (global)
> Option Explicit
> Dim table(600, 150)
>
> ' OU
>
> Dim table(600, 150) As mettre_le_type_de_variable
>
> ' utilisation
> x = table(y, z)
> table(y, z) = x
> ' on abandonne ainsi (0,0) (0,1) (1,0) ce qui permet de commencer à (1,1)
> et d'éviter les erreurs...
>
> --
> Site logiciels
> http://irolog.free.fr
> Mail
> http://irolog.free.fr/ecrire/index.htm
> Site perso
> http://irolog.free.fr/joe/index.htm
> Principe d'utilisation des news Groups
> http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
> ------------------------------------------------------------------------------------
> "Gabacho" a écrit dans le message de
> news:
>> Bonjour,
>>
>> je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
>> comme
>> constante ou comme variable globale du type :
>> dim Table(2,4)
>> Table=((1,2,3,4),(11,12,13,14))
>> Est-ce possible? Et si oui comment?
>> La matrice serait de dimension 600,150.
>> Merci par avance pour votre aide à cette question de débutant.
>>
>
>





Avatar
jm
"Gabacho" wrote in message
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.



Hello,

as tu une raison valable (VRAIMENT valable) de vouloir inclure en dur
dans ton code un tableau de 90.000 valeurs?

Y a t'il un obstacle qui t'empêcherait de charger ces valeurs depuis un
fichier de configuration?

Parce que ce qui est sur, c'est que ce serait franchement mieux, du point de
vue de la conception comme du point de vue de l'utilisation, amha...

Une petite fonction toute bête pourrait faire le chargement lors de l'init.

Le fichier contenant les valeurs pourrait avoir cette tête:
5,4
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20

La première ligne contient les dimensions (5 * 4) puis viennent les données.

Ensuite, une petite fonction lit ce fichier et rempli ton tableau:

Private Function FillFromConfig(ByRef t() As Integer, _
ByVal configFile As String, _
ByRef errS As String) As Boolean
Dim f As Integer
Dim col As Long
Dim lig As Long
Dim nlig As Long
Dim v() As String
Dim s As String
Dim i As Integer

On Error GoTo FillFromConfig_ERR

FillFromConfig = True
errS = ""
f = FreeFile
Open configFile For Input As #f
Input #f, col, lig
ReDim t(col, lig)
While Not EOF(f)
Line Input #f, s
If s <> "" Then
nlig = nlig + 1
v() = Split(s, ",")
If (UBound(v()) + 1) <> col Then
errS = "nombre de valeurs incorrectes ligne " & nlig
FillFromConfig = False
Exit Function
Else
For i = LBound(v()) To UBound(v())
t(1 + i, nlig) = v(i)
Next i
End If
End If
Wend
Close #f
If lig <> nlig Then
errS = "nombre de ligne incorrect. Trouvé:" & nlig & " attendu: " &
lig
FillFromConfig = False
End If

FillFromConfig_END:
Exit Function

FillFromConfig_ERR:
errS = Err.Description
FillFromConfig = False
Resume FillFromConfig_END
End Function

Il n'y aplus qu'à l'appeler, comme ceci par exemple:


Private Sub Command1_Click()
Dim t() As Integer
Dim r As Boolean
Dim errS As String

r = FillFromConfig(t(), "c:constants.txt", errS)
If Not r Then
MsgBox "erreur lors du chargement: " & errS
Else
MsgBox "tout va bien"
End If
End Sub

C'est quand même plus propre je pense...

--
jean-marc
Avatar
Patrice Henrio
Pardon à X pour le mail précédent je n'avais pas lu que le tableau de départ
devait faire 600 par 150, dans ce cas il est clair que l'utilisation de
Array n'est pas conseillé. Par contre la remarque sur option base reste
valide.


Une autre solution si tous les éléments sont de même types.

Créer le tableau une fois, le sauvegarder sous forme d'un fichier binaire,
le relire ensuite en une fois (gain de temps)


Option base 1
Public T(600,150) 'c'est une variable globale, ce qui n'est pas le cas de
dim

'Le module de création du fichier
T=CréerTableau()

Ecriture
Open Fichier for binary as #1
put T
Close #1

'Le module de lecture
Lecture
Open Fichier for binary a #1
get T
Close


Pour pouvoir en dire plus, il serait préférable de savoir ce que tu mets
dans ton tableau (les premiers éléments des premières lignes qui
indiqueraient la logique de construction du tableau).



"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.



Avatar
Gabacho
Bonjour,

l'inclusion d'un fichier me pose un problème pour un programme prévu pour
pocketpc, car je ne suis pas trop comment gérer le package programme plus
fichier text...
Et je prefererais avoir tout dans le fichier de code pour ainsi éviter de
disperser les éléments et faciliter la copie vers un autre ppc et également
pour éviter les modifs involontaire du fichier
Mais la suggestion est effectivement très bonne et avec le code proposé, je
vais
essayé de cette manière.
C'est effectivement plus propre et facilite la maintenance en cas de
changement du fichier de données (ajout de nouvelles données,
remplacement,...)

Merci pour vos conseils.

"jm" a écrit :

"Gabacho" wrote in message
news:
> Bonjour,
>
> je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
> comme
> constante ou comme variable globale du type :
> dim Table(2,4)
> Table=((1,2,3,4),(11,12,13,14))
> Est-ce possible? Et si oui comment?
> La matrice serait de dimension 600,150.
> Merci par avance pour votre aide à cette question de débutant.

Hello,

as tu une raison valable (VRAIMENT valable) de vouloir inclure en dur
dans ton code un tableau de 90.000 valeurs?

Y a t'il un obstacle qui t'empêcherait de charger ces valeurs depuis un
fichier de configuration?

Parce que ce qui est sur, c'est que ce serait franchement mieux, du point de
vue de la conception comme du point de vue de l'utilisation, amha...

Une petite fonction toute bête pourrait faire le chargement lors de l'init.

Le fichier contenant les valeurs pourrait avoir cette tête:
5,4
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20

La première ligne contient les dimensions (5 * 4) puis viennent les données.

Ensuite, une petite fonction lit ce fichier et rempli ton tableau:

Private Function FillFromConfig(ByRef t() As Integer, _
ByVal configFile As String, _
ByRef errS As String) As Boolean
Dim f As Integer
Dim col As Long
Dim lig As Long
Dim nlig As Long
Dim v() As String
Dim s As String
Dim i As Integer

On Error GoTo FillFromConfig_ERR

FillFromConfig = True
errS = ""
f = FreeFile
Open configFile For Input As #f
Input #f, col, lig
ReDim t(col, lig)
While Not EOF(f)
Line Input #f, s
If s <> "" Then
nlig = nlig + 1
v() = Split(s, ",")
If (UBound(v()) + 1) <> col Then
errS = "nombre de valeurs incorrectes ligne " & nlig
FillFromConfig = False
Exit Function
Else
For i = LBound(v()) To UBound(v())
t(1 + i, nlig) = v(i)
Next i
End If
End If
Wend
Close #f
If lig <> nlig Then
errS = "nombre de ligne incorrect. Trouvé:" & nlig & " attendu: " &
lig
FillFromConfig = False
End If

FillFromConfig_END:
Exit Function

FillFromConfig_ERR:
errS = Err.Description
FillFromConfig = False
Resume FillFromConfig_END
End Function

Il n'y aplus qu'à l'appeler, comme ceci par exemple:


Private Sub Command1_Click()
Dim t() As Integer
Dim r As Boolean
Dim errS As String

r = FillFromConfig(t(), "c:constants.txt", errS)
If Not r Then
MsgBox "erreur lors du chargement: " & errS
Else
MsgBox "tout va bien"
End If
End Sub

C'est quand même plus propre je pense...

--
jean-marc





Avatar
Gabacho
Pour le fichier à inclure idéalement ce serait :
"x" 0 1 .... 130
"TH1880" 100000 99999 99998 .... 0
"TH1881" 100000 99999 99997 .... 0

comme ca sur environ 500 lignes.
C'est pour mettre des tables de mortalités pour des calculs de survie en
fonction des différentes tables existantes (100 par sexe France, 100 par sexe
Espagne et environ 150 de tables autres)



"Patrice Henrio" a écrit :

Pardon à X pour le mail précédent je n'avais pas lu que le tableau de départ
devait faire 600 par 150, dans ce cas il est clair que l'utilisation de
Array n'est pas conseillé. Par contre la remarque sur option base reste
valide.


Une autre solution si tous les éléments sont de même types.

Créer le tableau une fois, le sauvegarder sous forme d'un fichier binaire,
le relire ensuite en une fois (gain de temps)


Option base 1
Public T(600,150) 'c'est une variable globale, ce qui n'est pas le cas de
dim

'Le module de création du fichier
T=CréerTableau()

Ecriture
Open Fichier for binary as #1
put T
Close #1

'Le module de lecture
Lecture
Open Fichier for binary a #1
get T
Close


Pour pouvoir en dire plus, il serait préférable de savoir ce que tu mets
dans ton tableau (les premiers éléments des premières lignes qui
indiqueraient la logique de construction du tableau).



"Gabacho" a écrit dans le message de
news:
> Bonjour,
>
> je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
> comme
> constante ou comme variable globale du type :
> dim Table(2,4)
> Table=((1,2,3,4),(11,12,13,14))
> Est-ce possible? Et si oui comment?
> La matrice serait de dimension 600,150.
> Merci par avance pour votre aide à cette question de débutant.
>





Avatar
X
Heu... de mémoire:

"Public" n'accepte pas les tableaux me semble-t-il...

"Dim" déclaré en début de code est bien globale (pour toute la feuille), a
contrario de celle déclarées dans les procédures qui sont locales, et aussi
a contrario de Public (en-entête), qui est une variable (générale), elle est
acceptée dans toutes les feuilles, comme les modules, si ce n'est qu'il faut
y adjoindre le nom de sa form d'origine (formX.nom_variable_public)...

--
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Patrice Henrio" a écrit dans le message de
news: uZyb%
Pardon à X pour le mail précédent je n'avais pas lu que le tableau de
départ devait faire 600 par 150, dans ce cas il est clair que
l'utilisation de Array n'est pas conseillé. Par contre la remarque sur
option base reste valide.


Une autre solution si tous les éléments sont de même types.

Créer le tableau une fois, le sauvegarder sous forme d'un fichier binaire,
le relire ensuite en une fois (gain de temps)


Option base 1
Public T(600,150) 'c'est une variable globale, ce qui n'est pas le cas de
dim

'Le module de création du fichier
T=CréerTableau()

Ecriture
Open Fichier for binary as #1
put T
Close #1

'Le module de lecture
Lecture
Open Fichier for binary a #1
get T
Close


Pour pouvoir en dire plus, il serait préférable de savoir ce que tu mets
dans ton tableau (les premiers éléments des premières lignes qui
indiqueraient la logique de construction du tableau).



"Gabacho" a écrit dans le message de
news:
Bonjour,

je souhaiterais pouvoir entrer dans mon code un tableau à 2 dimensions
comme
constante ou comme variable globale du type :
dim Table(2,4)
Table=((1,2,3,4),(11,12,13,14))
Est-ce possible? Et si oui comment?
La matrice serait de dimension 600,150.
Merci par avance pour votre aide à cette question de débutant.







1 2