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

tableau de couple de valeur

10 réponses
Avatar
marc.dufresne
bonjour à tous
je veux manipuler les coordonnées des pixels d'un écran.
je voulais faire un tableau contenant 800*600 couple de coordonnées(x,y)
correspondant au position de chaque pixel!
epour après choisir aléatoirement un couple dans ce tableau, suprimer le
couple du tableau, redimensionner le tableau et ainsi de suite, pour ne pas
retrouver deux fois le même couple.
ce que je ne sais pas faire c'est comment affecter à chaque éléments de mon
tableau un couple (x,y)
dim position (0 to 800*600)
dim poX_posY(0 to800, 0 to 600)
là comment fait on ?? position(i)=x,y

je m'embrouille je ne sais plus comment m'y prendre
merci pour votre aide

10 réponses

Avatar
Jean-Marc
"marc.dufresne" a écrit dans le
message de news:4437cf9f$0$27084$
bonjour à tous
je veux manipuler les coordonnées des pixels d'un écran.
je voulais faire un tableau contenant 800*600 couple de


coordonnées(x,y)
correspondant au position de chaque pixel!
epour après choisir aléatoirement un couple dans ce tableau, suprimer


le
couple du tableau, redimensionner le tableau et ainsi de suite, pour


ne pas
retrouver deux fois le même couple.
ce que je ne sais pas faire c'est comment affecter à chaque éléments


de mon
tableau un couple (x,y)
dim position (0 to 800*600)
dim poX_posY(0 to800, 0 to 600)
là comment fait on ?? position(i)=x,y

je m'embrouille je ne sais plus comment m'y prendre
merci pour votre aide



Hello Marc,

Un problème amusant et classique.

Théorie
-------
Bon, l'idée va être de définir un table linéaire contenant le même
nombre d'éléments que de couples. Donc ici, il y a 800*600 couples donc
on va faire un tableau de cette taille, avec à chauqe position du
tableau un couple de coordonnées. Il faut faire un tableau dynamique
car on ne peut pas créer un tableau statique de plus de 64K.

Puis on fait une petite fonction qui initialise tout ça.

Pour l'utilisation, on va simplement faire en sorte qu'à chaque fois
qu'on demande une coordonnée, on réarrange le tableau en mettant à la
position ou on vient de prendre le couple le couple qui se trouve à la
position la plus haute. Puis on décrémente le nombre d'éléments
restants. Ainsi, c'est hyper rapide car on ne doit pas réarranger tout
le tableau, mais juste mettre à jour une position.


Pratique
--------

Mettre le code suivant dans un petit module (.bas)

' 8<-----------------------------------------------------------

Option Explicit

' Constantes pour le tableau
Public Const MAX_X As Long = 800
Public Const MAX_Y As Long = 600

' un type pour manipuler les couples de coordonnées
Type Tcoord
x As Long
y As Long
End Type

' on déclare notre structure
Type Tscreen
tablo() As Tcoord ' on dimensionnera plus tard
nbElem As Long ' éléments disponibles
End Type

' et enfin notre structure
Private myScreen As Tscreen

'
' Initialisation de la structure
'
Public Function ResetTablo() As Boolean
Dim i As Long, j As Long
Dim nbElem As Long

' on dimensionne le tableau
ReDim myScreen.tablo((MAX_X) * (MAX_Y))

' et à chaque position, on met un
' couple de coordonnées
For i = 0 To MAX_X - 1
For j = 0 To MAX_Y - 1
nbElem = nbElem + 1
myScreen.tablo(nbElem).x = i
myScreen.tablo(nbElem).y = j
Next j
Next i
' le nombre d'éléments au départ est de MAX_X * MAX_Y
myScreen.nbElem = nbElem
' initialisation du générateur pseudo aléatoire
Randomize (Timer)
ResetTablo = True
End Function

'
' La fonction retourne un couple de coordonnées
' et met à jour le tableau
Public Function GetAleaGetCoord(ByVal x, ByVal y) As Boolean
Dim n As Long
Dim p As Long

' on récupère le nombre total d'éléments
p = myScreen.nbElem
' si il en reste
If p >= 0 Then
n = Int(Rnd * p) ' entre 0 et MAX_X * MAX_Y
' retour des coordonnées
x = myScreen.tablo(n).x
y = myScreen.tablo(n).y

