Page 1 sur 1

Tableau et Addition

Publié : ven. 24/juil./2009 11:40
par Ganagyre
Bonjour.

J'utilise un tableau pour stoker des valeur "binaire" soit 0 ou 1 .

De ce tableau, je fais ensuite la somme de certaines colonnes, et je stoke le resultat dans la premiere colonne du tableau / TBL(0,lignes).

Code : Tout sélectionner

Dim TBL.l(100,10000)

;  Remplissage avec des valeurs aléatoires 0 ou 1

For col = 1 To 100
  For lignes = 1 To 10000
  
  TBL( col,lignes) = Random(1)+0

  Next lignes
Next col


; Adition de Colonnes

For i = 1 To 10000

  TBL(0,i) = TBL(10,i) + TBL(12,i) + TBL(20,i) + TBL(100,i) 

Debug  TBL(0,i) 

Next i

Au lieu de passer par une boucle , "nombre de lignes" pour faire l'adition, n'y aurait'il pas une méthode se rapprochant d"un CopyMemory .

Style :

TBL(0) = AddMemory(TBL(x))+AddMemory(TBL(y))+AddMemory(TBL(z)).

Publié : ven. 24/juil./2009 12:50
par Backup
pourquoi fait tu ,

Code : Tout sélectionner

Random(1)+0 
alors que

Code : Tout sélectionner

Random(1)
fait la meme chose ;)

tu n'ira pas plus vite a mon avis en utilisant Dieu sait quel methode avec la Memoire :)


la lenteur viens de ton affichage par Debug !!

mais sans débug , ça va super vite :)

Publié : ven. 24/juil./2009 14:46
par Anonyme
Au lieu de passer par une boucle , "nombre de lignes" pour faire l'adition, n'y aurait'il pas une méthode se rapprochant d"un CopyMemory
non , car la mémoire n'est pas contigüe , cela t'oblige a passer par une boucle.

Publié : ven. 24/juil./2009 22:08
par lionel_om
Cpl.Bator a écrit :
Au lieu de passer par une boucle , "nombre de lignes" pour faire l'adition, n'y aurait'il pas une méthode se rapprochant d"un CopyMemory
non , car la mémoire n'est pas contigüe , cela t'oblige a passer par une boucle.
Ah bon ?!

Code : Tout sélectionner

Dim A.b(3,3)

*ptr.Long = @A(0,0)
*ptr\l = $04030201 : *ptr + 4
*ptr\l = $08070605 : *ptr + 4
*ptr\l = $0C0B0A09 : *ptr + 4
*ptr\l = $100F0E0D : *ptr + 4

For i = 0 To 3
  For j = 0 To 3
    Debug A(i,j)
  Next
Next
/Liå

Publié : ven. 24/juil./2009 22:48
par Anonyme
Ah bon ?!
Ba si !

Code : Tout sélectionner

Dim TBL.l(100,10000)

;  Remplissage avec des valeurs aléatoires 0 ou 1

For col = 1 To 100
  For lignes = 1 To 10000
   TBL( col,lignes) = Random(1)+0
  Next lignes
Next col

If @TBL(10,1)-@TBL(11,1)<>4
  Debug "pas contigue"
  Debug "Adresse (10,1) = "+Str(@TBL(10,1))
  Debug "Adresse (11,1) = "+Str(@TBL(11,1))
  Debug "Différence     = "+Str(  @TBL(11,1) - @TBL(10,1) )
EndIf 
je parlais de ces données. pas de l'organisation des tableaux en général.

Publié : sam. 25/juil./2009 8:08
par lionel_om
Cpl.Bator a écrit :
Ah bon ?!
Ba si !
Grosse Erreur: quand tu déclare un tableau de 100 * 100, tu déclare en fait un tableau de 101 * 101 !!!
Elle est là la différence...

Ou sinon c'est qu'il y a quiproquo, mais regarde mon exemple. Je rempli une zone de 16 octets et je boucle dessus avec une double boucle For...

Y'avait des post y'a longtemps pour comment en savoir plus sur les tableaux: il fallait regarder avant l'adresse mémoire du début du tableau (avant @Tableau(0,[0]) ). Et on pouvait récupérer la taille du tableau, mais c'était en version PB 3.9x et je ne sais pas si c'est encore possible...

