Page 1 sur 1

SortStructuredList --- Invalid memory access ----

Publié : dim. 06/mai/2007 21:02
par barnierchristophe
Un drôle de Bug....
La fonction SortStructuredList fait un Invalid Memory access avec la structure suivante, quand je fait un tri sur le champ Numero

Code : Tout sélectionner

Structure Memoire
  Numero.f
  Valeur.c[#MaxCircuit+1]
  Nom.s
EndStructure
Et, chose étonnante, tout rentre dans l'ordre simplement en changeant l'ordre des champs dans la définition de la structure!!

Code : Tout sélectionner

Structure Memoire
  Valeur.c[#MaxCircuit+1]
  Nom.s
  Numero.f
EndStructure

Code : Tout sélectionner

SortStructuredList(Memoires(),0,OffsetOf(Memoire\Numero),#PB_Sort_Float)     
Il semblerait que cela soit lié à la présence d'un string dans la structure.
En mémoire, dans qu'elle ordre sont rangés les champs de la structure? Si le dernier champ est stocké en premier, tout s'explique.

Re: SortStructuredList --- Invalid memory access ----

Publié : lun. 07/mai/2007 17:03
par minirop
barnierchristophe a écrit :En mémoire, dans qu'elle ordre sont rangés les champs de la structure? Si le dernier champ est stocké en premier, tout s'explique.
je ne sais pas trop ne PB mais çà devrait être dans l'ordre de la déclaration.
exemple :

Code : Tout sélectionner

a.l = 8
dans la mémoire tu as :
[00000000|00000000|00000000|00001000]
si tu as :

Code : Tout sélectionner

structure a
c.l
b.l
endstructure
k.a
k\c = 1
k\b = 5
tu as 2*4 = 8 bits :
[00000000|00000000|00000000|00000001|00000000|00000000|00000000|00000101]
et puis pour une string, elle ne prends que 4 octets dans la mémoire de la structure car elles sont gérés comme les pointeur sur caractères en C.

Code : Tout sélectionner

a.s = "aaa"
ta variable "a"
[01101010|01011010|01010011|01001101]
et à l'emplacement "6A5A534D" (valeur contenu dans "a" en héxa) :
[01000001|01000001|01000001|00000000] (3 "a" code ascii 65 + caratère nul de fin de chaine)

Publié : lun. 07/mai/2007 18:53
par Anonyme2
L'ordre en mémoire c'est l'ordre de la déclaration, d'ailleurs OffsetOf() donne la position des éléments en fonction de leur taille par rapport au début de la structure

Publié : lun. 07/mai/2007 19:16
par minirop
sinon tu pourrais nous poster le code qui bug (le plus petit code possible) car chez moi :

Code : Tout sélectionner

Structure Memoire
  Numero.f
  Valeur.c[10]
  Nom.s
EndStructure

NewList memoires.Memoire()

AddElement(memoires())
memoires()\Numero = 5
memoires()\ Valeur[0] = 'a'
memoires()\Nom = "string5"

AddElement(memoires())
memoires()\Numero = 2
memoires()\ Valeur[0] = 'g'
memoires()\Nom = "string2"

AddElement(memoires())
memoires()\Numero = 1
memoires()\ Valeur[0] = 'f'
memoires()\Nom = "string1"

AddElement(memoires())
memoires()\Numero = 8
memoires()\ Valeur[0] = 'b'
memoires()\Nom = "string8"

SortStructuredList(memoires(),0,OffsetOf(Memoire\Numero),#PB_Sort_Float)

ForEach memoires()
	Debug memoires()\Nom
Next
ceci passe tranquille