SortStructuredList --- Invalid memory access ----

Archive.
barnierchristophe
Messages : 64
Inscription : lun. 07/févr./2005 11:18

SortStructuredList --- Invalid memory access ----

Message 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.
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

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

Message 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)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

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