Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] For Each lista ei päivity

Sivun loppuun

ErroR++ [18.06.2013 12:01:16]

#

Moi!!

Teen XNA:lla pelimoottoria, mutta XNA ei liity tähän viestiin varsinaisesti. Teen siihen pelimoottoriin grafiikan testauksena kaaos-mapin. Eli siis generoidaan randomilla kaaos. Mutta kun asetan chunk-listaan vertexejä for eachilla, ne eivät jää sinne listaan.

'_map on instanssi Map-oliosta
'Map.chunks on lista MapChunk-structuurista
'käydään kaikki chunkit läpi
For Each c As MapChunk In _map.chunks
                'vertex list
                Dim vl As New List(Of VertexPositionColor)
                'luodaan vertexit randomilla
                For i = 1 To 12
                    vl.Add(New VertexPositionColor(New Vector3(rand.Next(0, 40), rand.Next(0, 40), rand.Next(0, 40)), Color.Red))
                Next
                'neljä seuraavaa ovat nextin jälkeen taas oletusarvoissaan
                'eli primType = TriangleList, startVertex = 0, _buf = Nothing
                c.vBuffer.primType = rand.Next(0, 3)
                c.vBuffer.startVertex = 0
                c.vBuffer._buf = New VertexBuffer(gd, VertexPositionColor.VertexDeclaration, vl.Count, BufferUsage.None)
                c.vBuffer._buf.SetData(Of VertexPositionColor)(vl.ToArray())
            Next

gamehouse [18.06.2013 20:10:11]

#

Nollaat listan jokaisella forin suorituskerralla luomalla sen uudestaan.
Siirrä

Dim vl As New List(Of VertexPositionColor)

ennen foreachia niin toimii.

ErroR++ [19.06.2013 17:22:07]

#

Se lista pitää nollata. Siis Map.chunks-listaan ei jää ne arvot.

Metabolix [19.06.2013 17:36:35]

#

Voisitko nyt selittää kunnolla vielä, millä tavalla olet todennut ongelman? Oletko varma, että tuo lisäyskoodi ajetaan? Missä kohti näet, että verteksejä ei olekaan? Oletko varma, että verteksejä ei ole, vai voiko vika olla jossain muussa (esim. et jostain syystä piirrä niitä, vaikka ne ovat olemassa)? Mitä verteksien lisäyksen ja puuttumisen välissä tapahtuu?

Juuri tällainen ongelma sinun pitäisi itse pystyä ratkaisemaan, kunhan vain seuraat koodia lisäyksestä eteenpäin häviämiseen asti. Kukaan muu ei voi tehdä sitä puolestasi tuon koodinpätkän perusteella. Muuttujat eivät yleensä myöskään muutu itsestään, vaan kaikille muutoksille pitää löytyä jokin selitys omasta koodistasi.

ErroR++ [19.06.2013 18:42:46]

#

No nyt debuggasin uudestaan koodin ja ne arvot eivät asetu ollenkaan. Eli jos laitan sinne c.vBuffer.startVertex = 4, niin se pysyy nollana. Olen debugannut ja tutkinut tuon koodin läpi monta kertaa enkä ole löytänyt virhettä.
Katsoin vielä kerran, ettei muualla koodissa ole bugia. Silloin nämä arvot asetuivat mutta heti kun tuli next, ne katosivat.

Metabolix [20.06.2013 09:05:45]

#

Katso nyt vielä kerran, suoritetaanko tuota asetusriviä ollenkaan. Siis jos et osaa käyttää debuggeria, laita sinne vaikka jokin MessageBox, jotta varmasti näet tuloksen. Sitten opettele käyttämään debuggeria ja aja vaikka step-tilassa koodia rivi kerrallaan, kunnes löydät kohdan, jossa arvo muuttuu.

ErroR++ [20.06.2013 17:14:16]

#

Siis nimenomaan menin rivi kerrallaan koko ohjelman. Eli kaikki koodi ajetaan niin kuin pitää, mutta arvot muuttuvat takaisin oletuksiksi Next -rivillä.

Metabolix [20.06.2013 17:50:28]

#

Ahaa, listassasi onkin tietueita (Structure) eikä olioita. Siinä tapauksessa arvot todellakin menevät hukkaan tuossa silmukassa, koska silmukka käsittelee aina kopioita listan arvoista. Tämä on erityisen helppo nähdä lukujen kohdalla:

For Each i As Integer In luvut
	i = 1 ' Tässä i muuttuu mutta luvut-lista ei muutu.
Next

Kun lista ”sisältää olioita”, listassa on oikeasti vain viittauksia (osoittimia). VB.NETissä olioita käsitellään aina viittauksina. Vaikka viittauksesta luodaan kopio, se viittaa yhä samaan olioon, ja siksi oliota voi muokata silmukassa. Sen sijaan tietuetta käsitellään kokonaisena kuten lukujakin, jolloin silmukassa näkyy vain kopio tietueesta ja sen muokkaaminen ei auta. (Toisaalta jos tietueen jäsenenä on edelleen viittaus olioon, kyseisen olion muutokset taas onnistuvat, koska viittaus on sama myös tietueen kopiossa.)

Vaihda tietue luokaksi, tai joudut tekemään kummia purkkaviritelmiä: itse en ainakaan löytänyt netistä neuvoa, jolla listan alkioita pystyisi muokkaamaan, eli ainoa neuvo olisi käyttää tavallista For-silmukkaa ja joka kierroksella hakea arvo, muokata sitä ja tallentaa se takaisin samaan kohtaan. Toki VB.NET-tietoni ovat vähäiset, joten joku spesialisti saa tulla paikkaamaan.

ErroR++ [20.06.2013 18:09:21]

#

Kiitos paljon!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta