<?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[&amp;quot;Logikfrage&amp;quot;: Zugriff auf bestimmte Bereiche]]></title><description><![CDATA[<p>Hallo.<br />
Ich suche derzeit nach einer Möglichkeit um folgendes Problem zu lösen.<br />
Die Ausgangslage ist die, dass ich im Programm von bestimmten Bereichen bestimmte Werte speichere - momentan läuft das über ein Struct und einen std::vector was vermutlich nicht die beste Lösung ist. Ich zeige das mal anhand eines Beispiels:</p>
<pre><code class="language-cpp">struct Range
{
	unsigned long Start;
	int Size;
	char *Data;
};

// ...

std::vector&lt;Range*&gt; Ranges;

void AddRange(unsigned long Start, int Size, char *Data)
{
	Range *pRange = new Range;
	Range-&gt;Start = Start;
	Range-&gt;Size = Size;
	Range-&gt;Data = Data;

	Ranges.push_back(pRange);
}

// Beispielhafte Ranges hinzufügen:
AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
AddRange(200, 10, &quot;\x10\x39\x94\x22\x95\x42\x50\x28\x95\x31&quot;);
AddRange(99999, 10, &quot;\x20\x49\x04\x32\x05\x12\x80\x58\x65\x01&quot;);
</code></pre>
<p>Die Art der Speicherung ist für mein Problem glaube ich nicht so geeignet, was besseres kenne ich dafür jedoch nicht. Diese &quot;Bereiche&quot; werden nun im Programm gespeichert und Plugins sollen darauf zugreifen können. Gedacht habe ich mir das so:</p>
<pre><code class="language-cpp">// Zugriffsfunktion
bool GetRangeData(unsigned long Start, int Size, char *Data)
{
	for (std::vector&lt;Range*&gt;::iterator it = Ranges.begin(); it != Ranges.end(); it++)
	{
		Range *pRange = (*it);
		int Begin = -1;
		int End = -1;

		// &quot;Kollisions&quot;-Abfrage?
		// -&gt; Ist der abgefragte Bereich überhaupt gespeichert?

		// Fall 1: Start ist auf jedenfall vorhanden
		if (pRange-&gt;Start &gt;= Start &amp;&amp; pRange-&gt;Start &lt; (Start + Size))
		{
			Begin = abs(pRange-&gt;Start - Start);

			if (pRange-&gt;Start + pRange-&gt;Size &lt;= (Start + Size))
			{
				End = Begin + Size;
			}
			else
			{
				End = Begin + Size - ((pRange-&gt;Start + pRange-&gt;Size) - (Start + Size));
			}
		}
		// Fall 2: Start unterhalb, aber pRange-&gt;Size &quot;ragt hinein&quot;
		else if (pRange-&gt;Start &lt; Start &amp;&amp; (pRange-&gt;Start + pRange-&gt;Size) &gt;= Start)
		{
			Begin = 0;
			End = (pRange-&gt;Start + pRange-&gt;Size) - (Start + Size);
		}

		// Fund?
		if (Begin != -1 &amp;&amp; End != -1)
		{
			// Kopieren
			memcpy(Data, pRange + Begin, End);
			return true;
		}
	}

	return false;
}
</code></pre>
<p>Wie man sieht sieht die Funktion nicht gerade sehr schön aus und ich bin mir auch verdammt unsicher, ob...<br />
a) die Logik dahinter soweit stimmt<br />
b) alle Fälle abgedeckt sind</p>
<p>Hier mal ein paar Beispielhafte Zugriffe inklusive der gewollten Resultate:</p>
<pre><code class="language-cpp">// Zugriff
char *pData = new char[10];

if (GetRangeData(5000, 10, pData))
{
	//AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
	// pData sollte &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot; sein
}

if (GetRangeData(5005, 10, pData))
{
	//AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
	// pData sollte &quot;\x82\x10\x48\x85\x91&quot; sein
}

if (GetRangeData(195, 10, pData))
{
	//AddRange(200, 10, &quot;\x10\x39\x94\x22\x95\x42\x50\x28\x95\x31&quot;);
	// pData sollte &quot;\x42\x50\x28\x95\x31&quot; sein
}

if (GetRangeData(100000, 10, pData))
{
	//AddRange(99999, 10, &quot;\x20\x49\x04\x32\x05\x12\x80\x58\x65\x01&quot;);
	// pData sollte &quot;x49\x04\x32\x05\x12\x80\x58\x65\x01&quot; sein
}
</code></pre>
<p>Ich hoffe jemand versteht das Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Gruß &amp; Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270016/quot-logikfrage-quot-zugriff-auf-bestimmte-bereiche</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 13:46:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270016.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jul 2010 13:11:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Logikfrage&amp;quot;: Zugriff auf bestimmte Bereiche on Mon, 05 Jul 2010 13:12:14 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Ich suche derzeit nach einer Möglichkeit um folgendes Problem zu lösen.<br />
Die Ausgangslage ist die, dass ich im Programm von bestimmten Bereichen bestimmte Werte speichere - momentan läuft das über ein Struct und einen std::vector was vermutlich nicht die beste Lösung ist. Ich zeige das mal anhand eines Beispiels:</p>
<pre><code class="language-cpp">struct Range
{
	unsigned long Start;
	int Size;
	char *Data;
};

// ...

std::vector&lt;Range*&gt; Ranges;

