Outo bugi cb:ssä?

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Outo bugi cb:ssä?

Post by Latexi95 »

Löysin kaiketi jonkun todella oudon bugin CB:stä. Olin tekemässä Box2D fysiikka moottorista cb:llä toimivaa versiota dll:llän avulla. Olen saannut dll:llän jonkunlaiseen kuntoon, niin että sitä nyt pitäisi voida testata. Kun kokeilin koodin toimivuutta törmäsin todella outoon ongelmaan: Kun kutsun cb:n funktiota "b2CreateBody" niin ensimmäisenä olevan parametrin "t" arvo muuttuu kesken kutsun. "t":n pitäisi olla joko 0 (staattinen), 1 (kinematic) tai 2(dynaaminen). Jostain syystä kuitenkin kun kutsun funktiota, niin parametrin arvo ei olekkaan se mikä pitäisi. Esimerkiksi kun testi koodissani ensiksi koitan luoda dynaamista runkoa, ja laitan arvoksi 2, niin kun katson "b2CreateBodyssä" printillä arvon niin se on 0, ja kun seuraavaksi koitan luoda staattista runkoa ja laitan arvoksi 0, niin "b2CreateBodyssä" arvo on 56. Täysin käsittämätöntä...

Jaahah... Joku menee kyllä nyt pahasti pieleen cb:n kääntämisessä... Kun koitan laittaa tälläistä

Code: Select all

If b2DynamicBodyCount = 0 Then Return
tarkistusta b2GetDataan niin se cb ilmoittaa, että sillä rivillä ei kuulemma olisi tarpeeksi parametrejä(Code 78)... Mitähän ihmettä on oikein tapahtunut...

Tässä kuitenkin koodi:

Code: Select all

Const BOX2D_DLL = "cbBox2D.dll"
Type b2Bodies
    Field x#
    Field y#
    Field angle#
    Field velocityX#
    Field velocityY#
    Field angularVelocity#
    Field id
    Field fixtures //memblock
    Field t As Byte
EndType


Global b2DynamicBodyCount As Integer
b2DynamicBodyCount = 0

Type b2Fixtures
    Field id
    Field posAng#
    Field posLen#
    Field shape
    Field density#
    Field restitution#
    Field friction#
    Field obj
EndType

Const b2PACKET_CREATE_BODY = 1
Const b2PACKET_CREATE_FIXTURE = 2

Const b2CREATE_BODY_FLAG_NO_FLAGS = 0
Const b2CREATE_BODY_FLAG_BULLET = 1
Const b2CREATE_BODY_FLAG_FIXED_ROTATION = 2
Const b2CREATE_BODY_FLAG_BULLET_AND_FIXED_ROTATION = 3

Const b2BODY_TYPE_STATIC = 0
Const b2BODY_TYPE_KINEMATIC = 1
Const b2BODY_TYPE_DYNAMIC = 2

Const b2SHAPE_CIRCLE = 1
Const b2SHAPE_BOX = 2
Const b2SHAPE_CUSTOM = 3

