Page 1 sur 2

trop de dim() = invalid memory access !!!

Publié : mar. 05/sept./2006 21:16
par aneekee
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 !!!

Publié : mer. 06/sept./2006 10:12
par Anonyme
开工前唠叨唠叨. 这几乎是我25年来最辛苦的几个月。脑子里经常出现一个字: 以前路过报摊,总要去看看,买一本最新的电影杂志。这几个月别说电影杂志 ?




:jesors:

tu n'as toujours pas de code afin que l'on puisse t'aider ?? car pour le "bug" on ne peut rien faire , nous utilisateurs lambda.
il y a une alternative à ton problème, c'est sur.

Publié : mer. 06/sept./2006 18:05
par poshu
Hum... le truc en chinois parle de mauvais mois et de cinema... En fait j'ai rien compris °_°

Publié : ven. 08/sept./2006 20:32
par aneekee
je ne peut pas donner entièrrement le code source (vraiment trop long !!!!) et de plus, j'utilise plus de 1200 sprites en tout genre... que je ne peux vous fournir..... désolé... mais ce problème est vraiment génant...

Publié : ven. 08/sept./2006 20:35
par Anonyme
il dois bien y avoir, une solution...
essaye d'envoyer un mail a fred (si il te répond... :( ) pour lui exposé le problème :wink:
Car , la, je ne vois pas trop comment t'aider.

@++

Publié : ven. 08/sept./2006 20:47
par comtois
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

Code : Tout sélectionner

CallDebugger
For t=0 To 10000
  Dim t(500,500,500)
Next t
CallDebugger
End
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.

Publié : ven. 08/sept./2006 20:51
par Anonyme
Ha oui , je n'y ai meme pas penser :oops:
ca se tombe il utilise des tableaux locaux ds des procédures :D
C'est aussi simple que ca :lol:

Edit : ca ne peut pas etre ca, il y aurais une erreur a la compilation. :?

Publié : sam. 09/sept./2006 0:40
par Flype
est ce que ton problème ressemble à celui relevé sur le forum anglais ?

ici:
http://www.purebasic.fr/english/viewtop ... ight=stack

Publié : sam. 09/sept./2006 13:56
par aneekee
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 !!!

Publié : sam. 09/sept./2006 15:01
par Anonyme
tu aurais pu mettre un code un peu plus complet :?

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
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.

@++

Publié : sam. 09/sept./2006 15:09
par comtois
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

Publié : sam. 09/sept./2006 15:14
par Anonyme
Voici une solution de remplacement de copysprite()
decommente la ligne 19 et supprime la ligne 18 , ca marche :wink:

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é :wink:

Publié : sam. 09/sept./2006 18:33
par aneekee
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

Publié : sam. 09/sept./2006 19:27
par Flype
simuler un dim peut etre effectué via une structure.

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...

Publié : dim. 10/sept./2006 9:26
par aneekee
merci, je vais voir tout ça
@+