Accès mémoire invalide

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Accès mémoire invalide

Message par threedslider »

Hello à tous,

Dis, si je fais cela :

Code : Tout sélectionner

Structure test
  x.f
  y.f
EndStructure

a.test\x = 30.0

Debug a\x

Structure v_test
  Array values.test(1)
EndStructure

Define val.v_test

val\values(0)\x = 100.5
val\values(1)\x = 50.5

Debug val\values(0)\x 
Debug val\values(1)\x
jusque là ça marche mais par contre pourquoi ceci ne fonctionne pas ???

voici le code :

Code : Tout sélectionner

Define *pointer.v_test

*pointer\values(0)\x = 3000.0

Debug *pointer\values(0)\x
PB me dit : Accès mémoire invalide( erreur lecture à l'adresse 0)

Pourriez vous m'expliquer du pourquoi et du comment faire fixer cet message d'erreur ? Merci.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Accès mémoire invalide

Message par case »

un pointer n'est pas une variable. mais pointe vers une adresse mémoire.
comme l'indique la doc
Il existe seulement trois méthodes valides pour fixer la valeur d'un pointeur:
- Obtenir le résultat par une fonction (voir l'exemple ci-dessous)
- Copier la valeur d'un autre pointeur
- Trouver l'adresse d'une variable, procédure ou label (voir ci-dessous)
ImageImage
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Accès mémoire invalide

Message par threedslider »

Merci case ! Ok j'ai lu également la doc pour ça :)

C'est tout bête, il fallait ça :

Code : Tout sélectionner

Define val.v_test

*pointer.v_test = @val

*pointer\values(0)\x = 30.0

Debug val\values(0)\x
Et là ça marche !!! Trop bizarre quand même pour PB, moi qui je suis habitué au C++ :P

Hapyy coding !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Accès mémoire invalide

Message par Mesa »

Il faut initialiser les structures dans ce cas là.

Code : Tout sélectionner

Structure TEST
	x.f
	y.f
EndStructure

a.TEST\x = 30.0

; Debug a\x

Structure v_test
	Array values.test(1)
EndStructure

Define val.v_test

val\values(0)\x = 100.5
val\values(1)\x = 50.5

; Debug val\values(0)\x 
; Debug val\values(1)\x

Define *pointer.v_test
*pointer= AllocateMemory(SizeOf(v_test))
InitializeStructure(*pointer, v_test)

*pointer\values(0)\x = 3000.0

Debug *pointer\values(0)\x
M.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Accès mémoire invalide

Message par Mesa »

On peut utiliser "allocatestructure()" aussi (c'est préférable).

Ne pas oublier d'utiliser freestructure() dans tous les cas.

Code : Tout sélectionner

Structure TEST
	x.f
	y.f
EndStructure

a.TEST\x = 30.0

; Debug a\x

Structure v_test
	Array values.test(1)
EndStructure

Define val.v_test

val\values(0)\x = 100.5
val\values(1)\x = 50.5

; Debug val\values(0)\x 
; Debug val\values(1)\x




; Define *pointer.v_test
; *pointer= AllocateMemory(SizeOf(v_test))
; InitializeStructure(*pointer, v_test)


*pointer.v_test = AllocateStructure(v_test)

*pointer\values(0)\x = 3000.0

Debug *pointer\values(0)\x

FreeStructure(*pointer)
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Accès mémoire invalide

Message par threedslider »

Ah c'est ça que je voulais, merci encore à Mesa pour tes exemples :)
Répondre