<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[problem mit vektoren]]></title><description><![CDATA[<p>also ich habe ein grid gebastelt, welches ein zweidimensionaler array aus vektoren ist, um bei der interaktion zwischen meine partikeln die rechenzeit zu reduzieren (es werden nur die partikel aus umliegenden zeilen/spalten einbezogen)</p>
<pre><code class="language-cpp">struct particle
{
	double x;
	double y;
	double xVel;
	double yVel;
	POINT gridPos;
	Uint32 color;
	int gridId;
};
</code></pre>
<pre><code class="language-cpp">vector&lt;particle&gt; particleGrid[(SCREEN_WIDTH-1)/GRID_RESOLUTION][(SCREEN_HEIGHT-1)/GRID_RESOLUTION];
vector&lt;particle&gt; particles;
</code></pre>
<pre><code class="language-cpp">POINT getGridPos(particle p)
{
	POINT ret;
	ret.x = (p.x*GRID_RESOLUTION)/SCREEN_WIDTH;
	ret.y = (p.y*GRID_RESOLUTION)/SCREEN_HEIGHT;
	return ret;
}
</code></pre>
<pre><code class="language-cpp">for(int p = 0; p &lt; PARTICLE_COUNT; p++)
	{
		particle tmp;
		tmp.x = rand()%SCREEN_WIDTH;
		tmp.y = rand()%SCREEN_HEIGHT;
		tmp.xVel = ((rand()%40) - 20)/10.;
		tmp.yVel = ((rand()%40) - 20)/10.;
		tmp.color = SDL_MapRGB( screen-&gt;format, 1, 0, 0);
		tmp.gridPos = getGridPos(tmp);
		tmp.gridId = particleGrid[tmp.gridPos.x][tmp.gridPos.y].size();
		particleGrid[tmp.gridPos.x][tmp.gridPos.y].push_back(tmp);

		particles.push_back(tmp);
	}
</code></pre>
<pre><code class="language-cpp">for(int k = 0; k &lt; PARTICLE_COUNT; k++)
		{
			particle tmp = particles.at(k);
			//[...]
			//grispos:
			POINT nGridPos = getGridPos(tmp);
			if(nGridPos.x != tmp.gridPos.x || nGridPos.y != tmp.gridPos.y)
			{
				//gridpos changed!
				if(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size() &gt; 0)
				{
					//kopiere letztes element an die position des zu löschenden elements
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size()-1).gridId = tmp.gridId;
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(tmp.gridId) = particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size()-1);
					//lösche letztes element
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].pop_back(); //&lt;--------------
					//partikel kommt in den neuen vektor
					tmp.gridPos = nGridPos;
					tmp.gridId = particleGrid[nGridPos.x][nGridPos.y].size();
					particleGrid[nGridPos.x][nGridPos.y].push_back(tmp);
				}
			}

			/[...]
			particles.at(k) = tmp;
		}
