<?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[Problem mit Makro]]></title><description><![CDATA[<p>Ich muss für einen kleinen Quelltextfetzen ein Makro schreiben der die Fakultät von einer Start-Variablen und einer End-Variablen berechnet.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Gesagt getan ... Mein Ergebnis ist dieses:</p>
<pre><code class="language-cpp">#define PRODUKT(start, ende, ergebnis)\
(ergebnis = 1;\
for (start; start &lt;= ende; start++) ergebnis = start * ergebnis;)
</code></pre>
<p>Jetzt wirft er mir aber die Fehlermeldung um die Ohren, dass &quot;ergebnis&quot; nicht initialisiert ist, was ich auch verstehe weil der Quelltextfetzen ja keinen Wert zuweist.<br />
Ich habe bloß keine Ahnung wie ich das mit dem Makro behebe weil ich darf den Quelltext nicht verändern.</p>
<p>Ich danke schon im voraus für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288136/problem-mit-makro</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 03:16:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288136.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jun 2011 21:33:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 21:36:14 GMT]]></title><description><![CDATA[<p>Ich muss für einen kleinen Quelltextfetzen ein Makro schreiben der die Fakultät von einer Start-Variablen und einer End-Variablen berechnet.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Gesagt getan ... Mein Ergebnis ist dieses:</p>
<pre><code class="language-cpp">#define PRODUKT(start, ende, ergebnis)\
(ergebnis = 1;\
for (start; start &lt;= ende; start++) ergebnis = start * ergebnis;)
</code></pre>
<p>Jetzt wirft er mir aber die Fehlermeldung um die Ohren, dass &quot;ergebnis&quot; nicht initialisiert ist, was ich auch verstehe weil der Quelltextfetzen ja keinen Wert zuweist.<br />
Ich habe bloß keine Ahnung wie ich das mit dem Makro behebe weil ich darf den Quelltext nicht verändern.</p>
<p>Ich danke schon im voraus für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076564</guid><dc:creator><![CDATA[user369]]></dc:creator><pubDate>Fri, 10 Jun 2011 21:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 21:52:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">PRODUKT(3,5,ergebnis);
#define PRODUKT(start, ende, ergebnis)\
(ergebnis = 1;\
for (start; start &lt;= ende; start++) ergebnis = start * ergebnis;)
</code></pre>
<p>expandiert zu<br />
(ergebnis = 1;\<br />
for (1; 1 &lt;= 5; 1++) ergebnis = 1 * ergebnis;)</p>
<p>Denke eher an</p>
<pre><code class="language-cpp">#define PRODUKT(start, ende, ergebnis)\
ergebnis = 1;\
for (int i=start; i &lt;= ende; i++) ergebnis = i * ergebnis;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2076567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076567</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Jun 2011 21:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 21:57:57 GMT]]></title><description><![CDATA[<p>Es ist in diesem konkreten Fall nicht notwendig, aber ich halte es für sinnvoll, geschweifte Klammern um das Makro zu setzen, d.h.</p>
<pre><code class="language-cpp">#define PRODUKT(start, ende, ergebnis) {                     \
  ergebnis = 1;                                              \
  for (int i=start; i &lt;= ende; i++) ergebnis = i * ergebnis; \
}
</code></pre>
<p>Dann kann man auch</p>
<pre><code class="language-cpp">if(foo) PRODUKT(bar, baz, qux);
</code></pre>
<p>schreiben (Semikolon optional).</p>
<p>Ansonsten zwei Anmerkungen zum Stil: Es ist in C++ eine gute Angewohnheit, das Präinkrement dem Postinkrement vorzuziehen, wo es möglich ist. Bei komplexen Datentypen ist ++x üblicherweise schneller als x++, weil eine Kopie eingespart wird. Außerdem kann man</p>
<pre><code class="language-cpp">ergebnis = ergebnis * i;
</code></pre>
<p>kürzer als</p>
<pre><code class="language-cpp">ergebnis *= i;
</code></pre>
<p>schreiben. Wieder macht das für Basistypen keinen Unterschied, kann aber bei komplexen Datentypen Arbeit einsparen und ist dementsprechend eine gute Angewohnheit.</p>
<p>Natürlich wäre es insgesamt auch besserer Stil, den ganzen Kram als Funktion statt als Makro umzusetzen, aber ich nehme an, dass die Aufgabenstellung das so vorschreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076568</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 10 Jun 2011 21:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:17:01 GMT]]></title><description><![CDATA[<p>Ich danke schon mal für die schnelle Hilfe!<br />
Und ja, das mit dem Makro ist Aufgabenstellungsbedingt.<br />
Ich habe das jetzt umgesetzt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define PRODUKT(start, ende, ergebnis) {                 \
ergebnis = 1;                                            \
for (int i = start; i &lt;= ende; i++) ergebnis *= i;)      \
}

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Zwei neue Fragen ergeben sich mir dann:<br />
Wozu das &quot;int i = start&quot;? Was macht das?<br />
Und er schreibt nun als Fehlermeldung &quot;Error: Es wurde ein Ausdruck erwartet&quot; mit rot unterstrichenem &quot;PRODUKT&quot; in der main.<br />
Was habe ich falsch gemacht?<br />
(Ich benutze MS Visual 2010)</p>
<p>edit: Das mit den</p>
<pre><code class="language-cpp">\
</code></pre>
<p>in einer Reihe ganz hinten in dem Makro werde ich mir merken sieht hübscher aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076570</guid><dc:creator><![CDATA[user369]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:13:51 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>(Semikolon optional)</p>
</blockquote>
<p>Hmm, dann aber bis zum Ende führen.<br />
Das macht dann</p>
<pre><code class="language-cpp">if(foo) 
   PRODUKT(bar, baz, qux);
else
   PRODUKT(bar, bza, qxu);
</code></pre>
<p>kaputt. Das ; nach } sperrt das else ab.</p>
<pre><code class="language-cpp">#define PRODUKT(start, ende, ergebnis) do {                     \
  ergebnis = 1;                                              \
  for (int i=start; i &lt;= ende; i++) ergebnis = i * ergebnis; \
} while(false)
</code></pre>
<p>könnte klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076571</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:17:16 GMT]]></title><description><![CDATA[<p>user369 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (int i = start; i &lt;= ende; i++) ergebnis *= i;)      \
</code></pre>
</blockquote>
<p>Die runde Klammer zu am Ende ist ja Quatsch.<br />
Ich hab sie auch gemacht, bin nicht so präzise wie seldon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076573</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:17:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:25:51 GMT]]></title><description><![CDATA[<p>Ahh perfekt!<br />
Aber naja, ist schon spät ...<br />
und ich hocke schon wieder seit 4std vor der Kiste ...<br />
da vergisst man auch mal eine runde Klammer zu entfernen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
aber es funkioniert jetzt!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define PRODUKT(start, ende, ergebnis) do {          \
ergebnis = 1;                                        \
for (int i = start; i &lt;= ende; i++) ergebnis *= i;   \
} while (false)

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Bleibt meine Frage: Wieso das &quot;int i = start&quot; Was macht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076575</guid><dc:creator><![CDATA[user369]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:31:03 GMT]]></title><description><![CDATA[<p>user369 schrieb:</p>
<blockquote>
<p>Ahh perfekt!<br />
Aber naja, ist schon spät ...<br />
und ich hocke schon wieder seit 4std vor der Kiste ...<br />
da vergisst man auch mal eine runde Klammer zu entfernen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
aber es funkioniert jetzt!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define PRODUKT(start, ende, ergebnis) do {          \
ergebnis = 1;                                        \
for (int i = start; i &lt;= ende; i++) ergebnis *= i;   \
} while (false)

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Bleibt meine Frage: Wieso das &quot;int i = start&quot; Was macht das?</p>
</blockquote>
<p>Nur ne moderne Schreibweise für</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define PRODUKT(start, ende, ergebnis) do {          \
ergebnis = 1;                                        \
int i;                                               \
for (i=start; i &lt;= ende; i++) ergebnis *= i;               \
} while (false)

int main() {
	unsigned int ergebnis;
	PRODUKT(3,5,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;
	PRODUKT(3,9,ergebnis);
    cout &lt;&lt; ergebnis &lt;&lt; endl;    
    return 0;
}
</code></pre>
<p>Und i bleibt dadurch innerhalb der for-Schleife lokal, was hier aber egal ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076578</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 22:33:09 GMT]]></title><description><![CDATA[<p>Ahh ok.<br />
Dann bedanke ich mich für die Hilfe!<br />
Mal wieder schneller und besser als meine Tutoren! <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=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076579</guid><dc:creator><![CDATA[user369]]></dc:creator><pubDate>Fri, 10 Jun 2011 22:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 23:02:45 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>user369 schrieb:</p>
<blockquote>
<p>Bleibt meine Frage: Wieso das &quot;int i = start&quot; Was macht das?</p>
</blockquote>
<p>Nur ne moderne Schreibweise für</p>
</blockquote>
<p>Diese Schreibweise ist älter als viele Forenteilnehmer, den Threadersteller vermutlich eingeschlossen (falls er mit dem Studium gerade anfängt). <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/2076585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076585</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 10 Jun 2011 23:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Makro on Fri, 10 Jun 2011 23:32:59 GMT]]></title><description><![CDATA[<p>Nochwas: unsigned i ist angemessener, wenn der Prof schon mit unsigned int vorlegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076586</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Jun 2011 23:32:59 GMT</pubDate></item></channel></rss>