Page 1 sur 1

[RESOLU] Tableau et pointeur mauvais ménage?

Publié : dim. 28/nov./2021 18:08
par Ekim
Bonsoir à tous :D

Ce morceau de code me rend fou car je ne vois pas où est le problème :x
Quelqu'un peut m'aider s'il vous plait?

Code : Tout sélectionner

Enumeration img 1
	#IMG1 
	#IMG2
EndEnumeration


Structure Shap
	idcurrent.l
	
	px.l
	py.l
	
	wx.l
	wy.l
	
	Array Tab01.l(0,0)
EndStructure	

*param.Shap = AllocateMemory(SizeOf(Shap))
*param\Tab01(100,100)
*param\idcurrent = #IMG1
*param\wx = 100
*param\wy = 100
*param\Tab01(0,0) = Random(100,0)

Procedure Gpart1(*param.Shap)
	Debug *param\Tab01(3,3)
	Debug *param\idcurrent
	Debug *param\wx
	Debug *param\wy
EndProcedure

If CreateThread(@Gpart1(), *param)
	Debug "Thread ok"
EndIf

Re: Tableau et thread mauvais ménage?

Publié : dim. 28/nov./2021 18:18
par Ar-S
Bonjour,

Je n'utilise pas les pointeurs, j'ai jamais pigé grand chose ni vu dans de l'applicatif de base un réel gain de perf.
Au delà de ça, ton soucis ne vient apparemment pas du tout du Thread.
Tu devrais modifier ton titre en "Tableau et pointeur mauvais ménage?"

Re: Tableau et thread mauvais ménage?

Publié : dim. 28/nov./2021 18:25
par Micoute
Bonjour Ekim,

tu as simplement oubliè l'instruction Dim

Code : Tout sélectionner

Enumeration img 1
	#IMG1 
	#IMG2
EndEnumeration


Structure Shap
	idcurrent.l
	
	px.l
	py.l
	
	wx.l
	wy.l
	
	Array Tab01.l(0,0)
EndStructure	

*param.Shap = AllocateMemory(SizeOf(Shap))
Dim *param\Tab01(100,100)
*param\idcurrent = #IMG1
*param\wx = 100
*param\wy = 100
*param\Tab01(0,0) = Random(100,0)

Procedure Gpart1(*param.Shap)
	Debug *param\Tab01(3,3)
	Debug *param\idcurrent
	Debug *param\wx
	Debug *param\wy
EndProcedure

If CreateThread(@Gpart1(), *param)
	Debug "Thread ok"
EndIf

Re: Tableau et pointeur mauvais ménage?

Publié : dim. 28/nov./2021 21:53
par Ekim
Bonsoir @Ar-s, tes désirs sont des ordres, je viens de modifier le titre :P

et pour te répondre, il est vrai que les pointeurs sont un vrai casse cacahouète voir même à éviter si on a pas totalisé les 6h de sommeil minimum :lol:

salut @Micoute, ce que tu avais trouvé était effectivement un oubli, mais le vrai problème semble persister, c'est à dire que je n'ai toujours pas l'information du tableau qui se trouvent dans la procédure même :|

Code : Tout sélectionner

Enumeration img 1
	#IMG1 
	#IMG2
EndEnumeration


Structure Shap
	idcurrent.l
	
	px.l
	py.l
	
	wx.l
	wy.l
	
	Array Tab01.l(0,0)
EndStructure	

*param.Shap = AllocateMemory(SizeOf(Shap))
Dim *param\Tab01(100,100)
*param\idcurrent = #IMG1
*param\wx = 100
*param\wy = 100
*param\Tab01(0,0) = Random(100,0)

Procedure Gpart1(*param.Shap)
	*param\Tab01(3,3) = 56
	*param\idcurrent = 16
	*param\wx = 10
	*param\wy = 26
EndProcedure

If CreateThread(@Gpart1(), *param)
	Debug "Thread ok"
EndIf

Debug *param\Tab01(3,3)
Debug *param\idcurrent
Debug *param\wx
Debug *param\wy

Repeat
	Event = #PB_Event_CloseWindow
	
Until #PB_Event_CloseWindow

Re: Tableau et pointeur mauvais ménage?

Publié : lun. 29/nov./2021 0:16
par cage
Bonsoir,
J'ai juste ajouté un Delay(1000) entre la création du Thread et les Debug car tu veux afficher les résultats avant que le thread ne fasse son job.

