<?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[Die lieben Pointer ( hab so meine Not mit ihnen]]></title><description><![CDATA[<p>im Thread &quot;double aus char array&quot; kamen seriell Bytes, die der Frager in einem char array sammelte, und in eine double wandeln wollte.</p>
<p>Beim Überlesen scheint mir die folgende Antwort einleuchtend, aber wenn ich mit Bleistift und Papier nacheenk, klappt es dann doch nicht.<br />
vielleicht korrigiert jemand mein lautes Denken?</p>
<pre><code class="language-cpp">char * buffer;
double v = * reinterpret_cast&lt;double*&gt; ( buffer );
</code></pre>
<ol>
<li>
<p>&quot;* buffer&quot; zeigt auf die SPeicherstelle, die den ersten char ( = Byte) von buffer enthält und das wäre buffer [0]? ALso sind de Ausdrücke * buffer und buffer[0] identisch ?</p>
</li>
<li>
<p>wenn buffer z.B mit adresse 4711 beginnend gespeichert ist, dann kann ich mir die HAusnummer von buffer so merken: Die Varible bp enthält die Adressse, an der ein char-array gespeichert ist, also sage ich das auch dem Leser, resp compiler<br />
[/cpp]char * bp;</p>
</li>
</ol>
<pre><code class="language-cpp">oder besser?
</code></pre>
<p>char* bp;</p>
<pre><code class="language-cpp">(oben hieß es eben &quot;buffer&quot;)

3)Wie sieht es mit dem SPeicherplatz aus, wenn das array unterschiedlich lang ist?. Es beginnt bei 4711: mindest ein byte brauche ich für das Ende-Kennzeichen  '\0'. WIeviel Paltz wird nun reserviert, wenn ich nur so deklariere vie im Beispiel? Bei
</code></pre>
<p>char buffer[5];</p>
<pre><code class="language-cpp">würden 4711 bis incl. 4715 reserviert. Ich hätte Platz für 4 &quot;NutzZeichen&quot;.

4)Zur zweiten - der Wandel-Zeile: ich habe das Beispiel mit &quot;int&quot; ( 4Byte) probiert,
</code></pre>
<p>char * buffer;<br />
int v = * reinterpret_cast&lt;ins*&gt; ( buffer );[cpp] und glaube auch diese etwa verstanden zu haben:<br />
in buffer [0] bis buffer[3] steht nach dem seriellen Einlesen das binäre Abbild einer INT.<br />
Ohne das <em>reinterpret_cast&lt;ins</em>&gt;* würde der compiler, um v bestimmen zu können, versuchen 4Byte beginnend ab Adresse 4711 ( =buffer[0] ) zu lesen und v zuzuweisen: In seinem &quot;Adressbuch&quot; hat er aber notiert, daß dort char stehen, und schmeisst einen Fehler.<br />
ALso sagen wir ihm durch das reinterpret: &quot;lieber Compiler, tu mal so, als stünde in Deinem Adressbuch, daß ab 4711 ne Int steht&quot; ??</p>
<ol start="5">
<li></li>
</ol>
<p>und irgendwo muss was schief sein, da ich den umgekehrten Weg nicht gebacken bekomme.</p>
<p>Danke für Eure Geduld, und daß sich eventuell meiner erbarmt<br />
Hanns</p>
<p>p.s.<br />
Ich hab mir scheon ein paarmal mein passwort schicken lassen, aber ich kann mich nicht einloggen??<br />
Der umgekehrte Weg, aus ner int einen String zu machen, müsste dann so gehen:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/119161/die-lieben-pointer-hab-so-meine-not-mit-ihnen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:06:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119161.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Aug 2005 21:53:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Sun, 28 Aug 2005 21:53:26 GMT]]></title><description><![CDATA[<p>im Thread &quot;double aus char array&quot; kamen seriell Bytes, die der Frager in einem char array sammelte, und in eine double wandeln wollte.</p>
<p>Beim Überlesen scheint mir die folgende Antwort einleuchtend, aber wenn ich mit Bleistift und Papier nacheenk, klappt es dann doch nicht.<br />
vielleicht korrigiert jemand mein lautes Denken?</p>
<pre><code class="language-cpp">char * buffer;
double v = * reinterpret_cast&lt;double*&gt; ( buffer );
</code></pre>
<ol>
<li>
<p>&quot;* buffer&quot; zeigt auf die SPeicherstelle, die den ersten char ( = Byte) von buffer enthält und das wäre buffer [0]? ALso sind de Ausdrücke * buffer und buffer[0] identisch ?</p>
</li>
<li>
<p>wenn buffer z.B mit adresse 4711 beginnend gespeichert ist, dann kann ich mir die HAusnummer von buffer so merken: Die Varible bp enthält die Adressse, an der ein char-array gespeichert ist, also sage ich das auch dem Leser, resp compiler<br />
[/cpp]char * bp;</p>
</li>
</ol>
<pre><code class="language-cpp">oder besser?
</code></pre>
<p>char* bp;</p>
<pre><code class="language-cpp">(oben hieß es eben &quot;buffer&quot;)

3)Wie sieht es mit dem SPeicherplatz aus, wenn das array unterschiedlich lang ist?. Es beginnt bei 4711: mindest ein byte brauche ich für das Ende-Kennzeichen  '\0'. WIeviel Paltz wird nun reserviert, wenn ich nur so deklariere vie im Beispiel? Bei
</code></pre>
<p>char buffer[5];</p>
<pre><code class="language-cpp">würden 4711 bis incl. 4715 reserviert. Ich hätte Platz für 4 &quot;NutzZeichen&quot;.

4)Zur zweiten - der Wandel-Zeile: ich habe das Beispiel mit &quot;int&quot; ( 4Byte) probiert,
</code></pre>
<p>char * buffer;<br />
int v = * reinterpret_cast&lt;ins*&gt; ( buffer );[cpp] und glaube auch diese etwa verstanden zu haben:<br />
in buffer [0] bis buffer[3] steht nach dem seriellen Einlesen das binäre Abbild einer INT.<br />
Ohne das <em>reinterpret_cast&lt;ins</em>&gt;* würde der compiler, um v bestimmen zu können, versuchen 4Byte beginnend ab Adresse 4711 ( =buffer[0] ) zu lesen und v zuzuweisen: In seinem &quot;Adressbuch&quot; hat er aber notiert, daß dort char stehen, und schmeisst einen Fehler.<br />
ALso sagen wir ihm durch das reinterpret: &quot;lieber Compiler, tu mal so, als stünde in Deinem Adressbuch, daß ab 4711 ne Int steht&quot; ??</p>
<ol start="5">
<li></li>
</ol>
<p>und irgendwo muss was schief sein, da ich den umgekehrten Weg nicht gebacken bekomme.</p>
<p>Danke für Eure Geduld, und daß sich eventuell meiner erbarmt<br />
Hanns</p>
<p>p.s.<br />
Ich hab mir scheon ein paarmal mein passwort schicken lassen, aber ich kann mich nicht einloggen??<br />
Der umgekehrte Weg, aus ner int einen String zu machen, müsste dann so gehen:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860362</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Sun, 28 Aug 2005 21:53:26 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 08:17:47 GMT]]></title><description><![CDATA[<p>Wenn ich dein posting richtig verstehe dann willst du nichts anderes als eine zahl in einen string umzuwandeln ( und zurück ).Richtig ?<br />
Dann bist du auf dem falschen Weg.<br />
Sieh dir eimmal die C-funktionen itoa() und atoi() an oder die C++ Klasse stringstream.<br />
Noch besser ist die Suche im Forum. Das Thema kommt ziemlich oft.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860466</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 29 Aug 2005 08:17:47 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 08:25:56 GMT]]></title><description><![CDATA[<p>&lt;offtopic&gt;<br />
@HannesW: In deinem eigenen Interesse solltest du imho zudem deine Beiträge (von denen du dir ja Hilfe erhoffst) ein wenig besser strukturieren. Du machst nämlich meines Erachtens manchmal zu große gedankliche Sprünge, welche vom Leser (und potenziellem Helfer) nicht unbedingt leicht zu verstehen sind.</p>
<p>Caipi<br />
&lt;/offtopic&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860468</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Mon, 29 Aug 2005 08:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 08:30:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7155">@ZuK</a>: Umwandeln ja, aber nicht von der Zahlen- in die String-Form, sondern der String soll die (maschinen interne) darstellung der Int haben.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6091">@Caipi</a>: Tut mir leid, aber ich bin da irtgendwie vernagelt, und würde es doch gern verstehen.</p>
<p>HannsW</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860472</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Mon, 29 Aug 2005 08:30:28 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 08:56:19 GMT]]></title><description><![CDATA[<p>Aha. Dnn wars ja nicht so falsch.</p>
<pre><code class="language-cpp">char buffer[5];
char * cP = buffer;
int * iP = reinterpret_cast&lt;int*&gt;(buffer);
*iP = 12345;
buffer[4]=0; // terminating 0 anhängen für alle fälle
             // macht zwar wenig sinn denn wahrscheinlich ist schon irgendwo eine 0
for ( int i = 0; i &lt; 4; ++i ) // int als char ausgeben 
   cout &lt;&lt; buffer[i] &lt;&lt; endl;

for ( int i = 0; i &lt; 4; ++i ) // int als asciiwerte ausgeben 
   cout &lt;&lt; static_cast&lt;int&gt;(buffer[i]) &lt;&lt; endl;

// andere Richtung
strcpy(cP, &quot;1234&quot;);
cout &lt;&lt; *iP &lt;&lt; endl;
</code></pre>
<p>Kurt<br />
edit: lots of typos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860479</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 29 Aug 2005 08:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 10:06:04 GMT]]></title><description><![CDATA[<p>Wenn wir von 4Byte ausgehen für nen int, dann schreibst du mit iP = 12345; was in den Speicher das so aussehen könnte <strong>00000000000000000011000000111001</strong>, wenn du dir das nun als einen String, oder einzelne Chars ausgeben lässt bekommst du da aber was ganz anderes raus als 12345 oder was das da auch nur entfernt hin kommt.</p>
<p>Was genau ist denn deine Absicht? Sowas macht man manchmal um Daten zu serialisieren, wobei das auch nicht unbedingt ne gute Möglichkeit ist, da es so sehr Plattformabhängig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860539</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 10:08:11 GMT]]></title><description><![CDATA[<p>User--- schrieb:</p>
<blockquote>
<p>Wenn wir von 4Byte ausgehen für nen int, dann schreibst du mit iP = 12345; was in den Speicher das so aussehen könnte <strong>00000000000000000011000000111001</strong>, wenn du dir das nun als einen String, oder einzelne Chars ausgeben lässt bekommst du da aber was ganz anderes raus als 12345 oder was das da auch nur entfernt hin kommt.</p>
<p>Was genau ist denn deine Absicht? Sowas macht man manchmal um Daten zu serialisieren, wobei das auch nicht unbedingt ne gute Möglichkeit ist, da es so sehr Plattformabhängig ist.</p>
</blockquote>
<p>Hat er doch schon gesagt dass die Daten von einer seriellen Schnittstelle kommen und in einem char-Buffer liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860540</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 10:11:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10038">@HannsW</a>: Bitte bring mal die Formatierung von deinem Post in Ordnung. Da dürften irgendwie die Tags durcheinandergekommen sein. Abgesehen davon ist es aber mal eine wirklich detaillierte Fragestellung. Lob dafür, das kommt nicht häufig vor ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860543</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 10:44:33 GMT]]></title><description><![CDATA[<p>Danke fürs Beispiel, das auch klappt. ABER <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> So richtig verstanden hab ich diese Zeilen noch nicht;</p>
<pre><code class="language-cpp">int * iP = reinterpret_cast&lt;int*&gt;(buffer);
*iP = nWert;
</code></pre>
<p>Könnste da noch mal ein paar worte sagen?<br />
oder soll ichs nochmal versuchen?<br />
Hanns</p>
<pre><code class="language-cpp">*iP = nWert;
</code></pre>
<p>-An die SPeicherstelle, deren Nummer in iP steht, soll nWert eingetragen werden.<br />
( Liebling, Dein Essen steht im Kochbuch auf Seite 13 !?)<br />
-&quot;normal&quot; waäre dann dieses</p>
<pre><code class="language-cpp">int i;
int * iP = i ;
</code></pre>
<p>- da wir iP auf eine Speicherstelle lassen, an der ein char-Array steht, kommt der cast ins SPiel ?</p>
<p>So etwa?</p>
<p>War grad mal weg, und sehe eben die anderen Post.<br />
Was ich machen will?<br />
Klassen schreiben, um auf ein Datenbanksystem zu greifen zu können.<br />
Die Api verlangt die Daten in einem char-Array, in dem für int's 4Bytre vorgesehen sind.<br />
UNd in diees Array müssen eben die richtigen &quot;strings&quot; stehen.<br />
Für &quot;bool&quot; war das nicht so schwierig:</p>
<pre><code class="language-cpp">bool myClass::Boolean{
      return m_dataBuf[ anDerStelle] == chr(0); 
}
</code></pre>
<p>@User--Genau das möchte ich, und nicht etwa die Zahl als String auf den Drucker geben</p>
<p>Das mit dem &quot;in Ordnung bringen&quot; klappt leider nicht mehr, da ich diese post als nicht registriert auch nciht mehr editieren kann. Sorry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860549</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:44:33 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 14:03:18 GMT]]></title><description><![CDATA[<p>Wenn du eine Adresse auf ein char-array mit reinterpret_cast ab sofort als Adresse auf ein int-array umwandelst, dann ändert sich für dich eigentlich gar nichts, da der Compiler dir ja die Arbeit abnimmt die Adresse je nach Typ richtig zu berechnen.</p>
<p>Du musst das nur tun um einen Block von Bytes anderst zu behandeln, in deinem Fall eben 4Chars als einen Integer. Du kannst das auch mit ner union machen:</p>
<pre><code class="language-cpp">union konverter
{
  char alsChars[ 4 ];
  int  alsInt;
} myKonverter;

myKonverter.alsChars = &quot;1234&quot;; // Zugriff in Form von Char Array auf den Speicher
myKonverter.alsInt = 12345;    // Zugriff als Integer auf den Speicher
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/860698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860698</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Mon, 29 Aug 2005 14:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 14:04:09 GMT]]></title><description><![CDATA[<p>Da ist mir doch glatt nen Fehler unterlaufen, das &quot;alsChars&quot;-array muss 5 und nicht 4 Byte groß sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860701</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Mon, 29 Aug 2005 14:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 15:04:51 GMT]]></title><description><![CDATA[<p>HannsW schrieb:</p>
<blockquote>
<p>Was ich machen will?<br />
Klassen schreiben, um auf ein Datenbanksystem zu greifen zu können.<br />
Die Api verlangt die Daten in einem char-Array, in dem für int's 4Bytre vorgesehen sind.<br />
UNd in diees Array müssen eben die richtigen &quot;strings&quot; stehen.</p>
</blockquote>
<p>Ich versuch einmal zu erklären.<br />
Also Dein Datenbanksysten hat wahrscheinlich irgendeine Funktion mit der du beliebige Daten Eingeben kannst. Damit das API nicht zu aufwendig wird gibt es wahrscheinlich nur eine ( oder wenige ) funktionen zum schreiben in die datenbank.<br />
Du Sagst wahrscheinlich nur irgendwas wie Schreibe Daten in den Record soundso Feld sowieso. Die Datenbank weiss ja schon welchen Datentyp das Feld hat. Daher haben sich die Entwickler darauf geeinigt der Funktion die daten als array von chars zu übergeben. Das hat überhaupt nichts mit 0-terminierten strings zu tun. Sie wollen einfach nur mit einer einzigen funktion auskommen.<br />
Für dich bedeutet das dass du der Funktion einfach einen Pointer auf deine Daten übergeben musst den du immer ( egal welchen DatenTyp das Feld hat ) in einen char * casten musst.</p>
<p>Ich stelle mir das so vor:</p>
<pre><code class="language-cpp">void set_data( long int ID, const char * feld, const char * data ); // möglicher prototyp der Eingabefunktion
</code></pre>
<p>Beispiel:</p>
<pre><code class="language-cpp">char * name = &quot;ein string&quot;;
   set_data( 12345, &quot;name&quot;, name ); // die datenbank weiss das feld name ist ein string typ passt kein cast
   short int haus_nr = 123;
   set_data( 12345, &quot;Nr&quot;, reinterpret_cast&lt;char*&gt;(&amp;hausnummer) ); // die datenbank weiss das feld Nr ist ein short also casten wir halt
   int postleizahl = 45123;
   set_data( 12345, &quot;Plz&quot;, reinterpret_cast&lt;char*&gt;(&amp;postleizahl) ); // die datenbank weiss das feld Plz ist ein int also casten wir halt
</code></pre>
<p>Umgekehrt wirds wahrscheinlich genauso funktionieren</p>
<pre><code class="language-cpp">void get_data( long int ID, const char * feld, char * data ); // möglicher prototyp der Ausgabefunktion
                                                               // data kann nicht const sein den die funktion verändert den wert
</code></pre>
<p>Beispiel: lesen aus der DB</p>
<pre><code class="language-cpp">char name[255];
   get_data( 12345, &quot;name&quot;, name ); // die DB füllt name
   short int haus_nr;
   get_data( 12345, &quot;Nr&quot;, reinterpret_cast&lt;char*&gt;(&amp;hausnummer) ); // die DB füllt haus_nr   
   int postleizahl;
   set_data( 12345, &quot;Plz&quot;, reinterpret_cast&lt;char*&gt;(&amp;postleizahl) ); // die DB füllt postleitzahl
   // gelesene daten ausgeben
   cout &lt;&lt; &quot;Name=&quot; &lt;&lt; name &lt;&lt; endl;
   cout &lt;&lt; &quot;Nr=&quot; &lt;&lt; haus_nr &lt;&lt; endl;
   cout &lt;&lt; &quot;Plz=&quot; &lt;&lt; postleizahl &lt;&lt; endl;
</code></pre>
<p>Langer Rede kurzer Sinn. Die datenbank erwartet die daten immer als char * damit mit einer einzigen Funktion alle möglichen Datentypen abgedeckt werden können.<br />
Wie die Daten interpretiert weden müssen ist in der DB festgelegt.</p>
<p>Kurt</p>
<p>PS:Bitte nicht schlagen wenn das ganze mit deinem Problem nichts zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860758</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 29 Aug 2005 15:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 15:12:15 GMT]]></title><description><![CDATA[<p>Ja danke, ich glaub, jetzt ist der Groschen ( 10Cent) bei mir gefallen <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>Dann aber noch ne design Frage:<br />
In meiner TOP-Klasse habe ich nun die Methoden <em>setInteger</em> und <em>getIntger</em>, die ich nun in 2 Varianten ausführen kann.</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart, int  nWert){
        union konverter
        {
                char alsChars [ APP_INTEGER_LEN + 1 ];   // 4 +1 Byte
                int  alsInt;
        } myKonverter;
        myKonverter.alsInt = nWert ;    // Zugriff als Integer auf den Speicher

        //und in den DatenPuffer schreiben
        for ( int i = 0; i &lt; APP_INTEGER_LEN ; ++i ){
                m_dataBuf [ i + nStart ] =  myKonverter.alsChars[i];
        }
}
</code></pre>
<p>oder variante 2</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart, int  nWert){
        char buffer[ APP_INTEGER_LEN + 1];
        int * iP = reinterpret_cast&lt;int*&gt;(buffer);
        *iP = nWert;
        for ( int i = 0; i &lt; APP_INTEGER_LEN; ++i ){ 
                m_dataBuf [ i + nStart ] =  buffer[i];
        }
}
</code></pre>
<p>Was davon ist denn &quot;besserer&quot; Stil, resp schneller?</p>
<p>Wobei ich bei der Variante 1 ( Union ) die Union bereits als Klassen-Union deklarieren würde? Sie müsste dann nicht bei jedem get-/set- Aufruf erzeugt und danach entsorgt werden. etwa so?</p>
<pre><code class="language-cpp">// btrieve.hh
//...
        union konverter
        {
                char alsChars [ APP_INTEGER_LEN + 1 ];   // 4 +1 Byte
                int  alsInt;
        } myKonverter;
