ObjectExists

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

ObjectExists

Post by KilledWhale »

Yksinkertainen funktio lähinnä aloittelijoille, jolla voit tarkistaa objektin olemassaolon ennen sen käsittelyä, jolloin välttyy tuskastuttavalta mavinetsinnältä. En kuitenkaan suosittele suurempien projektien kanssa käytettäväksi koska objektien läpikäynti jokaista objektia käsitellessä hidastanee ohjelmaa jonkin verran

Code: Select all

a = MakeObject()

Repeat
	If objectExists(a) Then DeleteObject a
Forever

Function objectExists(obj)
	InitObjectList
	Repeat
		object = NextObject()
		If object = obj Then Return True
		If object = 0 Then Return False
	Forever
EndFunction
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: ObjectExists

Post by phons »

Hei tämähän on kätevä! :P Itselle ei tullut mieleen tehdä tällaista, vaan tehdä aina erillinen muuttuja object_live.
Image
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: ObjectExists

Post by mikeful »

Code: Select all

Function objectExists(obj)
      If obj = 0 Then
            Return False
      Else
            Return True
      EndIf
EndFunction
Eikös tämä aja saman asian? Ei niitä objekteja tarvi läpi käydä.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: ObjectExists

Post by MAVmaggot »

Ei, koska objektin poistettua sen arvo pysyy samana.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: ObjectExists

Post by KilledWhale »

Deleteobject ei nollaa muuttujan arvoa, joten objektimuuttujan vertaaminen nollaan ei toimi. Toinen vaihtoehto olisi nollata objektimuuttuja ja sitten verrata.

Seuraava koodi mavittaa.

Code: Select all

a = MakeObject()
Repeat
If a Then DeleteObject a
Forever
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Tuxi
Active Member
Posts: 190
Joined: Wed Jan 21, 2009 10:25 pm
Contact:

Re: ObjectExists

Post by Tuxi »

Toimii, jos tekee näin:

Code: Select all

a = MakeObject()
Repeat
    If a Then 
        DeleteObject a
        a = 0
    EndIf
Forever
Projektit:
Jotain pientä (Ehkä vähän suurempaakin)

-Tuxi- (myös Tuxi4321)
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ObjectExists

Post by MaGetzUb »

Eikö olisi sama asia tehdä näin:

Code: Select all

Function ObjExists(obj)
Return obj<> 0
EndFunction 
Tai sitte pelkästään näin, niinkuin tuxi sanoi

Code: Select all

If Obj Then 
...koodia..
Endif
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: ObjectExists

Post by MAVmaggot »

Tuo tuxin tapa ei toimi, koska läpikäynnin tehdessä välistä puuttuu yksi luku joten se mavittaa silti.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: ObjectExists

Post by otto90x »

Tosiaan tuo objektimuuttujan nollaus objektin poiston yhteydessä lienee paras tapa. Nopein, yksinkertaisin ja kuuluu hyviin tapoihin.
MAVmaggot wrote:Tuo tuxin tapa ei toimi, koska läpikäynnin tehdessä välistä puuttuu yksi luku joten se mavittaa silti.
Mitäköhän se höpöttää? Hyvin se toimii, eikä siitä mitään lukuja puutu.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: ObjectExists

Post by MAVmaggot »

Tarkoitin jos läpikäydään objektit itse For .. Next-luupilla niin ei hyödytä arvon nollaus, mutta taas tämä funktio hyödyttää.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: ObjectExists

Post by otto90x »

MAVmaggot wrote:Tarkoitin jos läpikäydään objektit itse For .. Next-luupilla niin ei hyödytä arvon nollaus, mutta taas tämä funktio hyödyttää.
Kyllä hyödyttää. Oli objektit ladottu taulukkoon, tyyppikokoelmaan tai muistipalaan niin arvon nollaus toimii aina, jos nyt ei ole ihan miten sattuu niitä for-silmukoita laitellut.

Code: Select all

AddText  "TAULUKKO"