Pour ton exemple, tu as fait une erreur:

Code : Tout sélectionner

Dim TBL.l(100,100000)

;  Remplissage avec des valeurs aléatoires 0 ou 1

For col = 0 To 100
  For lignes = 0 To 10000
    TBL( col,lignes) = Random(1)+0
  Next lignes
Next col

If @TBL(10,1)-@TBL(10,0)<>4
  Debug "pas contigue"
  Debug "Adresse (10,0) = "+Str(@TBL(10,0))
  Debug "Adresse (10,1) = "+Str(@TBL(10,1))
  Debug "Différence     = "+Str(  @TBL(10,0) - @TBL(10,1) )
Else
  Debug "contigue"
EndIf

Debug "Adresse (10,0) = "+Str(@TBL(10,0))
Debug "Adresse (10,1) = "+Str(@TBL(10,1))
Debug "Adresse (10,2) = "+Str(@TBL(10,2))

/Liå :wink:

Publié : sam. 25/juil./2009 11:25
par Anonyme
lionel_om a écrit :
Cpl.Bator a écrit :
Ah bon ?!
Ba si !
Grosse Erreur: quand tu déclare un tableau de 100 * 100, tu déclare en fait un tableau de 101 * 101 !!!
Elle est là la différence...

Ou sinon c'est qu'il y a quiproquo, mais regarde mon exemple. Je rempli une zone de 16 octets et je boucle dessus avec une double boucle For...

Y'avait des post y'a longtemps pour comment en savoir plus sur les tableaux: il fallait regarder avant l'adresse mémoire du début du tableau (avant @Tableau(0,[0]) ). Et on pouvait récupérer la taille du tableau, mais c'était en version PB 3.9x et je ne sais pas si c'est encore possible...

Pour ton exemple, tu as fait une erreur:

Code : Tout sélectionner

Dim TBL.l(100,100000)

;  Remplissage avec des valeurs aléatoires 0 ou 1

For col = 0 To 100
  For lignes = 0 To 10000
    TBL( col,lignes) = Random(1)+0
  Next lignes
Next col

If @TBL(10,1)-@TBL(10,0)<>4
  Debug "pas contigue"
  Debug "Adresse (10,0) = "+Str(@TBL(10,0))
  Debug "Adresse (10,1) = "+Str(@TBL(10,1))
  Debug "Différence     = "+Str(  @TBL(10,0) - @TBL(10,1) )
Else
  Debug "contigue"
EndIf

Debug "Adresse (10,0) = "+Str(@TBL(10,0))
Debug "Adresse (10,1) = "+Str(@TBL(10,1))
Debug "Adresse (10,2) = "+Str(@TBL(10,2))

/Liå :wink:

Dans se sens , c'est contigue , tu as juste inversé ligne/colonne , mais l'inverse ( mon code plus haut ) , c'est pas contiguë , tu as un décalage de la largeur du tableau entre chaque élément. ( différence de ligne quoi...)
Grosse Erreur: quand tu déclare un tableau de 100 * 100, tu déclare en fait un tableau de 101 * 101 !!!
Elle est là la différence...
Je le sais :D

bref , il parle de faire un copymemory ( zone contiguë ) , sur un tableau 2D utilisant mon ordre ( 2° dimension fixe ,1° variable ) , dans se sens , c'est pas contigu , donc pas d'allocate memory... :D

je sais pas ou tu te barres , ou se que tu essaye de me faire comprendre , mais tu te casses la tête :D


Code : Tout sélectionner

je ne sais pas si c'est encore possible... 
non, tu as arraysize() qui te renvois le nbr d'éléments.
tu n'a plus qu'a ajouté +1 et multiplier par le nombre de byte pour avoir une taille.

Code : Tout sélectionner

Dim A.i(10)

Debug MemorySize(@A(0))
Debug (ArraySize(A())+1)*4

Publié : sam. 25/juil./2009 21:35
par lionel_om
Je ne pense pas qu Ganagyre est vraiment fixé les indexes là dessus, mais plus pour savoir à titre expérimental, bref...

Par contre on peut toujours utiliser cette ancienne méthode:

Code : Tout sélectionner