</code></pre>
<p>wenn ich die markierte zeile(&lt;------) auskommentiere, dann läuft es, wird aber natürlich immer langsamer, da die vektoren immer voller werden. wenn ich die zeile nicht auskommentiere, kriege ich bei 80 partikeln, nach weniger als ner halben sekunde nen zugriffsfehler!<br />
warum? ich finde den fehler einfach nicht!<br />
EDIT:</p>
<p>MAHH natürlich..ich depp...<br />
die partikel in particles und particleGrid sind nicht die gleichen gnaaaaa</p>
<p>wie kann ich im grid zeigen auf die elemente im anderen vektor speichern ?</p>
<p>ok..hab jetzt einfach die positionen in particles im grid gespeichert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184311/problem-mit-vektoren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 15:35:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184311.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Jun 2007 08:24:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit vektoren on Thu, 14 Jun 2007 08:38:09 GMT]]></title><description><![CDATA[<p>also ich habe ein grid gebastelt, welches ein zweidimensionaler array aus vektoren ist, um bei der interaktion zwischen meine partikeln die rechenzeit zu reduzieren (es werden nur die partikel aus umliegenden zeilen/spalten einbezogen)</p>
<pre><code class="language-cpp">struct particle
{
	double x;
	double y;
	double xVel;
	double yVel;
	POINT gridPos;
	Uint32 color;
	int gridId;
};
</code></pre>
<pre><code class="language-cpp">vector&lt;particle&gt; particleGrid[(SCREEN_WIDTH-1)/GRID_RESOLUTION][(SCREEN_HEIGHT-1)/GRID_RESOLUTION];
vector&lt;particle&gt; particles;
</code></pre>
<pre><code class="language-cpp">POINT getGridPos(particle p)
{
	POINT ret;
	ret.x = (p.x*GRID_RESOLUTION)/SCREEN_WIDTH;
	ret.y = (p.y*GRID_RESOLUTION)/SCREEN_HEIGHT;
	return ret;
}
</code></pre>
<pre><code class="language-cpp">for(int p = 0; p &lt; PARTICLE_COUNT; p++)
	{
		particle tmp;
		tmp.x = rand()%SCREEN_WIDTH;
		tmp.y = rand()%SCREEN_HEIGHT;
		tmp.xVel = ((rand()%40) - 20)/10.;
		tmp.yVel = ((rand()%40) - 20)/10.;
		tmp.color = SDL_MapRGB( screen-&gt;format, 1, 0, 0);
		tmp.gridPos = getGridPos(tmp);
		tmp.gridId = particleGrid[tmp.gridPos.x][tmp.gridPos.y].size();
		particleGrid[tmp.gridPos.x][tmp.gridPos.y].push_back(tmp);

		particles.push_back(tmp);
	}
</code></pre>
<pre><code class="language-cpp">for(int k = 0; k &lt; PARTICLE_COUNT; k++)
		{
			particle tmp = particles.at(k);
			//[...]
			//grispos:
			POINT nGridPos = getGridPos(tmp);
			if(nGridPos.x != tmp.gridPos.x || nGridPos.y != tmp.gridPos.y)
			{
				//gridpos changed!
				if(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size() &gt; 0)
				{
					//kopiere letztes element an die position des zu löschenden elements
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size()-1).gridId = tmp.gridId;
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(tmp.gridId) = particleGrid[tmp.gridPos.x][tmp.gridPos.y].at(particleGrid[tmp.gridPos.x][tmp.gridPos.y].size()-1);
					//lösche letztes element
					particleGrid[tmp.gridPos.x][tmp.gridPos.y].pop_back(); //&lt;--------------
					//partikel kommt in den neuen vektor
					tmp.gridPos = nGridPos;
					tmp.gridId = particleGrid[nGridPos.x][nGridPos.y].size();
					particleGrid[nGridPos.x][nGridPos.y].push_back(tmp);
				}
			}

			/[...]
			particles.at(k) = tmp;
		}
</code></pre>
<p>wenn ich die markierte zeile(&lt;------) auskommentiere, dann läuft es, wird aber natürlich immer langsamer, da die vektoren immer voller werden. wenn ich die zeile nicht auskommentiere, kriege ich bei 80 partikeln, nach weniger als ner halben sekunde nen zugriffsfehler!<br />
warum? ich finde den fehler einfach nicht!<br />
EDIT:</p>
<p>MAHH natürlich..ich depp...<br />
die partikel in particles und particleGrid sind nicht die gleichen gnaaaaa</p>
<p>wie kann ich im grid zeigen auf die elemente im anderen vektor speichern ?</p>
<p>ok..hab jetzt einfach die positionen in particles im grid gespeichert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1305415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1305415</guid><dc:creator><![CDATA[pixartist]]></dc:creator><pubDate>Thu, 14 Jun 2007 08:38:09 GMT</pubDate></item></channel></rss>