void AddRange(unsigned long Start, int Size, char *Data)
{
	Range *pRange = new Range;
	Range-&gt;Start = Start;
	Range-&gt;Size = Size;
	Range-&gt;Data = Data;

	Ranges.push_back(pRange);
}

// Beispielhafte Ranges hinzufügen:
AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
AddRange(200, 10, &quot;\x10\x39\x94\x22\x95\x42\x50\x28\x95\x31&quot;);
AddRange(99999, 10, &quot;\x20\x49\x04\x32\x05\x12\x80\x58\x65\x01&quot;);
</code></pre>
<p>Die Art der Speicherung ist für mein Problem glaube ich nicht so geeignet, was besseres kenne ich dafür jedoch nicht. Diese &quot;Bereiche&quot; werden nun im Programm gespeichert und Plugins sollen darauf zugreifen können. Gedacht habe ich mir das so:</p>
<pre><code class="language-cpp">// Zugriffsfunktion
bool GetRangeData(unsigned long Start, int Size, char *Data)
{
	for (std::vector&lt;Range*&gt;::iterator it = Ranges.begin(); it != Ranges.end(); it++)
	{
		Range *pRange = (*it);
		int Begin = -1;
		int End = -1;

		// &quot;Kollisions&quot;-Abfrage?
		// -&gt; Ist der abgefragte Bereich überhaupt gespeichert?

		// Fall 1: Start ist auf jedenfall vorhanden
		if (pRange-&gt;Start &gt;= Start &amp;&amp; pRange-&gt;Start &lt; (Start + Size))
		{
			Begin = abs(pRange-&gt;Start - Start);

			if (pRange-&gt;Start + pRange-&gt;Size &lt;= (Start + Size))
			{
				End = Begin + Size;
			}
			else
			{
				End = Begin + Size - ((pRange-&gt;Start + pRange-&gt;Size) - (Start + Size));
			}
		}
		// Fall 2: Start unterhalb, aber pRange-&gt;Size &quot;ragt hinein&quot;
		else if (pRange-&gt;Start &lt; Start &amp;&amp; (pRange-&gt;Start + pRange-&gt;Size) &gt;= Start)
		{
			Begin = 0;
			End = (pRange-&gt;Start + pRange-&gt;Size) - (Start + Size);
		}

		// Fund?
		if (Begin != -1 &amp;&amp; End != -1)
		{
			// Kopieren
			memcpy(Data, pRange + Begin, End);
			return true;
		}
	}

	return false;
}
</code></pre>
<p>Wie man sieht sieht die Funktion nicht gerade sehr schön aus und ich bin mir auch verdammt unsicher, ob...<br />
a) die Logik dahinter soweit stimmt<br />
b) alle Fälle abgedeckt sind</p>
<p>Hier mal ein paar Beispielhafte Zugriffe inklusive der gewollten Resultate:</p>
<pre><code class="language-cpp">// Zugriff
char *pData = new char[10];

if (GetRangeData(5000, 10, pData))
{
	//AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
	// pData sollte &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot; sein
}

if (GetRangeData(5005, 10, pData))
{
	//AddRange(5000, 10, &quot;\x00\x29\x84\x02\x85\x82\x10\x48\x85\x91&quot;);
	// pData sollte &quot;\x82\x10\x48\x85\x91&quot; sein
}

if (GetRangeData(195, 10, pData))
{
	//AddRange(200, 10, &quot;\x10\x39\x94\x22\x95\x42\x50\x28\x95\x31&quot;);
	// pData sollte &quot;\x42\x50\x28\x95\x31&quot; sein
}

if (GetRangeData(100000, 10, pData))
{
	//AddRange(99999, 10, &quot;\x20\x49\x04\x32\x05\x12\x80\x58\x65\x01&quot;);
	// pData sollte &quot;x49\x04\x32\x05\x12\x80\x58\x65\x01&quot; sein
}
</code></pre>
<p>Ich hoffe jemand versteht das Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Gruß &amp; Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921634</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 05 Jul 2010 13:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Logikfrage&amp;quot;: Zugriff auf bestimmte Bereiche on Mon, 05 Jul 2010 15:02:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;Range*&gt; Ranges;
</code></pre>
<p>Betrifft zwar nicht dein Problem, aber verzichte hier besser auf Zeiger. Zum Beispiel hättest du so keine Memory Leaks.</p>
<pre><code class="language-cpp">memcpy(Data, pRange + Begin, End);
</code></pre>
<p>Schau dir auf <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> nochmal die Signatur von <code>std::memcpy()</code> an. Der dritte Parameter bezeichnet nicht das Ende. Ausserdem wäre <code>std::copy()</code> vielleicht besser.</p>
<p>Aber ich verstehe deinen Code nicht ganz. Willst du lediglich prüfen, ob ein Bereich bereits besetzt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921719</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Jul 2010 15:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Logikfrage&amp;quot;: Zugriff auf bestimmte Bereiche on Tue, 06 Jul 2010 23:10:58 GMT]]></title><description><![CDATA[<p>Ja, das will ich prüfen.<br />
Werde ich mir anschauen.</p>
<p>End ist in dem Falle auch nicht das Ende sondern die Länge, etwas doof benannt, stimmt.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922498</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 06 Jul 2010 23:10:58 GMT</pubDate></item></channel></rss>