Page 2 sur 2

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 13:39
par falsam
J’espère que je ne plante pas dans ce code.

:arrow: Objectif :
-Obtenir la taille d'une structure
-Création de 1 000 000 d'éléments dans la liste chaînée.
-Obtenir la taille en Mega Octets de la liste chaînée.

Code : Tout sélectionner

Structure Test
  field1.s
  field2.s
  field3.s
EndStructure

Debug "Taille de la structure" + Str(SizeOf(Test)) + " Octets"


Global NewList MyTest.test(), Result.i

For N=1 To 1000000
  Result = AddElement(MyTest())
  
  If Result <> 0
    MyTest()\field1 = "Field1 " + Str(N)
    MyTest()\field2 = "Field2 " + Str(N)
    MyTest()\field2 = "Field3 " + Str(N)
  Else
    MessageRequester("Ooops !!!", "Impossible d'allouer de la mémoire pour le nouvel élément")
    Break
  EndIf 
Next

Debug "Nombre d'éléments " +Str(ListSize(Mytest()))

Debug Str(ListSize(MyTest())) + " élements occupant " + StrF((ListSize(MyTest())*SizeOf(Test))/1024/1024,2) + " Mo"
Résultat 11,44 Mo

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:10
par omega
J'obtiens une erreur ici:

Code : Tout sélectionner

Debug Str(ListSize(MyTest())) + " élements occupant " + StrF((ListSize(MyTest())*SizeOf(Test))/1024/1024,2) + " Mo"
J'ai changé cette ligne par debug n (car c'est ce nbre qui m'intéresse le plus, pour l'instant)
et je sais que, au moins le maxi>=1000000 (sur ma config évidemment)
La liste a atteint les 1000000 mais je ne comprends pas pourquoi debug m'affiche 10000001 au lieu de 1000001... (encore qq chose de bizarre...)

1000000 (itérations) + 1 (maxi+1)= 1000001 et non pas 10000001 ??

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:15
par Backup
omega a écrit :
J'ai changé cette ligne par debug n (car c'est ce nbre qui m'intéresse le plus, pour l'instant)

La liste a atteint les 1000000 mais je ne comprends pas pourquoi debug m'affiche 10000001 au lieu de 1000001... (encore qq chose de bizarre...)

1000000 (itérations) + 1 (maxi+1)= 1000001 et non pas 10000001 ??

au lieu de lancer des soupçons de bug , pourquoi ne donnes tu pas ton code que nous puissions voir, ou TU te plante ?

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:28
par omega
@Dobro

Le code est déjà affiché ci-dessus (celui de Falsam)

Je le reprends ici (avec une seule ligne modifiée à cause d'un bug à mon niveau)

Code : Tout sélectionner

Structure Test
  field1.s
  field2.s
  field3.s
EndStructure

Debug "Taille de la structure" + Str(SizeOf(Test)) + " Octets"


Global NewList MyTest.test(), Result.i

For N=1 To 1000000
  Result = AddElement(MyTest())
  
  If Result <> 0
    MyTest()\field1 = "Field1 " + Str(N)
    MyTest()\field2 = "Field2 " + Str(N)
    MyTest()\field2 = "Field3 " + Str(N)
  Else
    MessageRequester("Ooops !!!", "Impossible d'allouer de la mémoire pour le nouvel élément")
    Break
  EndIf 
Next

;cette ligne ci-dessous étant l'originale que j'ai remplacée par un debug n
;Debug Str(ListSize(MyTest())) + " élements occupant " + ;StrF((ListSize(MyTest())*SizeOf(Test))/1024/1024,2) + " Mo"

Debug n


Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:38
par Backup
ben il semble qu'il y ai un BUG de Purebasic 8O

ceci ne devrai pas ecrire "1000001" mais bien 1000000

Code : Tout sélectionner

For N=1 To 1000000
Next  N

Debug n
j'ai posé la question sur le Forum Anglais ...

je dirai que c'est due au fait que les boucle for-next compte a partir de zero ... mais j'attends confirmation :)

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:47
par falsam
omega a écrit :La liste a atteint les 1000000 mais je ne comprends pas pourquoi debug m'affiche 10000001 au lieu de 1000001... (encore qq chose de bizarre...)
Rien de bizarre. C'est le principe d'une boucle for ..Next

Code : Tout sélectionner

For k = 0 To 10 
  Debug k
Next

Debug k
La boucle est interrompue dès que la valeur de k est supérieure à 10. Pour cela, k aura pris la valeur 11.

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:51
par Backup
oui c'est ce que dit SkyWalk sur le forum anglais :)

donc un simple

Code : Tout sélectionner

For N=1 To 1000000
Next  N

Debug n-1
corrige le bleme :lol:

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 14:58
par falsam
Dobro a écrit :oui c'est ce que dit SkyWalk sur le forum anglais :)
Dans l'aide aussi c'est dit. :mrgreen:

Re: Entre Structrure et DIM

Publié : jeu. 21/mars/2013 15:06
par falsam
Pour connaitre le nombre d'éléments d'une liste chaînée, utilise la fonction ListSize()

Ce qui donne pour ton code

Code : Tout sélectionner

Debug "Nombre d'éléments " +Str(ListSize(Mytest()))
A placer en dessous de Next.

J'ai corrigé le code initial.

Je viens de voir que tu utilises ListSize() dans ton code. Le bug vient de là ? si oui Quel version de Purebasic ?

Re: Entre Structrure et DIM

Publié : ven. 22/mars/2013 12:52
par omega
Rien de bizarre. C'est le principe d'une boucle for ..Next
Non Falsam, relis bien ma remarque: j'ai dit qu'il fallait que le programme affiche

1000001 (1 million +1)

et non pas

10000001 (10 millions +1)??

Je crois que le système a fait afficher :

Str(n) + str(1) ce qui donne bien "1000000" + "1" ="10000001"

Je viens de voir que tu utilises ListSize() dans ton code. Le bug vient de là ? si oui Quel version de Purebasic ?
Oui, effectivement, le problème vient de là (pb 4.2) dans l'aide, ListSize n'existe pas

J'ai testé sur un autre pc (mais je vais tester sur mon portable où la version est plus récente)