<?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[static keyword]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion, die static verwendet und etwas anders abläuft, als ich das erwartet habe.</p>
<pre><code class="language-cpp">void func()
{
while(...)
{
    do {
        i = read(ifstream);
    while(8x);
}

unsigned char read(std::ifstream&amp; in)
{
     static unsigned char c = in.get();
}
</code></pre>
<p>Die Variable c wird nur alle 8 Male quasi initialisiert, dh. nur alle 8 mal wird ein Zeichen aus der Datei gelesen. Sonst bleibt es bei jedem Funktionsaufruf gleich.</p>
<p>Erst nachdem die while-schleife die nächste Runde startet, bekommt auch c einen neuen Wert.</p>
<p>Hat static einen Scope innerhalb der while Schleife oder wie? <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="😕"
    /></p>
<p>Ich dachte eine static Variable bleibt während des kompletten Programmablaufs statisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300112/static-keyword</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 22:51:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300112.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Feb 2012 16:48:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 16:48:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion, die static verwendet und etwas anders abläuft, als ich das erwartet habe.</p>
<pre><code class="language-cpp">void func()
{
while(...)
{
    do {
        i = read(ifstream);
    while(8x);
}

unsigned char read(std::ifstream&amp; in)
{
     static unsigned char c = in.get();
}
</code></pre>
<p>Die Variable c wird nur alle 8 Male quasi initialisiert, dh. nur alle 8 mal wird ein Zeichen aus der Datei gelesen. Sonst bleibt es bei jedem Funktionsaufruf gleich.</p>
<p>Erst nachdem die while-schleife die nächste Runde startet, bekommt auch c einen neuen Wert.</p>
<p>Hat static einen Scope innerhalb der while Schleife oder wie? <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="😕"
    /></p>
<p>Ich dachte eine static Variable bleibt während des kompletten Programmablaufs statisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185654</guid><dc:creator><![CDATA[JojoPo]]></dc:creator><pubDate>Sat, 25 Feb 2012 16:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 16:54:07 GMT]]></title><description><![CDATA[<p>Poste mal kompilierenden Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185657</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 25 Feb 2012 16:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 16:57:37 GMT]]></title><description><![CDATA[<p>Wenn du dich über das merkwürdige Verhalten eines Programms wunderst, wie wäre es damit, das Programm zu zeigen?</p>
<p>Guckst du hier, was passiert, wenn man deinen Code zu etwas ausführbarem ergänzt:<br />
<a href="http://ideone.com/W7hFX" rel="nofollow">http://ideone.com/W7hFX</a><br />
Es verhält sich also, wie du es erwartest und wie es auch richtig ist, aber nicht so, wie du beschreibst, was du beobachtest. Folglich ist das Programm, welches du benutzt falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185660</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 25 Feb 2012 16:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 16:59:50 GMT]]></title><description><![CDATA[<p>JojoPo schrieb:</p>
<blockquote>
<p>Die Variable c wird nur alle 8 Male quasi initialisiert</p>
</blockquote>
<p>Die Variable <code>c</code> wird 1x initialisiert, und zwar beim ersten Aufruf der Funktion.</p>
<p>JojoPo schrieb:</p>
<blockquote>
<p>dh. nur alle 8 mal wird ein Zeichen aus der Datei gelesen. Sonst bleibt es bei jedem Funktionsaufruf gleich.</p>
</blockquote>
<p>Nein, es wird genau 1x etwas aus der Datei gelesen.</p>
<p>JojoPo schrieb:</p>
<blockquote>
<p>Hat static einen Scope innerhalb der while Schleife oder wie?</p>
</blockquote>
<p>Eine static-Variable verliert beim Verlassen des Scopes ihre Gültigkeit. Allerdings wird der für die Variable reservierte Speicherbereich nicht freigegeben, sondern bleibt geschützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185662</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 25 Feb 2012 16:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 17:10:09 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn du dich über das merkwürdige Verhalten eines Programms wunderst, wie wäre es damit, das Programm zu zeigen?</p>
</blockquote>
<p>Das ganze Probgramm zu zeigen, dürfte etwas schwer werden, weil das nicht 10 Zeilen sind, sondern mehrere Dateien, die miteinander in Beziehung stehen.</p>
<p>Hier der komplett ausführbare code.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

char read(std::istream&amp; in)
{
    static int pos = 0;
  static char c = in.get();

    ++pos;
    pos %= 8;
    if(pos == 0) {
        if( !in.eof()) {
            c = in.get();
        }
    }
  return c;   
}

void func()
{
  for(int i = 0; i &lt; 5; ++i)
    {
      for (int j = 0; j &lt; 8; ++j)
        {
          char c = read(std::cin);
          std::cout &lt;&lt; c;
        }
    }
}

int main()
{
  func();
  return 0;
}
</code></pre>
<p>Und das Resultat:</p>
<blockquote>
<p>abcdefghijklmnopqrstuvwxyz<br />
aaaaaaabbbbbbbbccccccccddddddddeeeeeeeef</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2185671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185671</guid><dc:creator><![CDATA[JojoPo]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 17:12:10 GMT]]></title><description><![CDATA[<p>Ja wie, jetzt sag bloß da erwartest du jetzt, dass c nicht geändert wird? Nur weil c nur ein mal initialisiert wird, heißt das nicht dass die Funktion auch nur ein mal ausgeführt wird..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185676</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 17:18:36 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Eine static-Variable verliert beim Verlassen des Scopes ihre Gültigkeit.</p>
</blockquote>
<p>Ich bin mir nicht sicher, ob du das richtig meinst. Der Name ist nach Verlassen des Scopes kein gültiger Bezeichner mehr, das ist richtig. Aber Zeiger und Referenzen auf die Variable bleiben gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185687</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 17:22:03 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Ja wie, jetzt sag bloß da erwartest du jetzt, dass c nicht geändert wird?</p>
</blockquote>
<p>Das erwarte ich natürlich nicht. ich hatte wegen einer variable einen denkfehler, weil ich darauf fixiert war das eine static var zwar ihren wert beibehält, aber eben nur einmal durch in.get() initialisiert wird. Thema hat sich erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185691</guid><dc:creator><![CDATA[JojoPo]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Sat, 25 Feb 2012 17:34:27 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Eine static-Variable verliert beim Verlassen des Scopes ihre Gültigkeit.</p>
</blockquote>
<p>Ich bin mir nicht sicher, ob du das richtig meinst. Der Name ist nach Verlassen des Scopes kein gültiger Bezeichner mehr, das ist richtig. Aber Zeiger und Referenzen auf die Variable bleiben gültig.</p>
</blockquote>
<p>Hmm ja, schlecht formuliert. Ich meinte, der Bezeichner für die Variable verliert beim Verlassen des Scopes seine Gültigkeit, die Variable aber wird nicht zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185708</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to static keyword on Mon, 27 Feb 2012 18:55:56 GMT]]></title><description><![CDATA[<p>Ich kann aus eigener Erfahrung nur sagen, statische Variablen können sehr <strong>heimtückisch</strong> sein. Ich habe einmal stundenlang ein großes Programm auf einen vermeintlichen Fehler abgesucht, weil eine Klasse eine Funktion aus einer anderen Klasse nutzte, die eine statische Variable hatte. Da eine statische Variable unabhängig von einer konkreten Instanz existiert, also zur Klasse gehört und nicht zum Objekt, können sich mitunter eigenartige Szenarien ergeben.</p>
<p>Das Programm lief fehlerfrei. Erst als man eine API-Funktion mehrmals nutzte ergaben sich merkwürdige Fehler in den geschriebenen Dateien.</p>
<p>Nach meiner Debugsuche fand ich endlich die Klasse mit der Funktion, die die statische Variable nutzte und korrigierte ihr Verhalten. Das hat mich damals ziemliche Nerven gekostet.</p>
<p>Mit statischen Variablen sollte man also sorgsam umgehen. <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/2186350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186350</guid><dc:creator><![CDATA[Überkinger]]></dc:creator><pubDate>Mon, 27 Feb 2012 18:55:56 GMT</pubDate></item></channel></rss>