//...
//btrieve.cc
...
void btrieve::setInteger ( int nStart, int  nWert){
        myKonverter.alsInt = nWert ;    // Zugriff als Integer auf den Speicher

        //und in den DatenPuffer schreiben
        for ( int i = 0; i &lt; APP_INTEGER_LEN ; ++i ){
                m_dataBuf [ i + nStart ] =  myKonverter.alsChars[i];
        }

int  btrieve::getInteger ( int nStart){
        for ( int i = nStart; i &lt; nStart + APP_INTEGER_LEN ; i++){
                myKonverter.alsChars [ i -nStart ] = m_dataBuf [i ];
        }
   return  myKonverter.alsInt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/860764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860764</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Mon, 29 Aug 2005 15:12:15 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 15:25:09 GMT]]></title><description><![CDATA[<p>Während ich weben schrieb, hat ZuK auch geantwortet.<br />
an ihn:<br />
Ja das ist es. Es gibt nur einen Api-Aufruf, in dem alles erledigt wird. Und der erwartet ein CHAR-ARRAY asl datenbuffer.</p>
<p>Ich hab nun ne Klasse <em>btrieve</em>, in der ich u.a die Umwandlung in und zu ints vornehme ( void btrieve::setInteger(int nStart, int nWert) und int btrieve::getInteger ( nstart) )</p>
<p>davon baue ich nir dann z.B. ne btrieve::aliasPerson() in der ich dann z.B</p>
<pre><code class="language-cpp">int aliasPerson::hausnummer ( ) {
   return getInteger( APP_HAUSNUMMERN_START);
}
</code></pre>
<p>definiere. und in der ANwendung dann eben</p>
<pre><code class="language-cpp">aliasPerson person = aliasPerson(....);
   //open
   //suche und so
   cout &lt;&lt; &quot;hausnummer &quot; &lt;&lt; person.hausnummer &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/860770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860770</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Mon, 29 Aug 2005 15:25:09 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Mon, 29 Aug 2005 16:02:15 GMT]]></title><description><![CDATA[<p>Ok Jetzt verstehe ich was du machen willst.<br />
Ich würde getInteger und setInteger mit memcpy implementieren. Dann brauchst du keine Konvertierungsunion und auch keinen cast da memcpy mit void * arbeitet.</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart, int  nWert){ // nehme an nStart ist ein offset in byte
    memcpy((m_dataBuf + nStart), &amp;nWert, sizeof(nWert));
}

int  btrieve::getInteger ( int nStart){
    int ret;
    memcpy( &amp;ret, (m_dataBuf + nStart), sizeof(ret));
    return  ret;
}
</code></pre>
<p>Das ist wahrscheinlich die performanteste lösung. Ist zwar kein schönes C++ aber wenn man C-API's verwenden muss dann ist das meiner meinung nach erlaubt.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860789</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 29 Aug 2005 16:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Tue, 30 Aug 2005 04:43:43 GMT]]></title><description><![CDATA[<p>Jo, auf memcpy hätte ich eigentlich auch kommen können.<br />
Dazu noch eine weitere Überlegung</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart , int nWert){ // nehme an nStart ist ein offset in byte   == JA 

    memcpy((m_dataBuf + nStart), &amp;nWert, sizeof(nWert));
    // neige ich dazu so zu schreiben:
    memcpy((m_dataBuf + nStart), &amp;nWert, APP_INTEGER_LEN) ;
    // oder eindef aus der api.hh nehmen
    memcpy((m_dataBuf + nStart), &amp;nWert, BTI_INT;
}
</code></pre>
<p>Obwohl es dann doch sicherer wäre, den parameter-Typ zu &quot;api-def&quot;fen?</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart, BTI_INT nWert ){ // aus der api.hh
  //...
}
</code></pre>
<p>Deine Lösung könnte ich dann erweitern, und sie gleich für alle Arten von Zahlen<br />
verwenden:</p>
<pre><code class="language-cpp">void btrieve::setZahl ( int nStart,int nWert,int nBytes ){
memcpy((m_dataBuf + nStart), &amp;nWert, nBytes );
}

