<?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[Definition globaler Variable in if Bedingung]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich sitze hier grade als ziemlicher Anfänger vor einem Problem, welches ich gerne &quot;schön&quot; lösen würde. Schön bedeutet für mich möglichst geringer Ressourcenverbrauch.</p>
<p>Ich arbeite an einem Projekt, in welchem ich die Proteinfaltung (vereinfacht) für ein oder 2 Moleküle simuliere. Nun habe ich bereits ein funktionstüchtiges Programm für ein Protein und möchte dieses gerne um die Möglichkeit der Darstellung zweier Protein Ketten erweitern.<br />
Dabei sollen sämtliche für die zweite Kette benötigten Variablen nur initialisiert werden, wenn der Benutzer ausgewählt hat 2 Ketten zu berechnen. Bislang habe ich sie also einfach in einer if Bedingung Definiert:<br />
Beispiel:</p>
<pre><code class="language-cpp">if (i_no_chains==2){register vector &lt;double&gt; v_x2_position = f_start_x2_position (D,v_gamma2,d_d);}
</code></pre>
<p>Aus offensichtlichen Gründen klappt dies nicht, da der Compiler die Varriable bei Verlassen der if-Bedingung wieder vergisst.<br />
<strong>Frage:</strong><br />
Lässt sich die Existenz der Variablen direkt in den if Bedingungen so erstellen, dass sie bestehen bleiben, oder hilft es nichts und ich muss die Variablen außerhalb der if-Bedingung definieren? Der Übersichtlichkeit halber wäre mir die erste Lösung lieber.<br />
PS: Ist register überhaupt noch sinnvoll heutzutage?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219703/definition-globaler-variable-in-if-bedingung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 19:04:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219703.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Aug 2008 14:46:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Wed, 06 Aug 2008 14:46:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich sitze hier grade als ziemlicher Anfänger vor einem Problem, welches ich gerne &quot;schön&quot; lösen würde. Schön bedeutet für mich möglichst geringer Ressourcenverbrauch.</p>
<p>Ich arbeite an einem Projekt, in welchem ich die Proteinfaltung (vereinfacht) für ein oder 2 Moleküle simuliere. Nun habe ich bereits ein funktionstüchtiges Programm für ein Protein und möchte dieses gerne um die Möglichkeit der Darstellung zweier Protein Ketten erweitern.<br />
Dabei sollen sämtliche für die zweite Kette benötigten Variablen nur initialisiert werden, wenn der Benutzer ausgewählt hat 2 Ketten zu berechnen. Bislang habe ich sie also einfach in einer if Bedingung Definiert:<br />
Beispiel:</p>
<pre><code class="language-cpp">if (i_no_chains==2){register vector &lt;double&gt; v_x2_position = f_start_x2_position (D,v_gamma2,d_d);}
</code></pre>
<p>Aus offensichtlichen Gründen klappt dies nicht, da der Compiler die Varriable bei Verlassen der if-Bedingung wieder vergisst.<br />
<strong>Frage:</strong><br />
Lässt sich die Existenz der Variablen direkt in den if Bedingungen so erstellen, dass sie bestehen bleiben, oder hilft es nichts und ich muss die Variablen außerhalb der if-Bedingung definieren? Der Übersichtlichkeit halber wäre mir die erste Lösung lieber.<br />
PS: Ist register überhaupt noch sinnvoll heutzutage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560290</guid><dc:creator><![CDATA[Tembudrus]]></dc:creator><pubDate>Wed, 06 Aug 2008 14:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Wed, 06 Aug 2008 15:01:06 GMT]]></title><description><![CDATA[<p>Du könntest sie auf den Heap parken oder die Variable vorher schon auf dem Stack packen. Statt</p>
<pre><code class="language-cpp">if (i_no_chains==2)
{
  register vector &lt;double&gt; v_x2_position = f_start_x2_position (D,v_gamma2,d_d);
}
</code></pre>
<p>auf den Stack per</p>
<pre><code class="language-cpp">vector &lt;double&gt; v_x2_position;
if (i_no_chains==2)
{
  v_x2_position = f_start_x2_position (D,v_gamma2,d_d);
}
</code></pre>
<p>oder auf dem Heap per</p>
<pre><code class="language-cpp">vector &lt;double&gt; *v_x2_position = 0L;
if (i_no_chains==2)
{
  v_x2_position = new f_start_x2_position (D,v_gamma2,d_d);
}
// Tuwas
delete v_x2_position;
</code></pre>
<p>Oder habe ich dich falsch verstanden?</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560302</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Wed, 06 Aug 2008 15:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Wed, 06 Aug 2008 15:11:57 GMT]]></title><description><![CDATA[<p>Hm das mit dem Heap sieht gut aus. 0L bedeutet Länge 0?</p>
<p>Die Stack-Lösung ist mir auch bewusst, nur finde ich das irgendwie unübersichtlich. Hier definiert, dann aber nur eventuell wirklich benutzt ich denke ich werde mal ein wenig in dem Bereich Heap in den Tutorien lesen.</p>
<p>Meine Lieblingslösung wäre eben sowas wie</p>
<pre><code class="language-cpp">if (i_no_chains==2)
{
  XYZ register vector &lt;double&gt; v_x2_position = f_start_x2_position (D,v_gamma2,d_d);
}
</code></pre>
<p>wobei XYZ irgend eine Anweisung sei die dem Compiler sagen soll, dass er diese Variable nicht vergessen mag.</p>
<p>Vielen Dank schonmal.</p>
<p>Sollte noch jemand Ideen haben, so haltet euch nicht zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560310</guid><dc:creator><![CDATA[Tembudrus]]></dc:creator><pubDate>Wed, 06 Aug 2008 15:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Wed, 06 Aug 2008 15:46:22 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher, aber will die Frage einfach mal weitergeben, ob es denn sinnvoll ist, einen std:vector in ein Register packen zu wollen...</p>
<p>Auch hab ich gerad mal fix in der MSDN geguckt - aber habs nur überflogen...</p>
<p>MSDN schrieb:</p>
<blockquote>
<p>The compiler does not accept user requests for register variables.</p>
</blockquote>
<p>Wenn du die Heap-Lsg nicht magst, dann mach halt so was:</p>
<pre><code class="language-cpp">std::vector &lt;double&gt; GetVector (/*parameter*/)
{ //wenn du willst, kannste da auch noch nen Template draus machen, aber ist auch egal...
if (ich_solls_so_machen)
  return std::vector &lt;double&gt; (/*parameter*/);
else if (ich_machs_einfach_so)
  return std::vector &lt;double&gt; (/*andere parameter*/);
else
  return std::vector &lt;double&gt; (0);
}

int main ()
{
std::vector &lt;double&gt; position (GetVector (/*parameter*/));
}
</code></pre>
<p>der Nachteil daran ist, dass es kopiert werden muss,<br />
(1x richtig erstellt, 2x kopiert)<br />
aber das sollte<br />
1. nicht so ins Gewicht fallen<br />
2. eh nicht dein Flaschenhals sein<br />
3. eh egal sein<br />
und 4. wird es so und so rausoptimiert werden</p>
<p>bb</p>
<p>PS:<br />
kannst es auch so machen:<br />
(1x def-ctor erstellt, 1x richtig erstellt, 1x kopiert)</p>
<pre><code class="language-cpp">void GetVector (std::vector &lt;double&gt; &amp;vector, /*andere parameter*/)
{ //kannst auch wieder nen template draus machen, wenn du willst...
vector = std::vector &lt;double&gt; (/*bla*/);
}

int main ()
{
std::vector &lt;double&gt; vec;
GetVec (vec, /*rest*/);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1560329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560329</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 06 Aug 2008 15:46:22 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Wed, 06 Aug 2008 21:06:26 GMT]]></title><description><![CDATA[<p>Das Schlüsselwort <code>register</code> ist sowieso nur eine Empfehlung an den Compiler, es kann also sehr gut sein, dass nichts in Registern abgelegt wird (vor allem kein ganzer Vector in einem ;)). Man sollte es nur bei sehr häufig gebrauchten Variablen verwenden, wenn man sehr zeitkritisch arbeitet. Und dann sorgfältig mit Profiler und Zeitmessungen überprüfen, ob es sich überhaupt lohnt.</p>
<p>Eine Möglichkeit zu deinem Problem ist <code>static</code> . Wenn du etwas statisch definierst, ist es bis zum Programmende gültig - aber nur in dem Gültigkeitsbereich, wo es deklariert wurde. Um es ausserhalb bekannt zu machen, könntest du einen Zeiger verwenden. In deinem Fall würde ich aber eher davon abraten, da der Vektor ja auch ausserhalb benötigt wird.</p>
<p>Aber ich würde mir auch überlegen, den Vector ausserhalb des If-Blockes zu deklarieren, dass er auch nachher noch existiert. Dann wird er auch ordentlich zerstört, wenn er den aktuellen Block verlässt, und nicht erst am Ende des Programms.</p>
<p>Tembudrus schrieb:</p>
<blockquote>
<p>Die Stack-Lösung ist mir auch bewusst, nur finde ich das irgendwie unübersichtlich.</p>
</blockquote>
<p>Das würde ich nicht sagen. Heap bedeutet immer mehr Verantwortung und mehr Fehlerquellen. Spätestens wenn du immer Probleme mit Zeigern/Heap Corruptions/Memory Leaks hast, wirst du es auch nicht mehr übersichtlicher finden.</p>
<p>Du solltest, sofern möglich, Stackvariablen benutzen. Der Vorteil ist, dass dir die Arbeit der Speicherverwaltung abgenommen wird. Das Allokieren auf dem Heap braucht auch mehr Zeit, und bei Stackvariablen entfällt auch die Zeigerdereferenzierungssyntax (zum Thema Übersichtlichkeit).</p>
<p>Tembudrus schrieb:</p>
<blockquote>
<p>0L bedeutet Länge 0?</p>
</blockquote>
<p>Das Literal <code>0L</code> oder <code>0l</code> ist ein <code>long int</code> mit dem Wert 0. Das angehängte &quot;l&quot; deutet auf den <code>long</code> -Typen hin (wie z.B. &quot;f&quot; bei <code>float</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560489</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 06 Aug 2008 21:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Thu, 07 Aug 2008 06:59:54 GMT]]></title><description><![CDATA[<p>0L oder auch NULL benutzte ich da oben, um den Pointer zu initialisieren. Damit will ich zeigen, daß der Pointer noch nicht benutzt wird -&gt; ergo 0L.</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560569</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Thu, 07 Aug 2008 06:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Definition globaler Variable in if Bedingung on Thu, 07 Aug 2008 11:33:00 GMT]]></title><description><![CDATA[<p>0L für nen Pointer is unfug, 0 reicht vollkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560787</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Aug 2008 11:33:00 GMT</pubDate></item></channel></rss>