<?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[Auswertung von Zeicheneingaben in Iterationen (Schleifen)]]></title><description><![CDATA[<p>Hallo COM,</p>
<p>Hab da gerade folgendes Problem.<br />
Mir geht es einfach darum, in einer iterierenden Schleife hin und wieder per Tastendruck (egal welche) ein Zwischenergebnis ausgeben zu lassen. Die Schleife soll aber munter weiterlaufen.<br />
Hier mein Bsp.-Code:</p>
<pre><code class="language-cpp">#include &lt;climits&gt;
#include &lt;cstdint&gt;
#include &lt;cinttypes&gt;
#include &lt;cfloat&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;
#include &lt;cstdio&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;termios.h&gt;

using namespace std;

int my_getch()
{
  static int ch = -1, fd = 0;
  struct termios neu, alt;
  fd = fileno(stdin);
  tcgetattr(fd, &amp;alt);
  neu = alt;
  neu.c_lflag &amp;= ~(ICANON|ECHO);
  tcsetattr(fd, TCSANOW, &amp;neu);
  ch = getchar();
  tcsetattr(fd, TCSANOW, &amp;alt);
  return ch;
}

int my_kbhit(void)
{
  struct termios term, oterm;
  int fd = 0;
  int c = 0;
  tcgetattr(fd, &amp;oterm);
  memcpy(&amp;term, &amp;oterm, sizeof(term));
  term.c_lflag = term.c_lflag &amp; (!ICANON);
  term.c_cc[VMIN] = 0;
  term.c_cc[VTIME] = 1;
  tcsetattr(fd, TCSANOW, &amp;term);
  c = getchar();
  tcsetattr(fd, TCSANOW, &amp;oterm);
  if (c != -1)
  {
    ungetc(c, stdin);
  }
  return ((c != -1) ? 1 : 0);
}

int main(int argc, char *argv[])
{
  uint64_t Var29 = 0, tmp29 = 1;

  for(;tmp29 &gt; 0;tmp29++)
  {
    Var29++;
    if(my_kbhit())
    {
      if(my_getch()=='c')
      {
        printf(&quot;x: %&quot;PRIu64&quot;\n&quot;,Var29);
      }
    }
  }

  getchar();
  return 0;
}
</code></pre>
<p>In dem Fall lasse ich einfach die IF-Bedingung war werden, wenn ich die Taste &quot;c&quot; drücke. Kann meinetwegen auch irgendeine sein.</p>
<p>Das Problem dabei, die Schleife iteriert nun arg langsam. Das sie fleißig weiteriteriert, kann man sehen, wenn man mal in unterschiedlichen Zeitintervalen &quot;c&quot; drückt.</p>
<p>Außerdem kann ich nun drücken, was ich möchte, kann aber nicht das Prog anhalten. Üblicherweise halte ich einfach mit STRG+C an. @Moment muss ich immer mit pidof und kill hantieren.</p>
<p><strong>Weiß einer, wie ich denn richtig abfragen müsste, damit:</strong><br />
<strong>a.)</strong> Die Schleife trotz If-Abfrage, Aufruf von my_kbhit() und my_getch() weiterhin schnell iteriert (ohne IF-Abfrage-[Inhalt] ist die Schleife beendet, wie ich das Programm gestartet habe, also sehr sehr schnell und dass bei einer Inkrementierung bis Maximum von __int64_t)?<br />
<strong>b.)</strong> Ich weiterhin mit STRG+C das Programm beenden kann.</p>
<p>THX im Voraus!</p>
<p>Grüße</p>
<p>Schlitzauge <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293819/auswertung-von-zeicheneingaben-in-iterationen-schleifen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 04:01:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293819.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Oct 2011 13:56:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auswertung von Zeicheneingaben in Iterationen (Schleifen) on Tue, 11 Oct 2011 13:56:14 GMT]]></title><description><![CDATA[<p>Hallo COM,</p>
<p>Hab da gerade folgendes Problem.<br />
Mir geht es einfach darum, in einer iterierenden Schleife hin und wieder per Tastendruck (egal welche) ein Zwischenergebnis ausgeben zu lassen. Die Schleife soll aber munter weiterlaufen.<br />
Hier mein Bsp.-Code:</p>
<pre><code class="language-cpp">#include &lt;climits&gt;
#include &lt;cstdint&gt;
#include &lt;cinttypes&gt;
#include &lt;cfloat&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;
#include &lt;cstdio&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;termios.h&gt;

using namespace std;

int my_getch()
{
  static int ch = -1, fd = 0;
  struct termios neu, alt;
  fd = fileno(stdin);
  tcgetattr(fd, &amp;alt);
  neu = alt;
  neu.c_lflag &amp;= ~(ICANON|ECHO);
  tcsetattr(fd, TCSANOW, &amp;neu);
  ch = getchar();
  tcsetattr(fd, TCSANOW, &amp;alt);
  return ch;
}

int my_kbhit(void)
{
  struct termios term, oterm;
  int fd = 0;
  int c = 0;
  tcgetattr(fd, &amp;oterm);
  memcpy(&amp;term, &amp;oterm, sizeof(term));
  term.c_lflag = term.c_lflag &amp; (!ICANON);
  term.c_cc[VMIN] = 0;
  term.c_cc[VTIME] = 1;
  tcsetattr(fd, TCSANOW, &amp;term);
  c = getchar();
  tcsetattr(fd, TCSANOW, &amp;oterm);
  if (c != -1)
  {
    ungetc(c, stdin);
  }
  return ((c != -1) ? 1 : 0);
}

int main(int argc, char *argv[])
{
  uint64_t Var29 = 0, tmp29 = 1;

  for(;tmp29 &gt; 0;tmp29++)
  {
    Var29++;
    if(my_kbhit())
    {
      if(my_getch()=='c')
      {
        printf(&quot;x: %&quot;PRIu64&quot;\n&quot;,Var29);
      }
    }
  }

  getchar();
  return 0;
}
</code></pre>
<p>In dem Fall lasse ich einfach die IF-Bedingung war werden, wenn ich die Taste &quot;c&quot; drücke. Kann meinetwegen auch irgendeine sein.</p>
<p>Das Problem dabei, die Schleife iteriert nun arg langsam. Das sie fleißig weiteriteriert, kann man sehen, wenn man mal in unterschiedlichen Zeitintervalen &quot;c&quot; drückt.</p>
<p>Außerdem kann ich nun drücken, was ich möchte, kann aber nicht das Prog anhalten. Üblicherweise halte ich einfach mit STRG+C an. @Moment muss ich immer mit pidof und kill hantieren.</p>
<p><strong>Weiß einer, wie ich denn richtig abfragen müsste, damit:</strong><br />
<strong>a.)</strong> Die Schleife trotz If-Abfrage, Aufruf von my_kbhit() und my_getch() weiterhin schnell iteriert (ohne IF-Abfrage-[Inhalt] ist die Schleife beendet, wie ich das Programm gestartet habe, also sehr sehr schnell und dass bei einer Inkrementierung bis Maximum von __int64_t)?<br />
<strong>b.)</strong> Ich weiterhin mit STRG+C das Programm beenden kann.</p>
<p>THX im Voraus!</p>
<p>Grüße</p>
<p>Schlitzauge <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2130023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2130023</guid><dc:creator><![CDATA[Schlitzauge]]></dc:creator><pubDate>Tue, 11 Oct 2011 13:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von Zeicheneingaben in Iterationen (Schleifen) on Tue, 11 Oct 2011 14:11:32 GMT]]></title><description><![CDATA[<p>Benutze statt der Eingabe von Tastatur Signale.</p>
<blockquote>
<p>.. ist die Schleife beendet, wie ich das Programm gestartet habe ..</p>
</blockquote>
<p>Vielleicht hat der Compiler die Schleife wegoptimiert. Bei etwa 2Ghz schafft der Prozessor vielleicht in einer Sekunde bis 2^31 zu zaehlen. Demnach sollte er etwa 2^32 Sekunden benoetigen, um bis 2^64 zu zaehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2130029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2130029</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 11 Oct 2011 14:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von Zeicheneingaben in Iterationen (Schleifen) on Tue, 11 Oct 2011 22:34:36 GMT]]></title><description><![CDATA[<p>Interessanterweise spielt es gar keine so große Rolle, dass du bei jedem Schleifendurchlauf wieder die Terminal-Settings zweimal veränderst; das eigentliche Problem ist getchar(), welches scheinbar eine Weile auf Daten wartet.</p>
<p>Wir bewegen uns hier eh abseits des C++-Standards, also greife ich mal in die POSIX-Kiste: fcntl und read sind dein Freund für non-blocking IO. Ich stelle mir das etwa so vor:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;iostream&gt;
#include &lt;limits&gt;
#include &lt;tr1/cstdint&gt;

#include &lt;termios.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;

int main() {
  // Terminal-Settings so verändern, dass die Eingabe ungepuffert und ohne
  // Echo erfolgt:
  struct termios ts_old, ts_new;

  tcgetattr(STDIN_FILENO, &amp;ts_old);
  ts_new = ts_old;
  ts_new.c_lflag &amp;= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &amp;ts_new);

  // Stdin auf non-blocking setzen
  int stdin_flags = fcntl(STDIN_FILENO, F_GETFL);
  fcntl(STDIN_FILENO, F_SETFL, stdin_flags | O_NONBLOCK);

  for(std::tr1::uint64_t i = 1; i &gt; 0; ++i) {
    char c;

    if(read(STDIN_FILENO, &amp;c, 1) == 1 &amp;&amp; c == 'c') {
      std::cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
  }

  // Hinterher aufräumen. In Produktionscode sollte das natürlich per RAII
  // gemacht werden.
  fcntl(STDIN_FILENO, F_SETFL, stdin_flags);
  tcsetattr(STDIN_FILENO, TCSANOW, &amp;ts_old);

  return 0;
}
</code></pre>
<p>Es wird trotzdem ewig dauern, bis ein uint64_t überläuft. Das kann ich aber auch nicht ändern.</p>
<p>Was Ctrl-C angeht: dass das nicht funktioniert, wird daran liegen, dass du hier:</p>
<pre><code class="language-cpp">term.c_lflag = term.c_lflag &amp; (!ICANON);
</code></pre>
<p>c_lflag völlig ausradierst, weil du den Binärkomplement-Operator mit dem logischen Nicht-Operator verwechselst. Dabei wird auch ISIG auf 0 gesetzt, und dementsprechend generiert Ctrl-C kein SIGINT mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2130222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2130222</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 11 Oct 2011 22:34:36 GMT</pubDate></item></channel></rss>