PeekL(@A(0)-8)
Mais c'est vrai que c'est inutile du fait de cette nouvelle fonction. Je ne la connaissais pas d'ailleurs, merci pour l'info

/Liå :wink:

Publié : dim. 26/juil./2009 0:17
par Ollivier
Je sais pas si Ganagyre parlait de CopyMemory en matière de simplicité, ou en matière de performance. En tout cas, si c'est une question de performance, il y a l'Asm, seulement ça n'est pas très souple.

Code : Tout sélectionner

Dim TBL.l(10000,100)
Dim TBLA.l(10000,100)

;  Remplissage avec des valeurs aléatoires 0 ou 1

For col = 1 To 100
  For lignes = 1 To 10000
 
  TBL(lignes, col) = Random(1)
  TBLA(lignes, col) = TBL(lignes, col)

  Next lignes
Next col


; Adition de Colonnes


; Version PB
;************
For i = 1 To 10000

  TBL(i, 0) = TBL(i, 10) + TBL(i, 12) + TBL(i, 20) + TBL(i, 100)

;Debug  TBL(0,i)

Next i

; Version ASM
;*************
base.L = @TBLA(1, 10)
! mov ecx, 10000
! mov esi, [v_base]
unlabel:
! xor ebx, ebx
! lodsd
! add esi, 4 ; (12 - 10 - 1) * 4
! add ebx, eax
! lodsd
! add esi, 28 ; (20 - 12 - 1) * 4
! add ebx, eax
! lodsd
! add esi, 316 ; (100 - 20 - 1) * 4
! add ebx, eax
! lodsd
! add esi, 40 ; 10 * 4
! add ebx, eax
! mov [esi - 444], ebx ; 444 = (101 + 10) * 4
! loop l_unlabel




Publié : dim. 26/juil./2009 9:02
par Anonyme
lionel_om a écrit :Je ne pense pas qu Ganagyre est vraiment fixé les indexes là dessus
De ce tableau, je fais ensuite la somme de certaines colonnes, et je stoke le resultat dans la premiere colonne du tableau / TBL(0,lignes).
Je me suis fié à son 1° post.
PeekL(@A(0)-8)
Merci tu tuyaux , je ne connaissais pas se truc ;)

Code : Tout sélectionner

Dim A.b(3,3)
*ptr.Long = @A(0,0)
*ptr\l = $04030201 : *ptr + 4
*ptr\l = $08070605 : *ptr + 4
*ptr\l = $0C0B0A09 : *ptr + 4
*ptr\l = $100F0E0D : *ptr + 4
J'adore se type de remplissage , pas très explicite pour un débutant a cause du little & big edian , ca me rappelle y a qq mois avec olivier le décryptage des instructions machine :D

Publié : lun. 27/juil./2009 11:14
par Ganagyre
Bonjour .


Pour cette expérimentation d'addition de Tableau .
Je cherchais du coté "CopyMemory" pour le coté "simplicité et performance".

Du moins sur des Tableau disctincts

Code : Tout sélectionner

Dim a.l(1000)
Dim b.l(1000)
CopyMemory(@a(),@b(),4004)
Une fonction style "AddMemory" d'origine aurait fait l'affaire.
Quitte à traiter des Tableaux distincts au lieu d'un tableau à 2 dimensions.

Code : Tout sélectionner

Dim a.l(1000)
Dim b.l(1000)
Dim c.l(1000)
AddMemory(@TBLa(),@TBLb(),@TBLc())
Donnerait TBLa = TBLb + TBLc

=

Les autres méthodes cités demandent un peu plus de jonglage avec le code, une bonne gestion de la mémoire pour les données non contigües.

Merci à tous pour vos réflexions et exemples.

Publié : lun. 27/juil./2009 14:52
par djes
Avec le blitter de l'amiga, j'avais fait un code d'addition/soustraction/comparaison de zones de mémoire, afin de gérer un z-buffer hardware. Je crois que je suis le seul à avoir fait ça; ça me permettait de faire des vector-balls réellement en 3d, avec intersections, comme des bulles :)
C'est bien sûr tout à fait faisable sur les cartes 3d récentes.
Par contre en pure, il faudrait faire quelques fonctions pour gérer ça; il n'y a pas de surcharge d'opérateurs.