If n <> p Then ' on met à jour si nécessaire
myScreen.tablo(n).x = myScreen.tablo(p).x
myScreen.tablo(n).y = myScreen.tablo(p).y
End If
' dans tous les cas on décrémente
myScreen.nbElem = myScreen.nbElem - 1
' et on retourne true
GetAleaGetCoord = True
End If
End Function

' 8<-----------------------------------------------------------

Pour l'utilisation, rien de plus facile.

1) on initialise:

' 8<-----------------------------------------------------------
Dim r As Boolean

r = ResetTablo()
' 8<-----------------------------------------------------------

2) on demande des coordonnées. Dans cet exemple, on demande
le maximum

la fonction retourne vrai si des coordonnées ont pu être retournées
sinon elle retourne faux (il faut alors réinitilaiser).


' 8<-----------------------------------------------------------
Dim n As Long
Dim x As Long, y As Long
Dim r As Boolean


For n = 0 To MAX_X * MAX_Y
r = GetAleaGetCoord(x, y)
If r Then
' on peut utiliser les coordonnées
' note, ici r sera toujours vrai
End If
Next n
'si on faisait un appel ici,
'la fonction retournerait faux: on a deja
'demandé toutes les coordonnées possibles

' 8<-----------------------------------------------------------


Conclusions
-----------
Cette méthode n'a que des avantages: elle est est simple et très
rapide car on ne doit pas trier ou réorganiser le tableau à
chaque appel.

Bonne prog!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
Oups j'ai oublié de typer les arguments de ma fonction.
Il faut lire bien sur:


Public Function GetAleaGetCoord(ByVal x As Long, ByVal y As Long) As
Boolean

le lecteur aura corrigé de lui même :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
ARGH !!!

J'étais pas en forme hier!!
C'ets bien sur Byref qu'il faut passer les arguments à
la fonction:

Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long) As
Boolean


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
Avatar
marc.dufresne
bonjour
super sympa !!!
c'est bien ce que je voulais, je ne pensais ni ne savais créer un type pour
trouver ce fameux couple

mille merci


"Jean-Marc" a écrit dans le message de news:
4438ca0f$0$30253$
ARGH !!!

J'étais pas en forme hier!!
C'ets bien sur Byref qu'il faut passer les arguments à
la fonction:

Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long) As
Boolean


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org



Avatar
Jean-Marc
De rien :-)
Bonne journée!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"marc.dufresne" a écrit dans le
message de news:4439713b$0$27274$
bonjour
super sympa !!!
c'est bien ce que je voulais, je ne pensais ni ne savais créer un type


pour
trouver ce fameux couple

mille merci


"Jean-Marc" a écrit dans le message de


news:
4438ca0f$0$30253$
> ARGH !!!
>
> J'étais pas en forme hier!!
> C'ets bien sur Byref qu'il faut passer les arguments à
> la fonction:
>
> Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long) As
> Boolean
>
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>




Avatar
Patrice Henrio
Bonjour Jean-marc.
Tu es sûr qu'on ne peut pas créer un tableau non dynamique de plus de 64 K ?
Je viens de faire quelque chose du même genre que Marc pour une résolution
de labyrinthe et mon tableau est déclaré sans broncher 1230*850 en long.
Pb de version ?

A plus
"Jean-Marc" a écrit dans le message de news:
4439eb37$0$13558$
De rien :-)
Bonne journée!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"marc.dufresne" a écrit dans le
message de news:4439713b$0$27274$
bonjour
super sympa !!!
c'est bien ce que je voulais, je ne pensais ni ne savais créer un type


pour
trouver ce fameux couple

mille merci


"Jean-Marc" a écrit dans le message de


news:
4438ca0f$0$30253$
> ARGH !!!
>
> J'étais pas en forme hier!!
> C'ets bien sur Byref qu'il faut passer les arguments à
> la fonction:
>
> Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long) As
> Boolean
>
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>







Avatar
Jean-marc
Hello Patrice,

de fait, je suis incapable de reproduire ceci sur une autre machine,
pourtant j'ai eu l'erreur chez moi et du coup, j'ai regardé la doc et
j'ai bien trouvé une référence à cette limite de 64KB, mais je ne peux pas
reproduire.
Je regarderais ce soir :-)

--
Jean-marc