Dim a(9)

For i=0 To 9
    a(i) = MakeObject()
Next i

Repeat
    For i=0 To 9
        If a(i) Then
            DeleteObject a(i)
            a(i) = 0
        EndIf
    Next i
    DrawScreen
Until KeyHit(cbkeyreturn)

AddText "TYYPPIKOKOELMA"

Type b
    Field obj
End Type

For i=0 To 9
    o.b=New(b)
    o\obj = MakeObject()
Next i

Repeat
    
    For o.b = Each b
        If o\obj Then
            DeleteObject o\obj
            o\obj = 0
        EndIf
    Next o
    DrawScreen
Until KeyHit(cbkeyreturn)

AddText "MUISTIPALA"

mem = MakeMEMBlock(40)

For i=0 To 9
    PokeInt  mem,i*4,MakeObject()
Next i

Repeat
    
    For i=0 To 9
    
        obj = PeekInt(mem,i*4)
        
        If obj Then 
            DeleteObject obj
            
            PokeInt mem,i*4,0
        
        EndIf
        
    Next i
    
    DrawScreen
Until KeyHit(cbkeyreturn)
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: ObjectExists

Post by JATothrim »

otto90x wrote: Kyllä hyödyttää. Oli objektit ladottu taulukkoon, tyyppikokoelmaan tai muistipalaan niin arvon nollaus toimii aina, jos nyt ei ole ihan miten sattuu niitä for-silmukoita laitellut.
-Agree
EDIT:

Taisin joskus tehdä taulukko esimerkin noin, ei tarvii käyttää erillistä taulukkoa näyttämään aktiivisia soluja. ;)

Last edited by JATothrim on Tue May 26, 2009 6:44 pm, edited 1 time in total.
-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'.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: ObjectExists

Post by KilledWhale »

Periaatteessa objektimuuttujien nollaus on turhaa koska niidenkin jatkuva tarkastaminen syö tehoja. Paras tapa on vain opetella käyttämään objekteja ja opetella tietämään itse mitä on olemassa ja mitä ei.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: ObjectExists

Post by Jare »

Tuxi wrote:Toimii, jos tekee näin:

Code: Select all

a = MakeObject()
Repeat
    If a Then 
        DeleteObject a
        a = 0
    EndIf
Forever
Tuo toimii, jos tietää, minne sen osoittimen on sijoittanut. Mutta entä jos teet 2D-taulukon (koko vaikkapa 128x96) ja sijoitat osoittimen yhteen tämän taulukon soluista? Poistaessasi objektin sinun pitäisi käydä koko taulukko läpi löytääksesi pointterin ja voidaksesi nollata sen. Ja tämä syö tehoja. Jos osoitin jää poistamatta, se voi jossain vaiheessa tulla esiin ohjelmassa ja aiheuttaa MAV:n, jos objektin olemassa oloa ei tarkisteta 100% varmuudella.
KilledWhale wrote:Periaatteessa objektimuuttujien nollaus on turhaa koska niidenkin jatkuva tarkastaminen syö tehoja. Paras tapa on vain opetella käyttämään objekteja ja opetella tietämään itse mitä on olemassa ja mitä ei.
Entä mitenkäs vältytään kokonaan objektimuuttujien tarkistamiselta? Väliaikaiset muuttujat toki tuhoutuvat funktiokutsujen lopussa ja vievät vanhat osoittimet mennessään, mutta miten sitten globaalien muuttujien, taulukoiden, tyyppien kenttien yms. kanssa? Usein pakko tarkistaa jollakin tapaa.

P.S. Uskon ettei kaikkia objekteja tarvitse käydä läpi vain saadakseen tietää, onko tietty objekti olemassa vai ei. MEMBlockSize()-funktio voisi paljastaa asian, jos sille syöttäisi objektiosoittimen. Kuvien kanssa toimii ainakin, joten luulisin että myös objektien tarkistaminen onnistuisi sillä.
Post Reply