<?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[Designfrage: Interpretation Byte-Sequenz]]></title><description><![CDATA[<p>Hallo in die Runde,</p>
<p>ich benötige Meinungen zu einem Konzept. Folgende Ausgangssituation: Ich bekomme eine Byte-Folge von 8 Byte, wobei das erste Byte entscheidet, wie die restlichen 7 Byte zu interpretieren sind. Diese 7 Byte sind binäre Abbilder von 3 <strong>unterschiedlichen</strong> Klassen (keine Gemeinsamkeiten, weder Member noch Methoden). Da ich bei Einlesen der Bytefolge IMHO nicht diese Klassen anhand des ersten Bytes erzeugen kann, habe ich mir überlegt, einfach den Selektor und die restliche Sequenz so als Klassen-Member anzulegen, und die verschiedenen Interpretationen per Aufruf zu generieren.</p>
<p>Stark verkürztes Bsp:</p>
<pre><code class="language-cpp">class ABC
{
	public:
		//Ctors, Dtors...

		enum ABCEnum {A, B, C};

		ABCEnum getSelector() const;
		A getSequenceInterpretationA() const;
		B getSequenceInterpretationB() const;
		C getSequenceInterpretationC() const;

		void setSequence(const A&amp;); //includes changing selector
		void setSequence(const B&amp;);
		void setSequence(const C&amp;);

	private:
		ABCEnum selector;
		unsigned char sequence[7];
}
</code></pre>
<p>Das heisst auch, dass jeder Benutzer der Klasse ABC vorher den Selector fragen sollte, um die richtige Interpretationsfunktion zu rufen.</p>
<p>Meine Frage ist nun: Eigentlich kennt ABC an sich ja die richtige Interpretationsfunktion. Kann also diese Problem irgendwie eleganter gelöst werden?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211381/designfrage-interpretation-byte-sequenz</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 04:40:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211381.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Apr 2008 16:09:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Tue, 22 Apr 2008 16:09:59 GMT]]></title><description><![CDATA[<p>Hallo in die Runde,</p>
<p>ich benötige Meinungen zu einem Konzept. Folgende Ausgangssituation: Ich bekomme eine Byte-Folge von 8 Byte, wobei das erste Byte entscheidet, wie die restlichen 7 Byte zu interpretieren sind. Diese 7 Byte sind binäre Abbilder von 3 <strong>unterschiedlichen</strong> Klassen (keine Gemeinsamkeiten, weder Member noch Methoden). Da ich bei Einlesen der Bytefolge IMHO nicht diese Klassen anhand des ersten Bytes erzeugen kann, habe ich mir überlegt, einfach den Selektor und die restliche Sequenz so als Klassen-Member anzulegen, und die verschiedenen Interpretationen per Aufruf zu generieren.</p>
<p>Stark verkürztes Bsp:</p>
<pre><code class="language-cpp">class ABC
{
	public:
		//Ctors, Dtors...

		enum ABCEnum {A, B, C};

		ABCEnum getSelector() const;
		A getSequenceInterpretationA() const;
		B getSequenceInterpretationB() const;
		C getSequenceInterpretationC() const;

		void setSequence(const A&amp;); //includes changing selector
		void setSequence(const B&amp;);
		void setSequence(const C&amp;);

	private:
		ABCEnum selector;
		unsigned char sequence[7];
}
</code></pre>
<p>Das heisst auch, dass jeder Benutzer der Klasse ABC vorher den Selector fragen sollte, um die richtige Interpretationsfunktion zu rufen.</p>
<p>Meine Frage ist nun: Eigentlich kennt ABC an sich ja die richtige Interpretationsfunktion. Kann also diese Problem irgendwie eleganter gelöst werden?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496297</guid><dc:creator><![CDATA[Aquae]]></dc:creator><pubDate>Tue, 22 Apr 2008 16:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Tue, 22 Apr 2008 16:21:38 GMT]]></title><description><![CDATA[<p>Hab mich mal registriert, ist ja ein lehrreiches Forum :-).</p>
<p>Eine Erweiterung für die Interpretationsfunktionen ist mir noch eingefallen: Man könnte eine Exception auslösen, wenn eine nicht selektor-richtige Interpretationsfunktion gerufen wurde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496302</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 22 Apr 2008 16:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Tue, 22 Apr 2008 16:28:11 GMT]]></title><description><![CDATA[<p>boost Variant könnte eine elegante Lösung darstellen.</p>
<pre><code class="language-cpp">class ABC
{
    // ...
    boost::variant&lt;A,B,C&gt; getSequence() const;
};
</code></pre>
<p>Je nach Kontext könnte es vorzuziehen sein, das Variant-Objekt oder sonst die Byte-Sequenz by Bedarf zu generieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496306</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 22 Apr 2008 16:28:11 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Tue, 22 Apr 2008 18:12:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich bekomme eine Byte-Folge von 8 Byte, wobei das erste Byte entscheidet, wie die restlichen 7 Byte zu interpretieren sind.</p>
</blockquote>
<p>Daraus schliesse ich: es muss eine Gemeinsamkeit geben. Wie ich darauf komme? Ganz einfach, wenn an einer bestimmten Position im Input entweder A, B oder C stehen kann, dann haben A, B und C schonmal die Gemeinsamkeit dass es eben Stellen gibt wo eines der Drei im Input stehen kann. Logisch irgendwie <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="🙂"
    /></p>
<p>Und da eben A, B oder C an ein und der selben Stelle im Input auftauchen kann vermute ich weiter dass es noch weitere Gemeinsamkeiten geben wird.</p>
<blockquote>
<p>Diese 7 Byte sind binäre Abbilder von 3 unterschiedlichen Klassen (keine Gemeinsamkeiten, weder Member noch Methoden).</p>
</blockquote>
<p>Siehe oben.<br />
Vielleicht hast du ja auf ein paar (gemeinsame) Funktionen &quot;vergessen&quot;, oder siehst diese nicht als Teil der Klassen A, B und C sondern als Client Code.</p>
<p>Man könnte aber besser etwas zu dem Thema sagen wenn man wüsste um was für Klassen und um was für ein Programm es sich dabei handelt. Oder ist das geheim?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496385</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 Apr 2008 18:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Wed, 23 Apr 2008 06:53:43 GMT]]></title><description><![CDATA[<p>Es ist ungünstig, alle Klassen A, B und C wieder in einer gemeinsamen Klasse zusammenzufassen. Besser ist es, die Klassen einzeln zu betrachten. Wie hustbaer schon erwähnt hat, muss es eine Gemeinsamkeit geben - es werden alle Objekte irgendwie eingelesen. Folglich ist es sinnvoll, sich eine Basisklasse zu schaffen, die ein Interface für das Einlesen bereitstellt. Etwa so</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream

typedef std::istream IN;

class Base
{
public:
    virtual ~Base()=0 {}
    friend IN&amp; operator&gt;&gt;( IN&amp; in, Base&amp; obj )
    {
        obj.read( in );
        return in;
    }
protected:
    virtual void read( IN&amp; in )=0;
};
</code></pre>
<p>Da ich nicht weiß, von wo eingelesen werden soll, habe ich diese Quelle mal mit dem Typ 'IN' versehen und unterstellt, dass sie ein Stream-ähnliches Interface besitzt.</p>
<p>Nun die abgeleiteten Klassen, die selbstverständliche jede ihre individuelle read-Methode implementieren müssen.</p>
<pre><code class="language-cpp">class A : public Base
{
protected:
    virtual void read( IN&amp; in )
    {
        // ... Info für A lesen
    }
};

class B : public Base
{
protected:
    virtual void read( IN&amp; in )
    {
        // ... Info für B lesen
    }
};
</code></pre>
<p>Und eine Factory-Funktion, die an einem Pointer auf die Basisklasse ein konkretes Objekt dranhängt.</p>
<pre><code class="language-cpp">// --   Factory-Function erzeugt ein A, B oder C -Objekt
IN&amp; operator&gt;&gt;( IN&amp; in, Base*&amp; pObj )
{
    typedef unsigned char Byte;
    Byte b1;
    if( in &gt;&gt; b1 )
    {
        switch( b1 )
        {
        case 'a':
            pObj = new A;
            break;
        case 'b':
            pObj = new B;
            break;
        // case 'c': usw.
        default:
            in.setstate( std::ios_base::failbit ); // Fehler, unbekanntes Byte1
            // oder throw exception
            return in;
        }
        in &gt;&gt; *pObj; // Objekt lesen
    }
    return in;
}
</code></pre>
<p>Falls es (viel) mehr als drei Klassen werden sollten, so könnte man hier auch eine Registry mit je einer Factory-Funktion für jede Klasse imlementieren. Das hat dann den Vorteil, weitere Klassen hinzufügen zu können, ohne an dieser Funktion noch etwas ändern zu müssen.</p>
<p>In einer Anwendung sieht das dann skizzenhaft etwa so aus:</p>
<pre><code class="language-cpp">int main()
{
    using namespace std;
    istringstream buf(&quot;a2345678&quot;);
    Base* obj = 0;
    if( buf &gt;&gt; obj )
    {
        // 'obj' zeigt auf ein A-Objekt
        delete obj;     // .. besser Smart Pointer nutzen
    }
    return 0;
}
</code></pre>
<p>Jetzt stellt sich zwangsläufig die Frage, was mit dem Objekt geschehen soll!</p>
<p>Sind A, B und C zufällig Meldungen von einem Feldbus oder ähnlichem?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496598</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 23 Apr 2008 06:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Interpretation Byte-Sequenz on Wed, 23 Apr 2008 09:28:57 GMT]]></title><description><![CDATA[<p>Danke erstmal für eure schnellen Antworten. Ich geh mal auf die einzelnen Posts ein:</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: interessanter Ansatz, jedoch möchte ich das Benutzen zusätzlicher Bibliotheken vermeiden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a> und Werner Salomon:</p>
<p>Gut, ich denke, es wäre sinnvoll, mehr über die Klassen A, B, C zu sagen. Sie stellen Perioden ähnlich wie bei Kalenderfunktionen dar.<br />
Die 7 Byte sollen je nach Selektor einmal</p>
<ul>
<li>als Zahl interpretiert werden (gekapselt durch A, mit Casting-Operator nach long long). Die Zahl stellt eine fixe Differenz zwischen Zeitpunkten, an denen etwas passieren soll, dar.</li>
<li>als 3 aufeinanderfolgende Bitfelder: Monate, Tage, Wochentage (gekapselt durch B). Dort wo die Bits gesetzt werden, passiert etwas zu genau diesem Zeitpunkt.</li>
<li>als 7 Byte Jahrestage-Schlüssel (Bsp. zu berechnende Feiertage)</li>
</ul>
<p>Ein Anwender soll die Möglichkeiten haben, (hübsch übersetzt durch eine GUI) zu sehen, welche Periode eingestellt, soll diese ändern können oder einen anderen Periodentyp wählen können. Das Ganze wird dann wieder rausgeschrieben und in einem eingebetteten System verarbeitet.</p>
<p>Ich habe zuerst auch an eine Factory-Möglichkeit gedacht, diese aber verworfen, da ich die Typen genau kennen muss und nicht nur die gemeinsame Schnittstelle. Mit &quot;dynamic_cast&quot; wollt ich eigentlich nicht arbeiten, denn dann wäre dieses Konzept nicht wirklich sinnvoll, oder?</p>
<p>Danke aber für eure bisherigen Vorschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1496682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1496682</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 23 Apr 2008 09:28:57 GMT</pubDate></item></channel></rss>