"Patrice Henrio" wrote in message
news:
Bonjour Jean-marc.
Tu es sûr qu'on ne peut pas créer un tableau non dynamique de plus de 64 K


?
Je viens de faire quelque chose du même genre que Marc pour une résolution
de labyrinthe et mon tableau est déclaré sans broncher 1230*850 en long.
Pb de version ?

A plus
"Jean-Marc" a écrit dans le message de


news:
4439eb37$0$13558$
> De rien :-)
> Bonne journée!
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>
> "marc.dufresne" a écrit dans le
> message de news:4439713b$0$27274$
>> bonjour
>> super sympa !!!
>> c'est bien ce que je voulais, je ne pensais ni ne savais créer un type
> pour
>> trouver ce fameux couple
>>
>> mille merci
>>
>>
>> "Jean-Marc" a écrit dans le message de
> news:
>> 4438ca0f$0$30253$
>> > ARGH !!!
>> >
>> > J'étais pas en forme hier!!
>> > C'ets bien sur Byref qu'il faut passer les arguments à
>> > la fonction:
>> >
>> > Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long) As
>> > Boolean
>> >
>> >
>> > --
>> > Jean-marc
>> > Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>> >
>>
>>
>




Avatar
Jean-Marc
Hello Patrice,

j'ai retrouvé comment on produit l'erreur:

Dans un module:

Type Tscreen
tablo(480000) As Tcoord
nbElem As Long ' éléments disponibles
End Type

Si tu compiles ceci, tu auras le message:
"Fixed or Static data cab't be larger than 64K"

Si tu cliques sur le bouton "Aide", tu auras l'explication complète,
mais en substance la raison est qu'un user defined type ne peut pas
avoir une taille plus grande que 64K.

Tout cela dépend si on est dans un module, si c'est privé ou
publique, etc.

Mais bref, la limite est bien la, d'où le Redim et ma
remarque sur les 64K.

Bonne soirée!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"Patrice Henrio" a écrit dans le message de
news:
Bonjour Jean-marc.
Tu es sûr qu'on ne peut pas créer un tableau non dynamique de plus de


64 K ?
Je viens de faire quelque chose du même genre que Marc pour une


résolution
de labyrinthe et mon tableau est déclaré sans broncher 1230*850 en


long.
Pb de version ?

A plus
"Jean-Marc" a écrit dans le message de


news:
4439eb37$0$13558$
> De rien :-)
> Bonne journée!
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>
> "marc.dufresne" a écrit


dans le
> message de news:4439713b$0$27274$
>> bonjour
>> super sympa !!!
>> c'est bien ce que je voulais, je ne pensais ni ne savais créer un


type
> pour
>> trouver ce fameux couple
>>
>> mille merci
>>
>>
>> "Jean-Marc" a écrit dans le message


de
> news:
>> 4438ca0f$0$30253$
>> > ARGH !!!
>> >
>> > J'étais pas en forme hier!!
>> > C'ets bien sur Byref qu'il faut passer les arguments à
>> > la fonction:
>> >
>> > Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long)


As
>> > Boolean
>> >
>> >
>> > --
>> > Jean-marc
>> > Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>> >
>>
>>
>




Avatar
Jean-Marc
Oui tout à fait, ma remarque n'était pas très adaptée.
Ce n'est pas le tableau qui est en cause mais le type
utilisateur.

Merci pour ces précisions :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"Patrice Henrio" a écrit dans le message de
news:
Donc cela ne concerne pas directement les tableaux mais les types
utilisateurs dont le total cumulé des données ne doit pas dépasser 64


K : un
type avec trois tableaux de 25 K serait tout autant refusé. Par contre


je te
confirme qu'un tableau statique peut faire plus de 64 K.


A plus


"Jean-Marc" a écrit dans le message de


news:
443e8b4d$0$16257$
> Hello Patrice,
>
> j'ai retrouvé comment on produit l'erreur:
>
> Dans un module:
>
> Type Tscreen
> tablo(480000) As Tcoord
> nbElem As Long ' éléments disponibles
> End Type
>
> Si tu compiles ceci, tu auras le message:
> "Fixed or Static data cab't be larger than 64K"
>
> Si tu cliques sur le bouton "Aide", tu auras l'explication complète,
> mais en substance la raison est qu'un user defined type ne peut pas
> avoir une taille plus grande que 64K.
>
> Tout cela dépend si on est dans un module, si c'est privé ou
> publique, etc.
>
> Mais bref, la limite est bien la, d'où le Redim et ma
> remarque sur les 64K.
>
> Bonne soirée!
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>
> "Patrice Henrio" a écrit dans le


message de
> news:
>> Bonjour Jean-marc.
>> Tu es sûr qu'on ne peut pas créer un tableau non dynamique de plus


de
> 64 K ?
>> Je viens de faire quelque chose du même genre que Marc pour une
> résolution
>> de labyrinthe et mon tableau est déclaré sans broncher 1230*850 en
> long.
>> Pb de version ?
>>
>> A plus
>> "Jean-Marc" a écrit dans le message


de
> news:
>> 4439eb37$0$13558$
>> > De rien :-)
>> > Bonne journée!
>> >
>> > --
>> > Jean-marc
>> > Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>> > "There are only 10 kind of people
>> > those who understand binary and those who don't."
>> > mailto: remove '_no_spam_' ;
>> >
>> >
>> > "marc.dufresne" a écrit
> dans le
>> > message de news:4439713b$0$27274$
>> >> bonjour
>> >> super sympa !!!
>> >> c'est bien ce que je voulais, je ne pensais ni ne savais créer


un
> type
>> > pour
>> >> trouver ce fameux couple
>> >>
>> >> mille merci
>> >>
>> >>
>> >> "Jean-Marc" a écrit dans le


message
> de
>> > news:
>> >> 4438ca0f$0$30253$
>> >> > ARGH !!!
>> >> >
>> >> > J'étais pas en forme hier!!
>> >> > C'ets bien sur Byref qu'il faut passer les arguments à
>> >> > la fonction:
>> >> >
>> >> > Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As


Long)
> As
>> >> > Boolean
>> >> >
>> >> >
>> >> > --
>> >> > Jean-marc
>> >> > Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>> >> >
>> >>
>> >>
>> >
>>
>>
>




Avatar
Patrice Henrio
Donc cela ne concerne pas directement les tableaux mais les types
utilisateurs dont le total cumulé des données ne doit pas dépasser 64 K : un
type avec trois tableaux de 25 K serait tout autant refusé. Par contre je te
confirme qu'un tableau statique peut faire plus de 64 K.


A plus


"Jean-Marc" a écrit dans le message de news:
443e8b4d$0$16257$
Hello Patrice,

j'ai retrouvé comment on produit l'erreur:

Dans un module:

Type Tscreen
tablo(480000) As Tcoord
nbElem As Long ' éléments disponibles
End Type

Si tu compiles ceci, tu auras le message:
"Fixed or Static data cab't be larger than 64K"

Si tu cliques sur le bouton "Aide", tu auras l'explication complète,
mais en substance la raison est qu'un user defined type ne peut pas
avoir une taille plus grande que 64K.

Tout cela dépend si on est dans un module, si c'est privé ou
publique, etc.

Mais bref, la limite est bien la, d'où le Redim et ma
remarque sur les 64K.

Bonne soirée!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;


"Patrice Henrio" a écrit dans le message de
news:
Bonjour Jean-marc.
Tu es sûr qu'on ne peut pas créer un tableau non dynamique de plus de


64 K ?
Je viens de faire quelque chose du même genre que Marc pour une


résolution
de labyrinthe et mon tableau est déclaré sans broncher 1230*850 en


long.
Pb de version ?

A plus
"Jean-Marc" a écrit dans le message de


news:
4439eb37$0$13558$
> De rien :-)
> Bonne journée!
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>
> "marc.dufresne" a écrit


dans le
> message de news:4439713b$0$27274$
>> bonjour
>> super sympa !!!
>> c'est bien ce que je voulais, je ne pensais ni ne savais créer un


type
> pour
>> trouver ce fameux couple
>>
>> mille merci
>>
>>
>> "Jean-Marc" a écrit dans le message


de
> news:
>> 4438ca0f$0$30253$
>> > ARGH !!!
>> >
>> > J'étais pas en forme hier!!
>> > C'ets bien sur Byref qu'il faut passer les arguments à
>> > la fonction:
>> >
>> > Public Function GetAleaGetCoord(ByRef x As Long, ByRef y As Long)


As
>> > Boolean
>> >
>> >
>> > --
>> > Jean-marc
>> > Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
>> >
>>
>>
>