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 ,
alors que
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å

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å

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
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...
je sais pas ou tu te barres , ou se que tu essaye de me faire comprendre , mais tu te casses la tête
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:
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å

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

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
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.