<?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[Dynamische Datenstrukturen]]></title><description><![CDATA[<p>Moin,</p>
<p>ich sitze gerade vor einem Problem und mir fällt dazu keine schöne Lösung ein:</p>
<p>Über Netzwerk bekomme ich Messwerte gesendet die ich verarbeiten will. Genauer gesagt wird jeder Messwertwert mit einem Faktor multipliziert und mit einem Offset addiert. Anschließend werden die Werte in eine Datenbank geschrieben.<br />
Am Anfang wird die Konfiguration der Messwerte übertragen. Anschließend werden nu noch die Messwerte gesendet:</p>
<p>Beispiel:<br />
Konfiguration:<br />
3 BYTE, 2 short, 1 DWORD</p>
<p>Das bedeutet in jedem Datenpaket 9 Byte enthalten. Statisch würde ich die Sache so regeln:</p>
<pre><code>union {
	struct {
		BYTE  a[3];
		short b[2]
		DWORD c[1]
	};
	BYTE buffer[9];
};
</code></pre>
<p>So könnte ich die Empfangenen Daten in den buffer schreiben und bequem über das Struct drauf zu greifen.</p>
<p>Ich habe aber bis zu 50 Verbindungen und jede Verbindung kann mit einer anderen Konfiguration Daten senden. Das ganze soll also etwas dynamischer werden. Wenn ich aber mit new mein struct dynamisch fülle, hängt der Speicher nicht mehr zusammen. Also geht die die Sache mit dem union schief.</p>
<p>Im Moment merke ich mir in einem Array die Konfiguration für jedes Feld. Wenn in einem Feld jetzt zum Beispiel ein signed short steht sieht der Code dafür so aus:</p>
<pre><code>if (conf[confIndex].size == 2) {
    if (conf[confIndex].signed) {
        signed short a;
        memcpy(&amp;a, recBuffer+index, sizeof(signed short))
        double value = a * conf[confIndex].factor + conf[confIndex].offset;
    }
}
</code></pre>
<p>Das ganze funktioniert zwar, ist aber so richtig gefällt mir die Sache nicht. Es gibt doch bestimmt eine schöner Lösung für so ein Problem?</p>
<p>Ich danke schon mal im Voraus für eure geistigen Ergüsse.</p>
<p>Gruß<br />
Volker</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173983/dynamische-datenstrukturen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 13:08:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173983.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Feb 2007 19:15:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamische Datenstrukturen on Wed, 21 Feb 2007 19:15:00 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich sitze gerade vor einem Problem und mir fällt dazu keine schöne Lösung ein:</p>
<p>Über Netzwerk bekomme ich Messwerte gesendet die ich verarbeiten will. Genauer gesagt wird jeder Messwertwert mit einem Faktor multipliziert und mit einem Offset addiert. Anschließend werden die Werte in eine Datenbank geschrieben.<br />
Am Anfang wird die Konfiguration der Messwerte übertragen. Anschließend werden nu noch die Messwerte gesendet:</p>
<p>Beispiel:<br />
Konfiguration:<br />
3 BYTE, 2 short, 1 DWORD</p>
<p>Das bedeutet in jedem Datenpaket 9 Byte enthalten. Statisch würde ich die Sache so regeln:</p>
<pre><code>union {
	struct {
		BYTE  a[3];
		short b[2]
		DWORD c[1]
	};
	BYTE buffer[9];
};
</code></pre>
<p>So könnte ich die Empfangenen Daten in den buffer schreiben und bequem über das Struct drauf zu greifen.</p>
<p>Ich habe aber bis zu 50 Verbindungen und jede Verbindung kann mit einer anderen Konfiguration Daten senden. Das ganze soll also etwas dynamischer werden. Wenn ich aber mit new mein struct dynamisch fülle, hängt der Speicher nicht mehr zusammen. Also geht die die Sache mit dem union schief.</p>
<p>Im Moment merke ich mir in einem Array die Konfiguration für jedes Feld. Wenn in einem Feld jetzt zum Beispiel ein signed short steht sieht der Code dafür so aus:</p>
<pre><code>if (conf[confIndex].size == 2) {
    if (conf[confIndex].signed) {
        signed short a;
        memcpy(&amp;a, recBuffer+index, sizeof(signed short))
        double value = a * conf[confIndex].factor + conf[confIndex].offset;
    }
}
</code></pre>
<p>Das ganze funktioniert zwar, ist aber so richtig gefällt mir die Sache nicht. Es gibt doch bestimmt eine schöner Lösung für so ein Problem?</p>
<p>Ich danke schon mal im Voraus für eure geistigen Ergüsse.</p>
<p>Gruß<br />
Volker</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232830</guid><dc:creator><![CDATA[Volker_0815 (Gast)]]></dc:creator><pubDate>Wed, 21 Feb 2007 19:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Datenstrukturen on Wed, 21 Feb 2007 20:09:12 GMT]]></title><description><![CDATA[<p>hmm hab mir jetzt nicht genau durchgelesen was du da so gemacht hast ... aber warum arbeitest du nicht einfach mit void-Pointern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232863</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 21 Feb 2007 20:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Datenstrukturen on Wed, 21 Feb 2007 21:01:46 GMT]]></title><description><![CDATA[<p>Hm,</p>
<p>ich lass mich ja gerne korrigieren, aber ich meine das funktioniert nicht. Die Pointer im struct kommen dann zwar im Speicher hintereinander, aber den Speicher den ich mir dann dynamisch hole muss nicht zwingend hintereinander kommen. Dann bringt mir die union nix mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232888</guid><dc:creator><![CDATA[Volker_0815 (Gast)]]></dc:creator><pubDate>Wed, 21 Feb 2007 21:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Datenstrukturen on Wed, 21 Feb 2007 21:19:50 GMT]]></title><description><![CDATA[<p>Upala ... sollte mir echt mal durchlesen was du geschrieben hast ... ^^ naja ... hab den code net so wirklich mir angeguckt ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232898</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 21 Feb 2007 21:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Datenstrukturen on Thu, 22 Feb 2007 21:11:18 GMT]]></title><description><![CDATA[<p>OK,</p>
<p>ich hab die Nacht noch an dem Problem gegrübelt. Hier ist eine Lösung die ich gar nicht so schlecht finde:</p>
<p>meine Datentyp Basisklasse</p>
<pre><code class="language-cpp">class CDataType
{
public:
	CDataType(int position, double factor, double offset);
	~CDataType(void);
	virtual double getValue(char *buffer) = 0;
protected:
	int m_position;
	double m_factor;
	double m_offset;
};
</code></pre>
<p>Für jeden Datentype baue ich jetzt eine eigene Klasse:</p>
<pre><code class="language-cpp">class CDataTypeSBYTE : CDataType
{
public:
	CDataTypeSBYTE(int position, double factor, double offset);
	~CDataTypeSBYTE(void);
	double getValue(char *buffer);
};

class CDataTypeSWORD : CDataType
{
public:
	CDataTypeSWORD(int position, double factor, double offset);
	~CDataTypeSWORD(void);
	double getValue(char *buffer);
};

/*
 usw .....
*/
</code></pre>
<p>Beispiel Implementierung der einer Klasse:</p>
<pre><code class="language-cpp">// signed BYTE
CDataTypeSBYTE::CDataTypeSBYTE(int position, double factor, double offset) : CDataType(position, factor, offset) { }

CDataTypeSBYTE::~CDataTypeSBYTE(void) { }

double CDataTypeSBYTE::getValue(char *buffer) {
	signed char value = *(buffer + m_position);
	return ((double)(value * m_factor)) + m_offset;
}
</code></pre>
<p>Um auf das Beispiel von oben zurück zu kommen:<br />
Konfiguration: 3 BYTE, 2 short, 1 DWORD</p>
<pre><code class="language-cpp">// init
CDataType *configDescription[6];
int posIndex = 0;
configDescription[0] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);

configDescription[1] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);

configDescription[2] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);

configDescription[3] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeSWORD(posIndex, factor, offset));
posIndex += sizeof(WORD);

configDescription[4] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeSWORD(posIndex, factor, offset));
posIndex += sizeof(WORD);

configDescription[5] = reinterpret_cast&lt;CDataType*&gt; (new CDataTypeUDWORD(posIndex, factor, offset));
posIndex += sizeof(DWORD);
</code></pre>
<p>Später der Zugriff:</p>
<pre><code class="language-cpp">for (int index=0; index &lt;6; index++) {
	value = configDescription[index]-&gt;getValue(recBuffer);
}
</code></pre>
<p>Wer Syntaxfehler findet kann sie behalten. Die findet auch mein Compiler ....</p>
<p>Aber sonst ist konstruktive Kritik willkommen.</p>
<p>Gruß<br />
Volker</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233676</guid><dc:creator><![CDATA[Volker_0815 (Gast)]]></dc:creator><pubDate>Thu, 22 Feb 2007 21:11:18 GMT</pubDate></item></channel></rss>