Function b2Init(gravX#,gravY#)
    Print "T4"
    mem = MakeMEMBlock(8)
    PokeFloat mem,0,gravX
    PokeFloat mem,4,gravY
    Print "T6"
    CallDLL BOX2D_DLL,"init",mem
    Print "T5"
EndFunction

Function b2Destroy()
    CallDLL BOX2D_DLL,"destroy"
EndFunction

Function b2Update(timestep#,velocityupdates = 3,positionupdates = 3)
    mem = MakeMEMBlock(12)
    PokeFloat mem,0,timestep
    PokeInt mem,4,velocityupdates
    PokeInt mem,8,positionupdates
    CallDLL BOX2D_DLL,"update",mem
    DeleteMEMBlock mem
EndFunction

Function b2WaitForUpdate()
    CallDLL BOX2D_DLL,"waitforfinish"
EndFunction

Function b2GetData()
    //Alempi rivi bugaa...
    //If b2DynamicBodyCount = 0 Then Return
    ret = MakeMEMBlock(b2DynamicBodyCount*28)
    CallDLL BOX2D_DLL,"getdata",0,ret
    index = 0
    For i = 1 To b2DynamicBodyCount
        b.b2Bodies = ConvertToType(PeekInt(ret,index))
        b\x = PeekFloat(ret,index+4)
        b\y = PeekFloat(ret,index+8)
        b\angle = PeekFloat(ret,index+12)
        b\velocityX = PeekFloat(ret,index+16)
        b\velocityY = PeekFloat(ret,index+20)
        b\angularVelocity = PeekFloat(ret,index+24)
        If b\fixtures Then
            fixtures = MEMBlockSize(b\fixtures)/4-1
            For fi = 0 To fixtures
                f.b2Fixtures = ConvertToType(PeekInt(b\fixtures,fi*4))
                If (f\obj) Then
                    RotateObject f\obj,b\angle
                    TranslateObject f\obj,Cos(b\angle+f\posAng)*f\posLen,Sin(b\angle+f\posAng)*f\posLen
                EndIf
            Next fi
        EndIf
        index + 28
    Next i
EndFunction

Function b2CreatePositionData(x# = 0,y# = 0,ang# = 0, velocityX# = 0, velocityY = 0,angularVelocity# = 0)
    mem = MakeMEMBlock(24)
    PokeFloat mem,0,x
    PokeFloat mem,4,y
    PokeFloat mem,8,ang
    PokeFloat mem,12,velocityX
    PokeFloat mem,16,velocityY
    PokeFloat mem,20,angularVelocity
    Return mem
EndFunction

Function b2CreateBody(t As Byte,positionData = 0,flags As Byte = b2CREATE_BODY_FLAG_NO_FLAGS,angulardamping# = 0.01,lineardamping# = 0.01)
    Print "T3"
    Print "Type:"+t
    If positionData Then
        x# = PeekFloat(positionData,0)
        y# = PeekFloat(positionData,4)
        ang# = PeekFloat(positionData,8)
        velocityX# = PeekFloat(positionData,12)
        velocityY = PeekFloat(positionData,16)
        angularVelocity# = PeekFloat(positionData,20)
    Else
        x# = 0
        y# = 0
        ang# = 0
        velocityX# = 0
        velocityY = 0
        angularVelocity# = 0
    EndIf
    body.b2Bodies = New(b2Bodies)
    body\x = x
    body\y = y
    body\angle = ang#
    body\t = t
    body\velocityX = velocityX
    body\velocityY = velocityY
    body\angularVelocity = angularVelocity
    body\fixtures = 0
    
    If t = b2BODY_TYPE_DYNAMIC Then b2DynamicBodyCount = b2DynamicBodyCount+ 1
    
    mem = MakeMEMBlock(40)
    PokeShort mem,0,b2PACKET_CREATE_BODY
    PokeFloat mem,2,ang#
    PokeFloat mem,6,angulardamping
    PokeFloat mem,10,angularvelocity
    PokeByte mem,14,flags
    PokeByte mem,15,t
    PokeFloat mem,16,lineardamping
    PokeFloat mem,20,velocityX
    PokeFloat mem,24,velocityY
    PokeFloat mem,28,x
    PokeFloat mem,32,y
    PokeInt mem,36,ConvertToInteger(body)
    
    ret = MakeMEMBlock(4)
    
    CallDLL BOX2D_DLL,"packet",mem,ret
    body\id = PeekInt(ret,0)
    
    Return ConvertToInteger(body)
EndFunction

Function b2CreateBoxShape(w#,h#,angle# = 0)
    mem = MakeMEMBlock(13)
    PokeByte mem,0,b2SHAPE_BOX
    PokeFloat mem,1,w
    PokeFloat mem,5,h
    PokeFloat mem,9,angle
    Return mem
EndFunction
Function b2CreateCircleShape(radius#)
    mem = MakeMEMBlock(5)
    PokeByte mem,0,b2SHAPE_BOX
    PokeFloat mem,1,radius#
    Return mem
EndFunction


Function b2CreateFixture(body,shape,density# = 1,restitution# = 0.3,friction# = 0.8,posX# = 0,posY# = 0,obj = 0)
    Print "T2"
    b.b2Bodies = ConvertToType(body)
    fixture.b2Fixtures = New(b2Fixtures)
    fixture\shape = shape
    fixture\posLen = Sqrt(posX*posX+posY*posY)
    fixture\posAng = GetAngle(0,0,posX,posY)
    fixture\density = density
    fixture\restitution = restirution
    fixture\friction = friction
    fixture\obj = obj
    If b\fixtures = 0 Then
        b\fixtures = MakeMEMBlock(4)
        PokeInt b\fixtures,0,ConvertToInteger(fixture)
    Else
        memsize = MEMBlockSize(b\fixtures)
        ResizeMEMBlock b\fixtures,memsize + 4
        PokeInt b\fixtures,memsize,ConvertToInteger(fixture)
    EndIf
    
    shapeSize = MEMBlockSize(shape)
    mem = MakeMEMBlock(shapesize + 30)
    PokeShort mem,0,b2PACKET_CREATE_FIXTURE
    PokeInt mem,2,b\id
    MemCopy shape,0,mem,6,shapeSize
    index = 6 + shapeSize
    PokeFloat mem,index,posX
    PokeFloat mem,index+4,posY
    PokeFloat mem,index+8,density
    PokeFloat mem,index+12,restitution
    PokeFloat mem,index+16,friction
    PokeInt mem,index+20,ConvertToInteger(fixture)
    
    ret = MakeMEMBlock(4)
    
    CallDLL BOX2D_DLL,"packet",mem,ret
    fixture\id = PeekInt(ret,0)
    
    Return ConvertToInteger(fixture)
EndFunction

Print b2BODY_TYPE_DYNAMIC
Print b2BODY_TYPE_STATIC
b2Init(0,-10)
circleBody = b2CreateBody(2,0,0)
circleShape = b2CreateCircleShape(20)
circleFixture = b2CreateFixture(circleBody,circleShape)

Print b2DynamicBodyCount

boxPosData = b2CreatePositionData(0,-200)
boxBody = b2CreateBody(0,boxPosData)
boxShape = b2CreateBoxShape(100,20)
boxFixture = b2CreateFixture(boxBody,boxShape,0)

Print "T1"

circleT.b2Bodies = ConvertToType(circleBody)
FrameLimit 60
Print "Running"
Repeat
    Print "Waiting"
    b2WaitForUpdate()
    Print "Getting"
    b2GetData()
    Print "Updating"
    b2Update(1.0/60.0)

    Print "Drawing"
    DrawCircle(circleT\x,circleT\y,20)

DrawScreen
Forever


Function DrawCircle(x,y,radius#)
    Circle x-radius,y-radius,radius*2
EndFunction

Laitan vielä mukaan dll:llänkin, niin että voitte kokeilla, jos se vaikka jollakulla toimisi. Mistäköhän mahtaa johtua... Saattaahan olla, että siellä on joku yksinkertainen virhe joka aiheuttaa tämä oudon ongelman. Tähän aikaan en ehkä ole ihan parhaassa vireessä... :D

Niin sitten noista print debuggaus jutuista vielä sen verran, että niiden "Type:" juttujen pitäisi olla 2 ja 0.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Outo bugi cb:ssä?

Post by MaGetzUb »

Returnilla pitää palauttaa ainakin 0, jos ei ole mitään palautettavaa niin CB valittaa ettei oo tarpeeksi parametreja... :)

EI TOIMI

Code: Select all

Function Asd()
Return 
End Function
TOIMII

Code: Select all

Function Asd()
Return 0
End Function
Edit: Koodi valittaaa jonkun QtCored4.DLL:n puuttumisesta.. :S Googlamalla en löydä muutakuin haittaohjelmia..
Last edited by MaGetzUb on Fri Jul 22, 2011 11:03 am, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Outo bugi cb:ssä?

Post by axu »

Muistaakseni vakiot oletusparametreinä bugaa. Eli vaihda sieltä funktion määrittelyistä b2CREATE_BODY_FLAG_NO_FLAGS nollaksi. Jos ei auta, en keksi tähän hätään muuta.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Outo bugi cb:ssä?

Post by Latexi95 »

MaGetzUb wrote:Returnilla pitää palauttaa ainakin 0, jos ei ole mitään palautettavaa niin CB valittaa ettei oo tarpeeksi parametreja... :)

EI TOIMI

Code: Select all

Function Asd()
Return 
End Function
TOIMII

Code: Select all

Function Asd()
Return 0
End Function
Edit: Koodi valittaaa jonkun QtCored4.DLL:n puuttumista.. :S Googlamalla en löydä muutakuin haittaohjelmia..
oho... En meinaa osata enää koodata cb:tä kun olen koodaillut vain c++:ssaa... :P
QtCored on QtCoren debug versio, unohdinkin, että käänsin tuon dynaamisesti linkkaavana.
axu wrote:Muistaakseni vakiot oletusparametreinä bugaa. Eli vaihda sieltä funktion määrittelyistä b2CREATE_BODY_FLAG_NO_FLAGS nollaksi. Jos ei auta, en keksi tähän hätään muuta.
Aah... Kiitos. Ne näköjään aiheuttivat tuon oudon ongelman.


Hm... Vieläkin outoja ongelmia löytyy. Jostain syystä vaikka kirjoitan dataa dll:llän ulostulo muistipalaan, niin siltikkään sinne ei tule mitään. Ja sitten jos käännän dll:llän release modissa, niin tulee MAV heti kun kutsun dll:llän "init" funktiota. Debug modissa käännetty dll:llän kutsuminen onnistuu mutta vastaus muistipala on tyhjää täynnä...
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Outo bugi cb:ssä?

Post by JATothrim »

Tervetuloa .dll:ien yhteensopivuusongelmiin CB:n kanssa. :(
CBCalcia käännellessä huomasin, että .dll toimii CB:ssä väärin, jos tietyt optimoinnit olivat päällä: Mm. GCC:n -O2 flagi saa jo CB:n yökkäämään .dll:le.

Ja niiden muistipalojen kanssa saa olla DLL:n puolella täydellinen: tavu huti (buffer overrun) ja saat satunnaisen heap corruption MAVin joka ilmestyy tyhjästä ja katoaa mitään sanomatta.
(PS: olisin suositellut cbChipmunk.dll fysiikka kirjastoa, koska kirjasto on tehty C:llä, ja ollut näin lähempänä CB:tä)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Outo bugi cb:ssä?

Post by esa94 »

JATothrim wrote:Tervetuloa .dll:ien yhteensopivuusongelmiin CB:n kanssa. :(
CBCalcia käännellessä huomasin, että .dll toimii CB:ssä väärin, jos tietyt optimoinnit olivat päällä: Mm. GCC:n -O2 flagi saa jo CB:n yökkäämään .dll:le.
Saatoit unohtaa volatile–lipun joistakin muuttujista
Post Reply