Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Vektoriongelma

KoodiNoppa [19.06.2008 15:59:23]

#

Seuraava luokka aiheuttaa ongelmia...

class object
{
	private:
		vector<triangle> triangles;
		int triAmount,quadAmount;
		vector<quad> quads;
		vec3 pos;
	public:
		object(){pos.x=pos.y=pos.z=triAmount=quadAmount=0;}
		object& operator=(const object &o)
		{
			triangles.clear();
			quads.clear();
			triAmount=o.triAmount;
			quadAmount=o.quadAmount;
			triangles.assign(o.triangles.begin(),o.triangles.end());
                        quads.assign(o.quads.begin(),o.quads.end());
			return *this;
  		}
		object& operator+=(const object &o)
		{
			triangles.assign(o.triangles.begin(),o.triangles.end());
			quads.assign(o.quads.begin(),o.quads.end());
			triAmount+=o.triAmount;
			quadAmount+=o.quadAmount;
    			return *this;
  		}
  		object& operator+=(const triangle &tr)
		{
			triAmount++;
			triangles.resize(triAmount);
			triangles[triAmount-1]=tr;
    			return *this;
  		}
  		object& operator*=(const matrix3 &m)
  		{
			int x;
			for (x=0; x<triAmount; x++)
			{
				(triangles[x])-=pos;
				(triangles[x])*=m;
				(triangles[x])+=pos;
			}
			return *this;
		}
  		~object(){triangles.erase(triangles.begin(),triangles.end());}
};

...jos käyttää *= -operaattoria. Kun ohjelma sulkeutuu, tulee "Ohjelma lakkasi toimimasta" -viesti. Jos ohjelmaa debuggaa, tulee "access violation" -ikkuna.

Triangle ja quad ovat luokkia, jotka eivät sisällä dynaamista muistia käyttäviä jäsenmuuttujia ja toimivat niin kuin pitääkin. Kaikki niiden koodissa käytetyt operaattorit on määritelty ja testattu.

Ohjelma kaatuu vasta kun object tuhotaan.

vidar [19.06.2008 18:00:29]

#

Eikös triAmountin ja quadAmountin tilalla kävisi ihan hyvin triangles.size() ja quads.size()? Ja täytyykö dtorissa tyhjätä trianglesia erikseen, miksei vektorin oma dtor käy? Tai vector.clear().

triAmount++;
triangles.resize(triAmount);
triangles[triAmount-1]=tr;

näyttää purkalta, voisi korvata triangles.push_back(tr). Ja toimiiko tuo object& operator+=(const object &o)? vector.assign() tuhoaa vektorin vanhan sisällön, mutta tri/quadAmountia kasvatetaan.

// jos objektiin lisätty +=:lla muita objekteja,
// triAmount näyttää mitä sattuu
for (x=0; x<triAmount; x++) {
    (triangles[x])-=pos; // vektorin indeksoija ei tarkista rajoja -> PAM, ylivuoto
    (triangles[x])*=m; // koita vaikka triangles.at(x), joka heittää exceptionin ylivuodon sattuaessa
    (triangles[x])+=pos;
}

KoodiNoppa [19.06.2008 18:41:11]

#

vector.size()... Miksei?
Vector.erase() jäi koodiin, kun yritin korjata sitä. Ja quadsin tyhjennys unohtui.

vidar kirjoitti:

vector.assign tuhoaa vektorin vanhan sisällön

Tässä siis on itse syy ohjelman kaatumiseen... Mitä jos korvaan vector.insert()-funktiolla?


Siitä vector.size()-funktiosta vielä... Minkä arvon se palauttaa vektorin luomisen jälkeen? 0 vai 1?

vidar [19.06.2008 20:33:26]

#

insertin pitäisi toimia ihan ok. size() palauttaa elementtien määrän, eli 0, ellei yhtään ole lisätty.

Metabolix [21.06.2008 12:16:05]

#

Destruktorissa on aivan turha tyhjentää vektoria, koska vektorin destruktoria kutsuttaessa se tyhjenee kuitenkin itsestään. Tosiaan omat kokomuuttujat ovat turhia ja altistavat uusille virheille.

Sijoituksen voi hoitaa suoraan vektorien sijoitusoperaattorilla:

triangles = o.triangles;
quads = o.quads;

Erillistä tyhjennystä ei tarvita, ei myöskään assign-funktion kanssa, koska sekin korvaa vanhan sisällön.

Vastaus

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

Tietoa sivustosta