Tyhmät kysymykset (I/2012)
-
- Devoted Member
- Posts: 718
- Joined: Wed Nov 03, 2010 7:56 pm
- Location: Joku piste pohjoisessa.
Re: Tyhmät kysymykset (I/2011)
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
Re: Tyhmät kysymykset (I/2011)
Exenpurkamis... UPX pakattu -> UPX -d filu.exe. Tässä vähän varmaa kysymykseesi liittyen asiaa viewtopic.php?p=38114#p38114naputtelija wrote:Hmm... Jossain täälläpäin oli joku exenpurkamistuto. Voisitteko vähän täsmentää, kuka sen kirjoitti ja mistä se löytyy?
-
- Devoted Member
- Posts: 718
- Joined: Wed Nov 03, 2010 7:56 pm
- Location: Joku piste pohjoisessa.
Re: Tyhmät kysymykset (I/2011)
Kiitos. Minulla olisi matematiikassa sellainen yhtälö, jota en ymmärrä:Viltzu wrote:Exenpurkamis... UPX pakattu -> UPX -d filu.exe. Tässä vähän varmaa kysymykseesi liittyen asiaa viewtopic.php?p=38114#p38114naputtelija wrote:Hmm... Jossain täälläpäin oli joku exenpurkamistuto. Voisitteko vähän täsmentää, kuka sen kirjoitti ja mistä se löytyy?
(2e^4/3e^5)^2 pitäisi olla sievennettynä 4/9e^2. Minä en vain ymmärrä, miten se sievennetään. Auttaisitteko idioottia?
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Tyhmät kysymykset (I/2011)
Jos millään tapaa selventää. Eli jaettaessa potenssit voi yksinkertaisesti vähentää, a^x/a^y = a^(x-y). Ja koska e:n potenssi jäisi tuossa negatiiviseksi, se jää jakajaan. Ja yleisenä huomiona, virtuaalimaailmoissa pyöriessä kannattaa kirjoittaa a/(bc) eikä vain a/bc, esimerkiksi kaikki näkemäni laskimet laskevat jälkimmäisen muodossa (a/b)c, mikä on tyystin eri asia kuin haluttiin. a/b/c toimii myös.
Re: Tyhmät kysymykset (I/2011)
Huomasin myös, että Insertissä on erikoinen bugi. Yritäpä saada joku kokoelman jäsen toiseksi jäseneksi. Insert t, After(First(mytype)) lisääkin t:n yllättävästi kolmanneksi jäseneksi :S
Tässäpä hyvin pelkistetty koodi, jonka tarkoituksena on vain saada jäsenet järjestykseen. Kaatuu Insertin kohdalla seuraavanlaiseen virheilmoitukseen: "ERROR: Memory leak due to invalid type access attempt." (eli älä aja jos tämä pelottaa).
Code: Select all
Type Block
Field Z#
End Type
For i = 1 To 10
nB.Block = New(Block)
nB\Z = Rnd(50)
Next i
Repeat
Swap = False
iB.Block = After(First(Block))
While iB <> NULL
jB.Block = Before(iB)
If iB\Z > jB\Z Then Insert iB, Before(jB) : Swap = True
iB = After(iB)
Wend
Until Swap = False
Tuohan tietenkin kaatuu heti ensimmäisellä kerralla, koska Before(jB) = Before(Before(iB)) = Before(Before(After(First(Block))) = Before(First(Block)). Mutta kaatuu se silti vaikka menisi muuttamaan tuon rivin 12 iB.Block = After(After(First(Block))), en keksi järkevää syytä.
Re: Tyhmät kysymykset (I/2011)
Voisin kuvitella, että tämä on helpointa toteuttaa käyttämällä kahta tyyppikokoelmaa, joista ensimmäistä oikeasti käytetään ja toinen on melkein koko ajan jäsenetön, mutta pitää sisällään samat fieldit kuin ensimmäinenkin. Sitten tarkistaa, mikä tyyppikokoelman 1 jäsenistä on tietyltä numeroarvoltaan suurin tai pienin ja tekee identtisen uuden jäsenen tyyppikokoelmaan 2 ja poistaa sen jäsenen tyyppikokoelmasta 1. Sitten toistaa tätä kunnes tyyppikokoelma 1 on tyhjä, ja sitten samaan tapaan "kopioi" jäsenet tyyppikokoelmasta 2 kokoelmaan 1, mutta tällä kertaa sen voi tehdä suoraan järjestyksessä ja sitten poistaa ne kokoelmasta 2.axu wrote:Olen yrittänyt tässä kirjoittaa koodia, joka järjestäisi typekokoelman jäsenet tietyn numeerisen arvon mukaan, mutta jostakin syystä en nyt saa aikaiseksi edes hitaasti toimivaa järjestysfunktiota. Milloin ohjelma jää ikuiseen silmukkaan, milloin kaatuu Mitä Auttavimpiin Virheilmoituksiin ja sain aikaan jopa virheimoituksen, jota en ollut ennen nähnyt :O
Huomasin myös, että Insertissä on erikoinen bugi. Yritäpä saada joku kokoelman jäsen toiseksi jäseneksi. Insert t, After(First(mytype)) lisääkin t:n yllättävästi kolmanneksi jäseneksi :S
Tässäpä hyvin pelkistetty koodi, jonka tarkoituksena on vain saada jäsenet järjestykseen. Kaatuu Insertin kohdalla seuraavanlaiseen virheilmoitukseen: "ERROR: Memory leak due to invalid type access attempt." (eli älä aja jos tämä pelottaa).Code: Select all
Type Block Field Z# End Type For i = 1 To 10 nB.Block = New(Block) nB\Z = Rnd(50) Next i Repeat Swap = False iB.Block = After(First(Block)) While iB <> NULL jB.Block = Before(iB) If iB\Z > jB\Z Then Insert iB, Before(jB) : Swap = True iB = After(iB) Wend Until Swap = False
EDIT:Tuohan tietenkin kaatuu heti ensimmäisellä kerralla, koska Before(jB) = Before(Before(iB)) = Before(Before(After(First(Block))) = Before(First(Block)). Mutta kaatuu se silti vaikka menisi muuttamaan tuon rivin 12 iB.Block = After(After(First(Block))), en keksi järkevää syytä.
Ei varmasti ole optimaalisin tapa, ja voi olla vaikea hyödyntää jotain universaalisti toimivaa funktiota tehdessä, mutta tällä tavalla minä tämän ongelman ratkaisin joku aika takaperin kun tällaista systeemiä yhdessä projektissa tarvitsin.
Re: Tyhmät kysymykset (I/2011)
Kuulostaa kyllä aika työläältä ja hitaalta tavalta... Mietin, voisiko jotain tehdä tallentamalla muistipaloihin typeosoittimet (converttointeger), järjestämällä muistipalan sisällä osoittimet järjestykseen ja siitä jotenkin muutettua itse tyyppikokoelman jäsenet.Chaosworm wrote:Voisin kuvitella, että tämä on helpointa toteuttaa käyttämällä kahta tyyppikokoelmaa, joista ensimmäistä oikeasti käytetään ja toinen on melkein koko ajan jäsenetön, mutta pitää sisällään samat fieldit kuin ensimmäinenkin. Sitten tarkistaa, mikä tyyppikokoelman 1 jäsenistä on tietyltä numeroarvoltaan suurin tai pienin ja tekee identtisen uuden jäsenen tyyppikokoelmaan 2 ja poistaa sen jäsenen tyyppikokoelmasta 1. Sitten toistaa tätä kunnes tyyppikokoelma 1 on tyhjä, ja sitten samaan tapaan "kopioi" jäsenet tyyppikokoelmasta 2 kokoelmaan 1, mutta tällä kertaa sen voi tehdä suoraan järjestyksessä ja sitten poistaa ne kokoelmasta 2.
Ei varmasti ole optimaalisin tapa, ja voi olla vaikea hyödyntää jotain universaalisti toimivaa funktiota tehdessä, mutta tällä tavalla minä tämän ongelman ratkaisin joku aika takaperin kun tällaista systeemiä yhdessä projektissa tarvitsin.
Re: Tyhmät kysymykset (I/2011)
Code: Select all
määrä=10
//luodaan lista alkioille
lista=MakeMEMBlock(4+määrä*4)
//ensimmäiset neljä tavua merkkaa alkioiden määrää
PokeInt lista,0,määrä
//näin voidaan varata listaan kokoa ennen sen käyttöä
//sillä listan koon muuttaminen jatkuvasti vie aikaa
For i=1 To määrä
//luodaan uusi alkio
alkio=MakeMEMBlock(8)
PokeFloat alkio,0,Rnd(-1.0,1.0)
PokeInt alkio,4,Rand(1,1000)
Print PeekInt(alkio,4)+" "+PeekFloat(alkio,0)
//kirjoitetaan alkio listaan
PokeInt lista,i*4,alkio
Next i
Print "---"
t=Timer()
//järjestetään lista 0 tavusta alkavan liukuluvun suhteen
lista=QuickSortByFloat(lista,0)
//tai kokonaisluvun mukaan
//lista=QuickSortByInt(lista,4)
t= Timer()-t
//haetaan niin monta alkiota kuin lista sisältää
For i=1 To määrä
alkio=PeekInt(lista,i*4)
//tulostetaan arvot
Print PeekInt(alkio,4)+" "+PeekFloat(alkio,0)
Next i
Print "Sorting took "+t+" ms!"
WaitKey
//List on muistipala jonka alussa on kokonaislukuna alkioiden lukumäärä
//Alkiot ovat omia muistipalojansa ja voivat sisältää mitä tahansa arvoja
//Funktio etsii järjestettävää desimaalilukua alkiosta floatposition arvon perusteella,
//oletuksena alkion alusta.
Function QuickSortByFloat(list,floatposition=0)
//http://en.wikipedia.org/wiki/Quicksort
listsize = PeekInt(list,0)
If listsize=1 Then Return list
pivot = Rand(1,listsize)
pivotitem = PeekInt(list,pivot*4)
pivotvalue# = PeekFloat(pivotitem,floatposition)
For i=1 To listsize
If i<>pivot Then
iteritem = PeekInt(list,i*4)
If iteritem Then
itervalue# = PeekFloat(iteritem,floatposition)
If itervalue# < pivotvalue# Then
If Not lesserlist Then lesserlist = MakeMEMBlock(listsize*4)
lesserlistitems = lesserlistitems + 1
PokeInt lesserlist,lesserlistitems*4,iteritem
ElseIf itervalue# > pivotvalue# Then
If Not greaterlist Then greaterlist = MakeMEMBlock(listsize*4)
greaterlistitems = greaterlistitems + 1
PokeInt greaterlist,greaterlistitems*4,iteritem
ElseIf itervalue# = pivotvalue# Then
If Not pivotlist Then pivotlist = MakeMEMBlock(listsize*4)
PokeInt pivotlist, pivotlistitems*4,iteritem
pivotlistitems = pivotlistitems+1
EndIf
EndIf
EndIf
Next i
listpointer=4
If lesserlistitems > 0 Then
PokeInt lesserlist,0,lesserlistitems
If lesserlistitems > 1 Then sortedless = QuickSortByFloat(lesserlist,floatposition) Else sortedless = lesserlist
sortedlesssize = PeekInt(sortedless,0)
MemCopy sortedless,4,list,listpointer,sortedlesssize*4
listpointer=listpointer+sortedlesssize*4
DeleteMEMBlock sortedless
EndIf
PokeInt list,listpointer,pivotitem
listpointer=listpointer+4
If pivotlistitems > 0 Then
MemCopy pivotlist,0,list,listpointer,pivotlistitems*4
DeleteMEMBlock pivotlist
listpointer=listpointer+pivotlistitems*4
EndIf
If greaterlistitems > 0 Then
PokeInt greaterlist,0,greaterlistitems
If greaterlistitems> 1 Then sortedgreater = QuickSortByFloat(greaterlist,floatposition) Else sortedgreater = greaterlist
sortedgreatersize = PeekInt(sortedgreater,0)
MemCopy sortedgreater,4,list,listpointer,sortedgreatersize*4
DeleteMEMBlock sortedgreater
EndIf
PokeInt list,0,(sortedlesssize+1+pivotlistitems+sortedgreatersize)
Return list
End Function
//List on muistipala jonka alussa on kokonaislukuna alkioiden lukumäärä
//Alkiot ovat omia muistipalojansa ja voivat sisältää mitä tahansa arvoja
//Funktio etsii järjestettävää kokonaislukua alkiosta intposition arvon perusteella,
//oletuksena alkion alusta.
Function QuickSortByInt(list,intposition=0)
//http://en.wikipedia.org/wiki/Quicksort
listsize = PeekInt(list,0)
If listsize=1 Then Return list
pivot = Rand(1,listsize)
pivotitem = PeekInt(list,pivot*4)
pivotvalue = PeekInt(pivotitem,intposition)
For i=1 To listsize
If i<>pivot Then
iteritem = PeekInt(list,i*4)
If iteritem Then
itervalue = PeekInt(iteritem,intposition)
If itervalue < pivotvalue Then
If Not lesserlist Then lesserlist = MakeMEMBlock(listsize*4)
lesserlistitems = lesserlistitems + 1
PokeInt lesserlist,lesserlistitems*4,iteritem
ElseIf itervalue > pivotvalue Then
If Not greaterlist Then greaterlist = MakeMEMBlock(listsize*4)
greaterlistitems = greaterlistitems + 1
PokeInt greaterlist,greaterlistitems*4,iteritem
ElseIf itervalue = pivotvalue Then
If Not pivotlist Then pivotlist = MakeMEMBlock(listsize*4)
PokeInt pivotlist, pivotlistitems*4,iteritem
pivotlistitems = pivotlistitems+1
EndIf
EndIf
EndIf
Next i
listpointer=4
If lesserlistitems > 0 Then
PokeInt lesserlist,0,lesserlistitems
If lesserlistitems > 1 Then sortedless = QuickSortByInt(lesserlist,intposition) Else sortedless = lesserlist
sortedlesssize = PeekInt(sortedless,0)
MemCopy sortedless,4,list,listpointer,sortedlesssize*4
listpointer=listpointer+sortedlesssize*4
DeleteMEMBlock sortedless
EndIf
PokeInt list,listpointer,pivotitem
listpointer=listpointer+4
If pivotlistitems > 0 Then
MemCopy pivotlist,0,list,listpointer,pivotlistitems*4
DeleteMEMBlock pivotlist
listpointer=listpointer+pivotlistitems*4
EndIf
If greaterlistitems > 0 Then
PokeInt greaterlist,0,greaterlistitems
If greaterlistitems> 1 Then sortedgreater = QuickSortByInt(greaterlist,intposition) Else sortedgreater = greaterlist
sortedgreatersize = PeekInt(sortedgreater,0)
MemCopy sortedgreater,4,list,listpointer,sortedgreatersize*4
DeleteMEMBlock sortedgreater
EndIf
PokeInt list,0,(sortedlesssize+1+pivotlistitems+sortedgreatersize)
Return list
End Function
Re: Tyhmät kysymykset (I/2011)
Tämä olisi muuten hyvä idea, mutta koodista tulee helposti vaikeaselkoista kun dataa on paljon (>10 muuttujaa) ja merkkijonoja ei voi toteuttaa järkevästi.MetalRain wrote:Tai sitten voi käyttää pelkästään muistipaloja.
Huomasin muuten, että käytät tuossa QuickSortia järjestysalgoritmina. Itse olin ajatellut käyttää Insertion Sortia, mutta en ole oikein varma. Käyttötarkoitus on järjestää kokoelman jäsenet piirtojärjestykseen. Pelissä ei ole montaa liikkuvaa asiaa, joten järjestys on useimmiten lähes oikea, muutama jäsen on väärässä paikassa. Todennäköisesti järjestettäviä kohteita on 10-40. Kumpi on tällöin nopeampi? Toisaalta minulla olisi kätkössä jo valmis CombSort11 implementaatio, mitenköhän se toimisi tässä?
Hyvin nukutun yön jälkeen aloin miettiä ongelmaa toisesta näkökulmasta. Miksi minun pitäisi käydä tyyppikokoelma läpi For...Each lausekkeella? Edellisestä ajatuksestani voi jättää viimeisen kohdan pois, eli tyypit saa jäädä koskemattomaksi, laaditaan vain taulukko (tai muistipala), joka sisältää jäsenten osoittimet ja läpikäydään aina siinä järjestyksessä. Koodina kutakuinkin näin:
Code: Select all
Dim Tyypit(1)
For iB.Block = Each Block
n + 1
Next iB
ReDim Tyypit(n)
iB = First(Block)
For i = 0 To n - 1
Tyypit(i) = ConvertToInteger(iB)
iB = After(iB)
Next i
//---järjesteleminen tähän
For i = 0 To n - 1
iB = ConvertToType(Tyypit(i))
//Tähän jotain toimintaa
Next i
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Re: Tyhmät kysymykset (I/2011)
Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
Re: Tyhmät kysymykset (I/2011)
eli huolimatta pelaajan kulmasta viholliseen nähden, vihollinen kääntyy samaa tasaista vauhtia pelaajaa kohti.
curveanglella ja pointobjectilla molemmilla tulee tietyissä tilanteissa liian jyrkät kääntymiset.
Re: Tyhmät kysymykset (I/2011)
En nyt jaksa miettiä läpikotaisin miten se tapahtuu, mutta kyseessähän on 2 askelta: 1. Selvitetään pitääkö kääntyä myötä- vai vastapäivään. 2. Käännytään halutun määrän verran.duck wrote:miten toteutetaan vihollisen tasainen kääntyminen pelaajaa kohti?
eli huolimatta pelaajan kulmasta viholliseen nähden, vihollinen kääntyy samaa tasaista vauhtia pelaajaa kohti.
curveanglella ja pointobjectilla molemmilla tulee tietyissä tilanteissa liian jyrkät kääntymiset.
Toinen kohta tuskin tuottaa vaikeuksia, mutta ensimmäinen niinkin. Tätä varten vihollisen nykyisen kulman ja vihollisen ja pelaajan välisen kulman erotus pitää ensin selvittää. Sitten tutkitaan, pitääkö kääntyä vastapäivään (positiivinen suunta), eli onko tuo kulma 0<x<180 vai myötäpäivään, 180<x<360.
Re: Tyhmät kysymykset (I/2011)
ehkä vielä illalla saa taas päivitystä projektiin
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Tai sitten siitä, että tuota MakeErroria oli lähemmäs kahtasataatuhattariviä. Pelleilin sisentäjällä, ja siitä tulikin sitten lisääjä. Täytti koko tiedoston ensimmäisellä merkkijonollatimpe99 wrote:Johtuu luultavasti siitä, että sinulla on liian paljon täysin samanlaisia komentoja peräkkäin joten CoolBasicin exenkirjoittaja valittaa.EDIT:Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
Onko CB:ssä muuten minkäänlaista koodirajoitusta? Siis sillein että johonkin pisteeseen asti antaa koodata, mutta sen jälkeen antaa Erroria, että vähennä koodia??
Re: Tyhmät kysymykset (I/2011)
No tuotahan minä juuri tarkoitin. Ja ei ole mitään koodirajaa ainakaan minun tietääkseni, jos olisi niin joku jolle se on tullut vastaan olisi varmaan kirjoitellut asiasta foorumille.Konstaduck wrote:Tai sitten siitä, että tuota MakeErroria oli lähemmäs kahtasataatuhattariviä. Pelleilin sisentäjällä, ja siitä tulikin sitten lisääjä. Täytti koko tiedoston ensimmäisellä merkkijonollatimpe99 wrote:Johtuu luultavasti siitä, että sinulla on liian paljon täysin samanlaisia komentoja peräkkäin joten CoolBasicin exenkirjoittaja valittaa.EDIT:Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
Onko CB:ssä muuten minkäänlaista koodirajoitusta? Siis sillein että johonkin pisteeseen asti antaa koodata, mutta sen jälkeen antaa Erroria, että vähennä koodia??
Re: Tyhmät kysymykset (I/2011)
Okei tämä selvä. [/edit]Chaosworm wrote:Minulla ainakin yli 100 000 riviä näkyi toimivan ihan hyvin.
Re: Tyhmät kysymykset (I/2011)
Minulla ainakin yli 100 000 riviä näkyi toimivan ihan hyvin.Viltzu wrote:Muistelisin että editorissa oli jokin jännyys eikä näyttänyt kaikkia rivejä kun niitä oli paljon. Yli 6000 riviä. En enää edes muista mistä tämä tieto on peräisin enkä edes nyt jaksa testailla.
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Ja tuo koko virheilmoitus menee näin: Sovellus tai DLL C:/Program Files/CoolBasic/Omat/Funktiokirjastot/cbChipmunk/cbChipmunk/cbChipmunk.cb ei ole kelvolinen windows NT - vedos. Tarkista tämä asennuslevykkeeltä