Code : Tout sélectionner

If CreateThread(@Gpart1(), *param)
	Debug "Thread ok"
EndIf

Delay(1000)

Debug *param\Tab01(3,3)
Debug *param\idcurrent
Debug *param\wx
Debug *param\wy
cage

Re: Tableau et pointeur mauvais ménage?

Publié : lun. 29/nov./2021 0:40
par Demivec
Voir aussi:

Code : Tout sélectionner

Enumeration img 1
	#IMG1 
	#IMG2
EndEnumeration


Structure Shap
	idcurrent.l
	
	px.l
	py.l
	
	wx.l
	wy.l
	
	Array Tab01.l(0,0)
EndStructure	

*param.Shap = AllocateMemory(SizeOf(Shap))
Dim *param\Tab01(100,100)
*param\idcurrent = #IMG1
*param\wx = 100
*param\wy = 100
*param\Tab01(0,0) = Random(100,0)

Procedure Gpart1(*param.Shap)
	*param\Tab01(3,3) = 56
	*param\idcurrent = 16
	*param\wx = 10
	*param\wy = 26
EndProcedure

set_Gpart1 = CreateThread(@Gpart1(), *param)
If set_Gpart1
	Debug "Thread ok"
EndIf

WaitThread(set_Gpart1) ; ou Delay(x)
Debug *param\Tab01(3,3)
Debug *param\idcurrent
Debug *param\wx
Debug *param\wy

Repeat
	Event = #PB_Event_CloseWindow
	
Until #PB_Event_CloseWindow

Re: Tableau et pointeur mauvais ménage?

Publié : lun. 29/nov./2021 22:39
par Ekim
Bonsoir @Cage et @Demivec

l'affichage avant le démarrage du thread? 8O encore une bizarrerie quantique :lol:

excellent les gars pour le déblocage, j'étais complètement à côté de la plaque avec le chemin que j'avais emprunté pour résoudre ce problème
exemple "CreateSemaphore " :lol:

encore merci

Re: Tableau et pointeur mauvais ménage?

Publié : mer. 01/déc./2021 10:34
par Ollivier
Euh... Salut je suis en retard, désolé !

Bon... Je suppose que vos axones ont pris un peu d'oxydation.

Source (doc) : https://www.purebasic.com/french/docume ... tions.html

Code : Tout sélectionner

Structure myStruc
  Array x.s(0, 0)
EndStructure

*x.myStruc = AllocateStructure(myStruc)

; fonctionnement

FreeStructure(*x)
Et si ces fonctions sont "trop" automatisées, utilisez celles-ci :

Code : Tout sélectionner

Structure myStruc
  Array x.s(0, 0)
EndStructure

*x.myStruc = AllocateMemory(SizeOf(myStruc) )



InitializeStructure(*x, myStruc)

; fonctionnement 1

ClearStructure(*x, myStruc)



; Ici, on peut mettre un Redim sans
; défoncer la mémoire
; Et, à mon humble avis, cette manip
; ne doit pas être threadée



InitializeStructure(*x, myStruc)

; fonctionnement 2

ClearStructure(*x, myStruc)



FreeMemory(*x)
Après ça, toutes les galipettes avec les threads sont faisables (mais dans les zones balisées par InitializeStructure() en début, et par ClearStructure() en fin). Un redimensionnement de tableau, je pense (à vérifier) qu'il ne faut pas le threader (ou alors, interrompre tous les autres threads de manip du tableau).

Re: [RESOLU] Tableau et pointeur mauvais ménage?

Publié : mer. 02/févr./2022 9:16
par microdevweb
Bonjour,

J'arrive quand la guerre est finie, mais j'utilise personnellement beaucoup de pointeurs. Voici comment personnellement, je procède.

Code : Tout sélectionner

Structure _test
  id.i
  name.s
EndStructure

Dim *myData._test(10)
; Dynamic allocation of memories
For i = 0 To 9
  *myData(i) = AllocateStructure(_test)
  With *myData(i)
    \id = i
    \name = "name "+Str(i)
  EndWith
Next
; Display result
For i = 0 To 9
  With *myData(i)
    Debug "ID : "+Str(\id)+" Name : "+\name
  EndWith
Next
; free dynamic memories (when you ever don't more need those)
For i = 0 To 9
  FreeStructure(*myData(i))
Next