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.

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
ceci ne devrai pas ecrire "1000001" mais bien 1000000
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
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
corrige le bleme

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.

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