trop de dim() = invalid memory access !!!
trop de dim() = invalid memory access !!!
voilà, j'utilise beaucoup les dimentions de tableau "dim()" lorsque je fais un programme.... mais là, il y a un problème avec purebasic... Apparement les données sont limités dans les tables qu'on en fasse 3 très grandes ou 20 petites.... rapidemment on a droit à "invalid memory access" !!!!! alors qu'avec d'autres langages, cela ne pose aucun problème.....
les créer ne pose aucun problème, mais les utiliser... dés que l'on veut changer une variable dans le tableau: invalid memory access !!!
les créer ne pose aucun problème, mais les utiliser... dés que l'on veut changer une variable dans le tableau: invalid memory access !!!
Sans donner ton code ni tes sprites ,tu peux peut-être quand même poster un code qui met en évidence le problème ?
Dobro avait fait ça
Au passage, je n'ai pas de problème avec ce code, il fonctionne bien chez moi !!
tu dis que ton tableau est plus petit, donc ça serait bien que tu nous montres concrètement comment se présente ton tableau , il utilise une structure aussi ou c'est un tableau de long ? combien de dimensions ? taille de chaque dimension ? il est global ton tableau ? tu le passes en paramètre à des procédures ? toutes ces infos peuvent peut-être aider au débogage.
Dobro avait fait ça
Code : Tout sélectionner
CallDebugger
For t=0 To 10000
Dim t(500,500,500)
Next t
CallDebugger
End
tu dis que ton tableau est plus petit, donc ça serait bien que tu nous montres concrètement comment se présente ton tableau , il utilise une structure aussi ou c'est un tableau de long ? combien de dimensions ? taille de chaque dimension ? il est global ton tableau ? tu le passes en paramètre à des procédures ? toutes ces infos peuvent peut-être aider au débogage.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
est ce que ton problème ressemble à celui relevé sur le forum anglais ?
ici:
http://www.purebasic.fr/english/viewtop ... ight=stack
ici:
http://www.purebasic.fr/english/viewtop ... ight=stack
non, je ne pense pas que mon problème est celui cité au dessus
mon code est trés simple.... sans procedure et sans fonction.....
il tourne dans une grande boucle while/wend
mes déclarations de tableau sont:
Dim anti(9)
Dim capture(9)
Dim aball(9)
Dim xball(9)
Dim yball(9)
Dim eball(9)
Dim vball(9)
Dim rball(9)
Dim sball(9)
Dim aaa(9)
Dim multi(3)
Dim ap_ball(9)
Dim acball(9)
Dim acceleration(9)
Dim transform(14)
Dim dis(19)
Dim mball(19)
Dim ef(50,2)
Dim bexplose(29)
Dim tball(39)
Dim n(220)
Dim bonus(30,2)
Dim piece(30,2)
elles ne sont pas énormes comme vous pouvez le constater.....
si je change, par exemple, dim n(200) en dim n(250)
=====>invalid memory access !!!!!!
si je fais un petite programme tout bête avec ces tableaux, il n'y a aucun problème !!!!
la compilation s'arrête sur cette ligne:
CopySprite(704+n(f+3)+ret,sprite_obj)
en rouge avec donc "invalid memory access" si dim n(250)..... avec dim n(200) aucun problème !!!!
j'utilise plus de 1200 sprites en bmp..... le bmp est connu pour être gourmand en mémoire.... mais j'ai 1GO de ram et 256 Mo en graphique... et les sprites ne sont pas énormes...
Incompréhensible !!!
mon code est trés simple.... sans procedure et sans fonction.....
il tourne dans une grande boucle while/wend
mes déclarations de tableau sont:
Dim anti(9)
Dim capture(9)
Dim aball(9)
Dim xball(9)
Dim yball(9)
Dim eball(9)
Dim vball(9)
Dim rball(9)
Dim sball(9)
Dim aaa(9)
Dim multi(3)
Dim ap_ball(9)
Dim acball(9)
Dim acceleration(9)
Dim transform(14)
Dim dis(19)
Dim mball(19)
Dim ef(50,2)
Dim bexplose(29)
Dim tball(39)
Dim n(220)
Dim bonus(30,2)
Dim piece(30,2)
elles ne sont pas énormes comme vous pouvez le constater.....
si je change, par exemple, dim n(200) en dim n(250)
=====>invalid memory access !!!!!!
si je fais un petite programme tout bête avec ces tableaux, il n'y a aucun problème !!!!
la compilation s'arrête sur cette ligne:
CopySprite(704+n(f+3)+ret,sprite_obj)
en rouge avec donc "invalid memory access" si dim n(250)..... avec dim n(200) aucun problème !!!!
j'utilise plus de 1200 sprites en bmp..... le bmp est connu pour être gourmand en mémoire.... mais j'ai 1GO de ram et 256 Mo en graphique... et les sprites ne sont pas énormes...
Incompréhensible !!!
tu aurais pu mettre un code un peu plus complet
j'ai reproduit le bug :
a prioris, c'est CopySprite qui bug. et non pas les tableaux. pour moi ca marche a dim(250), mais 1250, ca plante avec un invalid access...
il y a surement une alternative. je vais voir ca.
@++

