<?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[Hilfe bei Quellcode]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hoffe, dass ich die Sprache richtig als C/Cpp interpretiert habe .. bin mir aber da noch nicht mal so sicher ^^. Dennoch bräuchte ich hilfe beim verstehen des Quellcodes. Dieser ist für ein Gerät. Daten werden von diesem Gerät per HEX an den PC weiter gegeben, dort sollen sie verarbeitet werden und in anderer Form zurück gegeben werden. Diese Funktion ist ursprünglich jedoch nicht vorgesehen gewesen (leider).</p>
<pre><code class="language-cpp">uword calc_ampoule_chksum( mem_amp_entry_t* ampoule_data )
{
  ubyte *p;
  uword chksum;

  chksum = 0;
  for(p=(ubyte*) ampoule_data;
      p&lt;(ubyte*) &amp;(ampoule_data-&gt;chksum); p++) {
    chksum += *p;
  }
  return chksum;
}
</code></pre>
<p>Hier wird eine checksum berechnet. Jedoch verstehe ich diesen Algorythmus nicht so wirklich. Vor allem die passage &quot; p&lt;(ubyte*) &amp;(ampoule_data-&gt;chksum)&quot;. Wie funktioniert diese Schleife? Und was wird in checksum geschrieben. (ampule_data sind Daten ... also die werden einfach generiert durch einlesen).</p>
<p>Vielen Dank schon mal und lieben Gruß<br />
GnR</p>
<p>(tschuldigung für alle Rechtschreibfehler)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305843/hilfe-bei-quellcode</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:25:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305843.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Jul 2012 09:30:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 09:30:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hoffe, dass ich die Sprache richtig als C/Cpp interpretiert habe .. bin mir aber da noch nicht mal so sicher ^^. Dennoch bräuchte ich hilfe beim verstehen des Quellcodes. Dieser ist für ein Gerät. Daten werden von diesem Gerät per HEX an den PC weiter gegeben, dort sollen sie verarbeitet werden und in anderer Form zurück gegeben werden. Diese Funktion ist ursprünglich jedoch nicht vorgesehen gewesen (leider).</p>
<pre><code class="language-cpp">uword calc_ampoule_chksum( mem_amp_entry_t* ampoule_data )
{
  ubyte *p;
  uword chksum;

  chksum = 0;
  for(p=(ubyte*) ampoule_data;
      p&lt;(ubyte*) &amp;(ampoule_data-&gt;chksum); p++) {
    chksum += *p;
  }
  return chksum;
}
</code></pre>
<p>Hier wird eine checksum berechnet. Jedoch verstehe ich diesen Algorythmus nicht so wirklich. Vor allem die passage &quot; p&lt;(ubyte*) &amp;(ampoule_data-&gt;chksum)&quot;. Wie funktioniert diese Schleife? Und was wird in checksum geschrieben. (ampule_data sind Daten ... also die werden einfach generiert durch einlesen).</p>
<p>Vielen Dank schon mal und lieben Gruß<br />
GnR</p>
<p>(tschuldigung für alle Rechtschreibfehler)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231573</guid><dc:creator><![CDATA[GnR1993]]></dc:creator><pubDate>Tue, 10 Jul 2012 09:30:16 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 09:45:54 GMT]]></title><description><![CDATA[<p>Die Schleife zählt alle Bytes von dem struct *ampoule_data (Bitte lass das C sein und kein komplexer C++-Datentyp!) zusammen, die vor dessen Feld chksum stehen.</p>
<pre><code class="language-cpp">p=(ubyte*) ampoule_data; // Weise p den Wert von ampoule_data (die Anfangsadresse des hier betrachteten Objekts) zu

p&lt;(ubyte*) &amp;(ampoule_data-&gt;chksum);  // Solange p kleiner ist als die Adresse des Objektmembers chksum

p++     // Setze p auf das nächste Byte des Objekts
</code></pre>
<p>Selbst in C ist dies höchst gewagt und kann an unzähligen Stellen schiefgehen, in C++ ist so gut wie sicher, dass dies explodiert. Es kann unter gewissen Umständen mit genau bekanntem Compiler und Compilereinstellungen etwas sinnvolles rauskommen, aber kleinste Änderungen am System hätten fatale Auswirkungen, die man sogar nicht einmal sofort bemerken würde!</p>
<p>P.S.: C und C++ sind zwei unterschiedliche Sprachen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231579</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Jul 2012 09:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 09:45:55 GMT]]></title><description><![CDATA[<p>ampoule_data scheint eine Datenstruktur zu sein, die unter anderem ein Member namens chksum enthält. In der Schleife werden alle Bytes der Struktur bis zu diesem Member ausschließlich genommen und aufaddiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231580</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 10 Jul 2012 09:45:55 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 10:02:30 GMT]]></title><description><![CDATA[<p>Ja, dass das unterschiedliche sprachen sind, weiß ich auch ^^ ... und da das auf einen µC geschrieben wird, wird es denke ich mal C sein (ist ja eigentlich typisch), war mir nur nicht sicher <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /> ... auf dem gerät Funktioniert alles (ich habs auch nicht geschrieben, sondern ein professioneller ^^). Ich muss nur das ganze jetzt auf dem PC Verarbeiten ... da hab ich dann jedoch HEX werte. Muss ich diese erst einmal in Bytes umwandeln !? oder wie kann ich das am besten machen?</p>
<p>Eine Amp inner HEX sieht folgendermaßen aus:</p>
<p>41 00 22 4E 00 00 (ab hier geht der eigentliche Datensatz los) 51 57 45 52 54 5A 55 49 4F 50 ... (viele Nullen) ... D9 03</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231587</guid><dc:creator><![CDATA[GnR1993]]></dc:creator><pubDate>Tue, 10 Jul 2012 10:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 10:07:19 GMT]]></title><description><![CDATA[<p>Die Frage nach dem Unterschied zwischen Hex und Bytes ist wie die Frage nach dem Unterschied zwischen Arial und einem Buch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231589</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Jul 2012 10:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 10:09:19 GMT]]></title><description><![CDATA[<p>GnR1993 schrieb:</p>
<blockquote>
<p>Ich muss nur das ganze jetzt auf dem PC Verarbeiten ... da hab ich dann jedoch HEX werte. Muss ich diese erst einmal in Bytes umwandeln !? oder wie kann ich das am besten machen?</p>
<p>Eine Amp inner HEX sieht folgendermaßen aus:</p>
<p>41 00 22 4E 00 00 (ab hier geht der eigentliche Datensatz los) 51 57 45 52 54 5A 55 49 4F 50 ... (viele Nullen) ... D9 03</p>
</blockquote>
<p>Du hast da direkt eine Textdatei vorliegen, die die Hexadezimalwerte in Textform enthält?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231591</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 10 Jul 2012 10:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 10:21:41 GMT]]></title><description><![CDATA[<p>GnR1993 schrieb:</p>
<blockquote>
<p>... und da das auf einen µC geschrieben wird, wird es denke ich mal C sein</p>
</blockquote>
<p>Das hindert niemanden, trotzdem portabel zu programmieren.</p>
<pre><code class="language-cpp">{
  unsigned short chksum=0;
  size_t x = offsetof(mem_amp_entry_t,chksum);
  unsigned char *p=ampoule_data;
  while( x-- )
    chksum+=*p++;

  return chksum;
}
</code></pre>
<p>GnR1993 schrieb:</p>
<blockquote>
<p>Ich muss nur das ganze jetzt auf dem PC Verarbeiten ... da hab ich dann jedoch HEX werte. Muss ich diese erst einmal in Bytes umwandeln !?</p>
</blockquote>
<p>Natürlich nicht.<br />
Sofern auf beiden Systemen/Compilern CHAR_BIT gleich ist, sollte es kein Problem geben.<br />
Es muss aber auch das Alignment/struct padding zwischen PC und μC übereinstimmen, oder du setzt es (bei der struct Deklaration) explizit auf 1 (d.h. keine struct-Paddingbytes), das geht nicht portabel aber viele Compiler bieten dies an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231595</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Tue, 10 Jul 2012 10:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 10:56:57 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>[...]<br />
Du hast da direkt eine Textdatei vorliegen, die die Hexadezimalwerte in Textform enthält?</p>
</blockquote>
<p>jo ... die wird so auf den PC übertragen ... die letzten 4 Ziffern (D903) sind vermutlich die Checksum ^^</p>
<p>Wutz schrieb:</p>
<blockquote>
<p>GnR1993 schrieb:</p>
<blockquote>
<p>... und da das auf einen µC geschrieben wird, wird es denke ich mal C sein</p>
</blockquote>
<p>Das hindert niemanden, trotzdem portabel zu programmieren.</p>
<pre><code class="language-cpp">{
  unsigned short chksum=0;
  size_t x = offsetof(mem_amp_entry_t,chksum);
  unsigned char *p=ampoule_data;
  while( x-- )
    chksum+=*p++;

  return chksum;
}
</code></pre>
<p>GnR1993 schrieb:</p>
<blockquote>
<p>Ich muss nur das ganze jetzt auf dem PC Verarbeiten ... da hab ich dann jedoch HEX werte. Muss ich diese erst einmal in Bytes umwandeln !?</p>
</blockquote>
<p>Natürlich nicht.<br />
Sofern auf beiden Systemen/Compilern CHAR_BIT gleich ist, sollte es kein Problem geben.<br />
Es muss aber auch das Alignment/struct padding zwischen PC und μC übereinstimmen, oder du setzt es (bei der struct Deklaration) explizit auf 1 (d.h. keine struct-Paddingbytes), das geht nicht portabel aber viele Compiler bieten dies an.</p>
</blockquote>
<p>Öhm .. ich versteh nur Bahnhof .. Sorry ... danke schon mal ^^ aber danke ^^ die Software wurde vor längerer zeit programmiert ..und die umzuschreiben wäre nicht praktikabel! ... wie kann ich das denn auf dem PC am besten realisieren? .. ohne etwas in der SW zu ändern oder den Compiler zu ändern? .. habe ja schon die HEX und die Funktioniert (bidirektionale Übertagung) .. die soll halt nur geändert werden. Dafür muss ich jedoch eine neue Checksum berechnen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231605</guid><dc:creator><![CDATA[GnR1993]]></dc:creator><pubDate>Tue, 10 Jul 2012 10:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 11:20:26 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>Das hindert niemanden, trotzdem portabel zu programmieren.</p>
<pre><code class="language-cpp">{
  unsigned short chksum=0;
  size_t x = offsetof(mem_amp_entry_t,chksum);
  unsigned char *p=ampoule_data;
  while( x-- )
    chksum+=*p++;

  return chksum;
}
</code></pre>
</blockquote>
<p>Was ist daran portabel?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231607</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 10 Jul 2012 11:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 16:00:01 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wutz schrieb:</p>
<blockquote>
<p>Das hindert niemanden, trotzdem portabel zu programmieren.</p>
<pre><code class="language-cpp">{
  unsigned short chksum=0;
  size_t x = offsetof(mem_amp_entry_t,chksum);
  unsigned char *p=ampoule_data;
  while( x-- )
    chksum+=*p++;

  return chksum;
}
</code></pre>
</blockquote>
<p>Was ist daran portabel?</p>
</blockquote>
<p>ICh hab mal eine Frage. Vor einer Weile hab ich gelesen:</p>
<p>N3337 9.2, Klausel 14 schrieb:</p>
<blockquote>
<p>Implementation alignment requirements might<br />
cause two adjacent members not to be allocated immediately after each other;</p>
</blockquote>
<p>Also definiert keiner, an welcher Stelle im Speicher relativ zur Adresse einer Instanz von <code>mem_amp_entry_t chksum</code> steht. Heißt das nicht, dass auch nicht definiert ist, welches Ergebnis bei der Aufsummierung herauskommt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231665</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 10 Jul 2012 16:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 18:02:55 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>ICh hab mal eine Frage. Vor einer Weile hab ich gelesen:</p>
<p>N3337 9.2, Klausel 14 schrieb:</p>
<blockquote>
<p>Implementation alignment requirements might<br />
cause two adjacent members not to be allocated immediately after each other;</p>
</blockquote>
<p>Also definiert keiner, an welcher Stelle im Speicher relativ zur Adresse einer Instanz von <code>mem_amp_entry_t chksum</code> steht. Heißt das nicht, dass auch nicht definiert ist, welches Ergebnis bei der Aufsummierung herauskommt?</p>
</blockquote>
<p>Ich bin mir nicht sicher, ob du das richtige meinst. Es ist durchaus definiert, an wievielter Stelle checksum und auch alle anderen Member kommen. Jedoch ist undefiniert, ob dazwischen nicht noch irgendwas anderes (=Datenmüll) steht. Und ja: Wenn hier noch irgendwas anderes zwischen den Membern stehen sollte, dann ist das Ergebnis der Rechnung auch Müll. Falls Padding unterdrückt wurde (ein verbreitetes Compilerfeature), dann ist das Ergebnis durchaus halbwegs definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231708</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Jul 2012 18:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 18:26:32 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>durchaus halbwegs</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <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/2231715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231715</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Tue, 10 Jul 2012 18:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Tue, 10 Jul 2012 19:15:32 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Es ist durchaus definiert, an wievielter <strong>Stelle</strong> checksum</p>
</blockquote>
<p>Das ist mir klar, ich meinte dass hier:</p>
<pre><code>0x351368f Adresse der Instanz
...
0x351369e Ist definiert, ob *hier* der Member xyz beginnt? Nein, also kann das aufsummieren aller zwischenliegenden Bytes auch keinen Sinn machen, oder?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2231729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231729</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 10 Jul 2012 19:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Mon, 16 Jul 2012 07:39:25 GMT]]></title><description><![CDATA[<p>Hmm, danke schon mal .. aber heißt ja dann mehr oder weniger, dass es nicht möglich ist, oder? ... am QT fürs Device kann ich nicht schrauben!</p>
<p>Ach ja ... was ich vielleicht hätte sagen sollen:<br />
es handelt sich hier um einen S-Record ... hilft das was?</p>
<p>Also hab am anfang der Zeile:<br />
S38540C00080</p>
<p>und am ende halt meine S-Record Checksum ... hmmm</p>
<p>bin atm etwas überfragt ^^ bin noch kein so guter Programmierer! (na ja ... eher Hobby level)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233091</guid><dc:creator><![CDATA[GnR1993]]></dc:creator><pubDate>Mon, 16 Jul 2012 07:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Mon, 16 Jul 2012 08:39:07 GMT]]></title><description><![CDATA[<p>GnR1993 schrieb:</p>
<blockquote>
<p>Hmm, danke schon mal .. aber heißt ja dann mehr oder weniger, dass es nicht möglich ist, oder?</p>
</blockquote>
<p>Du kannst den Code in deinem ersten Beitrag problemlos nachmachen. Bloß dieser war falsch und wird in vielen Fällen nicht funktionieren. Wenn er jedoch funktioniert hat, dann wird auch die Nachmache funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233113</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 16 Jul 2012 08:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe bei Quellcode on Mon, 16 Jul 2012 11:59:33 GMT]]></title><description><![CDATA[<p>muss ich dafür nicht wissen, an welcher Stelle im Programm das Byte steht? ... oder Verstehe ich das ganze hier gerade Falsch ?</p>
<p>Das heißt ja, dass:</p>
<pre><code class="language-cpp">p=(ubyte*) ampoule_data; // Weise p den Wert von ampoule_data (die Anfangsadresse des hier betrachteten Objekts) zu
</code></pre>
<p>(SeppJ) so viel Bedeutet, wie den Wert, den dieses Objekt an der Stelle hat, und nicht den wert der Adresse also Adresse XY im Speicher, oder? ... wie gesagt: hobby programmierer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233174</guid><dc:creator><![CDATA[GnR1993 (Gast)]]></dc:creator><pubDate>Mon, 16 Jul 2012 11:59:33 GMT</pubDate></item></channel></rss>