Tableau et Addition

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Tableau et Addition

Message 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)).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 :)
Anonyme

Message 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.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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å
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme

Message 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.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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



Anonyme

Message 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
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message 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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Répondre