// und in alisaPerson
void aliasPerson::hausnummer (int nWert ) {
   setZahl( APP_HAUSNUMMERN_START, nWert, APP_INTEGER_LEN);
}
}
</code></pre>
<p>Danke für die Hilfe<br />
Hanns</p>
]]></description><link>https://www.c-plusplus.net/forum/post/861048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861048</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Tue, 30 Aug 2005 04:43:43 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Tue, 30 Aug 2005 08:44:07 GMT]]></title><description><![CDATA[<p>Kann dier da keine Lösung vorschlagen da ich mich mit den Bitgrössen der Zahlen typen nicht allzusehr beschäftigt habe.<br />
Du solltest dir aber darüber klar sein das du höchstwahrscheinlich Probleme bekommen wirst wenn du auf ein andere Prozessorarchitektur ( 32=&gt;64 Bit ) umsteigst.<br />
Wahrscheinlich bist du am besten beraten wenn du dir eigene globale typedefs anlegst und mit diesen arbeitest. Dann musst du beim umsteigen die definitionen nur an einer Stelle anpassen.<br />
z.b</p>
<pre><code class="language-cpp">typedef  __int32 bt_int;  // keine Ahnung ob es __int32 bei deinem compiler gibt
void btrieve::setInteger ( int nStart , bt_int nWert){ 
  memcpy((m_dataBuf + nStart), &amp;nWert, sizeof(nWert));
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/861180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861180</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Tue, 30 Aug 2005 08:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Die lieben Pointer ( hab so meine Not mit ihnen on Tue, 30 Aug 2005 15:40:42 GMT]]></title><description><![CDATA[<p>Da war ich leider nicht ganz sauber:<br />
Die Endvariante sieht so aus</p>
<pre><code class="language-cpp">void btrieve::setInteger ( int nStart , int nWert){ 
    memcpy((m_dataBuf + nStart), &amp;nWert,sizeof( BTI_INT));
}
</code></pre>
<p>Wobei BTI_INT aus den Headern der Api kommt, und dort auch ne Menge <em>#ifdef ARCHITEKTUR UND BETRIEBSYSTEM</em> existieren, die einem diese Arbeit abnehmen.</p>
<pre><code class="language-cpp">#define LINUX
</code></pre>
<p>reicht.<br />
Aber Danke nochmals für den Hinweis<br />
Hanns</p>
]]></description><link>https://www.c-plusplus.net/forum/post/861537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861537</guid><dc:creator><![CDATA[HannsW]]></dc:creator><pubDate>Tue, 30 Aug 2005 15:40:42 GMT</pubDate></item></channel></rss>