j'ai reproduit le bug :
Code : Tout sélectionner
InitSprite()
OpenWindow(0,0,0,64,64,"")
OpenWindowedScreen(WindowID(0),0,0,64,64,0,0,0)
Dim Spr(1250)
For i = 1 To 1250
CreateSprite(i,64,64)
Spr(i) = i
Next i
For i = 1 To 1250
CopySprite(Spr(i),i+1250)
Next i
il y a surement une alternative. je vais voir ca.
@++
avec #PB_Any ça passe
Code : Tout sélectionner
InitSprite()
OpenWindow(0,0,0,64,64,"")
OpenWindowedScreen(WindowID(0),0,0,64,64,0,0,0)
Dim Spr(1250)
For i = 1 To 1250
a = CreateSprite(#PB_Any,64,64)
Spr(i) = a
Next i
For i = 1 To 1250
CopySprite(Spr(i),i+1250)
Next i
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Voici une solution de remplacement de copysprite()
decommente la ligne 19 et supprime la ligne 18 , ca marche
Edit : j'oubliais, il doit encore avoir un défaut dans mon code, la couleur c'est pas RGB mais BRG je crois, il y a une simple modif a apporté
decommente la ligne 19 et supprime la ligne 18 , ca marche

Code : Tout sélectionner
InitSprite()
OpenWindow(0,0,0,64,64,"")
OpenWindowedScreen(WindowID(0),0,0,64,64,0,0,0)
Structure Pixel
Pixel.l
EndStructure : Global *Line.Pixel
Declare CopySpriteEX(SpriteSource.l,SpriteCible.l,Mode=0)
Dim Spr(1250)
For i = 1 To 1250
CreateSprite(i,64,64)
Spr(i) = i
Next i
For i = 1 To 1250
CopySprite(Spr(i),i+1250)
;CopySpriteEX(Spr(i),i+1250)
Next i
Procedure CopySpriteEX(SpriteSource.l,SpriteCible.l,Mode=0)
Protected DBuffer.l,DBufferP.l,PixelFormat.l,Pbyte.l
Protected Sw.l,Sh.l
Sw = SpriteWidth(SpriteSource)
Sh = SpriteHeight(SpriteSource)
CreateSprite(SpriteCible,Sw,Sh,Mode)
Dim Buffer(Sw,Sh)
StartDrawing(SpriteOutput(SpriteSource))
DBuffer = DrawingBuffer()
DBufferP = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
Select PixelFormat
Case #PB_PixelFormat_8Bits : PixelFormat=1
Case #PB_PixelFormat_15Bits : PixelFormat=2
Case #PB_PixelFormat_16Bits : PixelFormat=2
Case #PB_PixelFormat_24Bits_RGB : PixelFormat=3
Case #PB_PixelFormat_24Bits_BGR : PixelFormat=3
Case #PB_PixelFormat_32Bits_RGB : PixelFormat=4
Case #PB_PixelFormat_32Bits_BGR : PixelFormat=4
EndSelect
For y = 0 To Sh-1
*Line = DBuffer+DBufferP*y
For x = 0 To Sw-1
Buffer(x,y)=*Line\Pixel
*Line + PixelFormat
Next
Next
StopDrawing()
StartDrawing(SpriteOutput(SpriteCible))
DBuffer = DrawingBuffer()
DBufferP = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
Select PixelFormat
Case #PB_PixelFormat_8Bits : PixelFormat=1
Case #PB_PixelFormat_15Bits : PixelFormat=2
Case #PB_PixelFormat_16Bits : PixelFormat=2
Case #PB_PixelFormat_24Bits_RGB : PixelFormat=3
Case #PB_PixelFormat_24Bits_BGR : PixelFormat=3
Case #PB_PixelFormat_32Bits_RGB : PixelFormat=4
Case #PB_PixelFormat_32Bits_BGR : PixelFormat=4
EndSelect
For y = 0 To Sh-1
*Line = DBuffer+DBufferP*y
For x = 0 To Sw-1
*Line\Pixel = Buffer(x,y)
*Line + PixelFormat
Next
Next
StopDrawing()
EndProcedure
Edit : j'oubliais, il doit encore avoir un défaut dans mon code, la couleur c'est pas RGB mais BRG je crois, il y a une simple modif a apporté

merci beaucoup de ta réponse
en effet dans mon programme, il y a énormement de copysprite...
mais remplacer chaque copysprite par ton code, ça me parait carrement inimaginable..... Je ne pense pas que cela soit possible...
par contre si quelqu'un à une parade afin de "simuler" une dim()....
merci à tous de vos réponses
en effet dans mon programme, il y a énormement de copysprite...
mais remplacer chaque copysprite par ton code, ça me parait carrement inimaginable..... Je ne pense pas que cela soit possible...
par contre si quelqu'un à une parade afin de "simuler" une dim()....
merci à tous de vos réponses
simuler un dim peut etre effectué via une structure.
par ex.
ceci dit - si c'est CopySprite le coupable - et que CplBator propose une fonction qui la remplace (CopySpriteEx) pourquoi ne pas l'utiliser ?
Tu mets la procedure CopySpriteEx() en début de programme
Ensuite tu changes tout les CopySprite() par CopySpriteEx() via la fonction remplacer de l'éditeur et dis nous si marche...
par ex.
Code : Tout sélectionner
Structure MON_TABLEAU
n.l[1000]
EndStructure
Global tab.MON_TABLEAU
For i = 0 To 999
tab\n[i] = Random(123456)
Next
ceci dit - si c'est CopySprite le coupable - et que CplBator propose une fonction qui la remplace (CopySpriteEx) pourquoi ne pas l'utiliser ?
Tu mets la procedure CopySpriteEx() en début de programme
Ensuite tu changes tout les CopySprite() par CopySpriteEx() via la fonction remplacer de l'éditeur et dis nous si marche...