<?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[Struct in eine Funktion übergeben]]></title><description><![CDATA[<p>Hallo Leute!<br />
Bin gerade dabei das Programm &quot;Towers Of Hanoi&quot; zu erstellen.<br />
Bin eigentl. schon sehr weit, nur komme ich momentan nicht mehr weiter, denn:</p>
<p>-&gt;man darf keine globale Variablen im Programm benutzen.<br />
Also habe ich ein Struct Storage erstellt:</p>
<p>--&gt; maxrings ist als 12 deklariert</p>
<pre><code class="language-cpp">struct Storage
{

int  iTower;                //number of rings @ start on TowerA
int  iStart;                //tell me if user started GAME with SPACE
int  iCounter;              //needed for fLog to get logarithm (start Game)

//count till a ring is larger than &quot;-1&quot;  --&gt; -1 --&gt; no ring there
int iA;
int iB;
int iC;

char iTowerA[maxrings];     //create array for Tower A B C--&gt;
char iTowerC[maxrings];
char iTowerB[maxrings];
char cSwitcher;
char cModus;                // tells program if automatic or manual mode

};
</code></pre>
<p>so, hier dann die main:</p>
<pre><code class="language-cpp">int main()
{
  struct Storage S; 

  //get start values
  fInit(&amp;S);  

  //do till 'q'
  while(S.cModus!='q')
  {

    //presses ESC Button == RESET
    if(S.cModus=='e')
        {
        fInit(&amp;S);
        }

    fCalculate(&amp;S);

    if(S.iStart==1)
    {
        fLog(&amp;S);        
    }
    fMenue(S);
    fVisual(S);
    fStatus(S);
    fGetValues(&amp;S);
    system(&quot;cls&quot;);

  }
}
</code></pre>
<p>und fLog ist mein Lösungsalgorithmus:</p>
<pre><code class="language-cpp">#include &quot;hanoi.h&quot;

fLog(struct Storage *S)

{

/*   if (iTower == 1)
   {
      printf(&quot;Move from %c to %c\n&quot;,cA, cC);
   }
   else
   {
      fLog( iTower-1, cA, cB, cC );
      fLog(       1, cA, cC, cB ); 
      fLog( rings-1, cB, cC, cA );
   }  

*/ 
}
</code></pre>
<p>Okay soweit klappt alles, bi auf fLog:</p>
<p>Ich würde dem fLog eigentl. nur folgendes aus dem Struct übergeben (als pointer):</p>
<p>S-&gt;iTower //anzahl der ringe am Start<br />
S-&gt;iTowerA //array des 1. turms --&gt; später cA<br />
S-&gt;iTowerB //array des 2. turms --&gt; später cB<br />
S-&gt;iTowerC //array des 3. turms --&gt; später cC</p>
<p>Also die Variblen (cA,cB,cC) muss ich den Logarithmus noch anpassen, aber wie schaffe ich es, NUR die 4 oben genannten Pointer zu übergeben, damit die Rekursion richtig klappt?!</p>
<p>Vielen Dank schonmal!<br />
Hoffe es war verständlich genug <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/topic/257479/struct-in-eine-funktion-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 13:39:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257479.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Dec 2009 11:11:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 11:11:21 GMT]]></title><description><![CDATA[<p>Hallo Leute!<br />
Bin gerade dabei das Programm &quot;Towers Of Hanoi&quot; zu erstellen.<br />
Bin eigentl. schon sehr weit, nur komme ich momentan nicht mehr weiter, denn:</p>
<p>-&gt;man darf keine globale Variablen im Programm benutzen.<br />
Also habe ich ein Struct Storage erstellt:</p>
<p>--&gt; maxrings ist als 12 deklariert</p>
<pre><code class="language-cpp">struct Storage
{

int  iTower;                //number of rings @ start on TowerA
int  iStart;                //tell me if user started GAME with SPACE
int  iCounter;              //needed for fLog to get logarithm (start Game)

//count till a ring is larger than &quot;-1&quot;  --&gt; -1 --&gt; no ring there
int iA;
int iB;
int iC;

char iTowerA[maxrings];     //create array for Tower A B C--&gt;
char iTowerC[maxrings];
char iTowerB[maxrings];
char cSwitcher;
char cModus;                // tells program if automatic or manual mode

};
</code></pre>
<p>so, hier dann die main:</p>
<pre><code class="language-cpp">int main()
{
  struct Storage S; 

  //get start values
  fInit(&amp;S);  

  //do till 'q'
  while(S.cModus!='q')
  {

    //presses ESC Button == RESET
    if(S.cModus=='e')
        {
        fInit(&amp;S);
        }

    fCalculate(&amp;S);

    if(S.iStart==1)
    {
        fLog(&amp;S);        
    }
    fMenue(S);
    fVisual(S);
    fStatus(S);
    fGetValues(&amp;S);
    system(&quot;cls&quot;);

  }
}
</code></pre>
<p>und fLog ist mein Lösungsalgorithmus:</p>
<pre><code class="language-cpp">#include &quot;hanoi.h&quot;

fLog(struct Storage *S)

{

/*   if (iTower == 1)
   {
      printf(&quot;Move from %c to %c\n&quot;,cA, cC);
   }
   else
   {
      fLog( iTower-1, cA, cB, cC );
      fLog(       1, cA, cC, cB ); 
      fLog( rings-1, cB, cC, cA );
   }  

*/ 
}
</code></pre>
<p>Okay soweit klappt alles, bi auf fLog:</p>
<p>Ich würde dem fLog eigentl. nur folgendes aus dem Struct übergeben (als pointer):</p>
<p>S-&gt;iTower //anzahl der ringe am Start<br />
S-&gt;iTowerA //array des 1. turms --&gt; später cA<br />
S-&gt;iTowerB //array des 2. turms --&gt; später cB<br />
S-&gt;iTowerC //array des 3. turms --&gt; später cC</p>
<p>Also die Variblen (cA,cB,cC) muss ich den Logarithmus noch anpassen, aber wie schaffe ich es, NUR die 4 oben genannten Pointer zu übergeben, damit die Rekursion richtig klappt?!</p>
<p>Vielen Dank schonmal!<br />
Hoffe es war verständlich genug <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/1829218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829218</guid><dc:creator><![CDATA[aikonCC]]></dc:creator><pubDate>Tue, 29 Dec 2009 11:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 11:22:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Also die Variblen (cA,cB,cC) muss ich den Logarithmus noch anpassen, aber wie schaffe ich es, NUR die 4 oben genannten Pointer zu übergeben, damit die Rekursion richtig klappt?!</p>
</blockquote>
<p><strong>Algorithmus</strong>!<br />
Und warum deklarierst du die Funktion nicht einfach mit zusätzlichen Parametern?</p>
<p>btw:<br />
Es gibt eine sehr einfache rekursive Lösung des Problems. 3 Zeilen reichen üblicherweise, aber probiers ruhig mal so nach deinem Weg!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829222</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 29 Dec 2009 11:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 11:24:10 GMT]]></title><description><![CDATA[<p>Mach dir Gedanken um eine bessere Struktur deines Programmes. Eine Superstruktur die einfach alles enthält ist oft ein Designfehler, so auch hier. Fasse deine Variablen zu sinnvollen Objekten zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829224</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 29 Dec 2009 11:24:10 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 11:51:53 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antworten.<br />
Okay, das Design passt noch nicht ganz, aber das darf ich mal hinten anstehen lassen, okay? <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>
<p>Okay, ich rufe in der main ja meine Funktion auf:</p>
<pre><code class="language-cpp">fLog(&amp;S);
</code></pre>
<p>dabei übergebe ich doch die Adresse mit &amp;S (mein Storage Struct S).</p>
<p>ich habe mal folgendes mit der fLog probiert:</p>
<pre><code class="language-cpp">#include &quot;hanoi.h&quot;

fLog(struct Storage *S-&gt;iTower, *S-&gt;iTowerA, *S-&gt;iTowerB, *S-&gt;iTowerC)

{

   if (iTower == 1)
   {
      printf(&quot;Move from %c to %c\n&quot;,iTowerA, iTowerC);
   }
   else
   {
      fLog( iTower-1, iTowerA, iTowerB, iTowerC );
      fLog(       1, iTowerA, iTowerC, iTowerB );
      fLog( rings-1, iTowerB, iTowerC, iTowerA );
   }  

}
</code></pre>
<p>Mein Compiler sagt dann bei folgender Zeile:</p>
<pre><code class="language-cpp">fLog(struct Storage *S-&gt;iTower, *S-&gt;iTowerA, *S-&gt;iTowerB, *S-&gt;iTowerC)
</code></pre>
<p><strong>syntax before -&gt; token</strong></p>
<p>hm, okay, aber wie schreib ichs dann richtig, hab keine Ahnung was da falsch sein soll, mit:</p>
<pre><code class="language-cpp">fLog(struct Storage *S)
</code></pre>
<p>nimmt er es ja auch, aber halt nur das GANZE Struct <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>Wo liegt mein Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829234</guid><dc:creator><![CDATA[aikonCC]]></dc:creator><pubDate>Tue, 29 Dec 2009 11:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 12:04:26 GMT]]></title><description><![CDATA[<p>Warum dereferenzierst du denn bei der Deklaration der Funktion?!<br />
Das struct brauchst du in C++ auch nicht hinschreiben:</p>
<pre><code class="language-cpp">fLog(Storage&amp; Tower, Storage&amp; TowerA, Storage&amp; TowerB, Storage&amp; TowerC)
{
   if (iTower == 1)
   {
      printf(&quot;Move from %c to %c\n&quot;,TowerA, TowerC);
   }
   else
   {
      fLog( Tower-1, TowerA, TowerB, TowerC );
      fLog(       1, TowerA, TowerC, TowerB );
      fLog( rings-1, TowerB, TowerC, TowerA );
   }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1829241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829241</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 29 Dec 2009 12:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 15:41:07 GMT]]></title><description><![CDATA[<p>Hey drakon, vielen Dank für den Rat, aber ich komme immer noch nicht weiter.</p>
<p>Also ich habs so probiert wie du es mir empfohlen hast:</p>
<p>die fLog rufe ich ja so auf: fLog(<strong>&amp;S</strong>)<br />
das sollte ja passen, denn ich will das Struct Storage <strong>S</strong> übergeben</p>
<p>die Funktion selbst (ist in einer separaten C-Datei):</p>
<pre><code class="language-cpp">#include &quot;hanoi.h&quot;

fLog(Storage&amp; Tower, Storage&amp; TowerA, Storage&amp; TowerB, Storage&amp; TowerC)
{

}
</code></pre>
<p>BTW: Hab mal den Rest der Funktion als Kommentar gemacht um den Fehler einzugrenzen</p>
<p>Mein Compiler (M$ Visual Studio 2008) meckert dann aber bei fLog:</p>
<p><strong>Fehler 1 error C2143: Syntaxfehler: Es fehlt ')' vor '&amp;'</strong><br />
...<br />
<strong>Fehler 3 error C2059: Syntaxfehler: '&amp;'</strong><br />
...</p>
<p>BTW: Ich hab ein Struct namens <strong>Storage</strong>, die Werte Speicher ich aber in <strong>Storage S</strong> ein. Ich kann doch eine XBeliebige Variable Hinter Storage machen, oder?! Also hab ich es einfach halber S genannt.</p>
<p>Alle Werte Werden nun in Storage S gespeichert?! Also so stell ich mir das mal vor^^</p>
<p>Okay, dann hab ich jetzt mal rumprobiert:</p>
<pre><code class="language-cpp">fLog(Storage&amp; S-&gt;Tower etc...)
</code></pre>
<p>Aber es kommt immer noch der gleiche Fehler mit der Klammer und dem UND...</p>
<p>Wieso muss ich eigentl. das <strong>&amp;</strong> Zeichen in der Funktion nehmen, wenn ich die Funktion fLog(<strong>&amp;S</strong>) schon so aufrufe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829398</guid><dc:creator><![CDATA[aikonCC]]></dc:creator><pubDate>Tue, 29 Dec 2009 15:41:07 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Tue, 29 Dec 2009 15:56:20 GMT]]></title><description><![CDATA[<p>Phu.. dir scheint vieles noch nicht so klar zu sein. <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>
<p>Ich denke du solltest zuerst ein wenig mit den Grundlagen rumspielen, bevor du dich an einen rekursiven Algorithmus machst. <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>
<p>Das -1</p>
<pre><code class="language-cpp">fLog( Tower-1, TowerA, TowerB, TowerC );
</code></pre>
<p>hier macht imo nicht viel Sinn, da Tower den - Operator gar nicht unterstützt..</p>
<p>Das mit den &amp; ist eine Referenz.</p>
<pre><code class="language-cpp">int n = 5;
int* pn = &amp;n; // pn ist ein Zeiger auf n
int&amp; rn = n; // rn ist eine Referenz auf n
</code></pre>
<p>Der &amp;-Operator hat also 2 Einsatzgebiete (gibt noch mehr Bedeutungen, aber das ist jetzt egal). Zum einen wird er benutzt, um die Adresse einer Variable (oder Funktion) zu bekommen und anderseits wird er bei Variablendeklarationen dazu benutzt um eine Referenz zu markieren. (Eine Referenz ist ja so etwas ähnliches, wie ein Zeiger).</p>
<p>Referenzen kannst du so angeben, als ob eine Kopie erstellt würde. Also kannst du die Funktion ganz normal ohne den &amp;-Operator aufrufen, wie ich das ja im letzten Post bereits gezeigt habe. (alleine aufgrund des -1 kann das so nicht funktionieren, darum solltest du dir das ganze einfach noch ein wenig besser überlegen).</p>
<p>Also ich rate dir jetzt zuerst einmal ein wenig mit Variablen, Funktionen, Referenzen, Funktionsaufrufe usw. rum zu spielen, dann weisst du auch besser, was du hier flasch machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829411</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 29 Dec 2009 15:56:20 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Wed, 06 Jan 2010 12:29:23 GMT]]></title><description><![CDATA[<p>Wünsch euch allen erstmal n gutes neues Jahr! ^^</p>
<p>So,... bin wieder da, und hab das blööde bööse Towers of Hanoi so gut wie fertig!<br />
Mich hatte das &quot;&amp;&quot; bei &quot;Storage&amp; Tower&quot; irritiert, weil da n Leerzeichen dazwischen war.... Naja egal, habs jetzt ja soweit.</p>
<p>Also klappt alles wunderbar, Automatik und Manuellmodus.</p>
<p>Nur bleib ich grad am letzten Schliff hängen:</p>
<p>Und zwar muss man im Automatik modus zu jederzeit mit der ESCAPE Taste den Durchlauf unterbrechen.</p>
<p>Da habe ich mir gedacht ich frag das einfach per getch() ab.<br />
Aber dann würde mein Automatikmodus immer auf eine Eingabe warten.</p>
<p>Kann ich getch() so definieren dass es z.b. nur für 20ms abfrägt und wenn nix kommt läuft der Automatikmodus weiter...?!</p>
<p>Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833587</guid><dc:creator><![CDATA[aikonCC]]></dc:creator><pubDate>Wed, 06 Jan 2010 12:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Wed, 06 Jan 2010 13:43:45 GMT]]></title><description><![CDATA[<p>Ich denke, dass du die Abfrage am ehesten in einem seperten Thread haben möchtest.</p>
<p>Du erstellst eine einen neuen Thread mit z.B <a href="http://www.boost.org/doc/libs/1_41_0/doc/html/thread.html" rel="nofollow">boost::thread</a>.</p>
<p>Aber du kannst eigentlich ja auch einfach mit Ctrl+C abbrechen, wenn dus dir da einfach machen willst. <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/1833644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833644</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 06 Jan 2010 13:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Wed, 06 Jan 2010 13:46:47 GMT]]></title><description><![CDATA[<p>Oder anderen Signalen und einem signal handler, was nicht direkt zur Terminierung führen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833646</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 06 Jan 2010 13:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Struct in eine Funktion übergeben on Wed, 06 Jan 2010 13:55:15 GMT]]></title><description><![CDATA[<p>Prüfe erst mit kbhit(), und danach lies erst die Taste ein, s.a. <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39320.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39320.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833658</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 06 Jan 2010 13:55:15 GMT</pubDate></item></channel></rss>