<?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[Textmeldungen sehr schnell speichern und später auslesen - wie?]]></title><description><![CDATA[<p>Ich stehe gerade aufm Schlauch.</p>
<p>Ich schreibe ein MFC Programm, das auf ein USB Gerät Daten schreibt und dabei Textausgaben macht. Da die Performance extrem in den Keller sinkt, wenn ich die Textausgaben bei jedem Schreibvorgang mache, will ich alle Meldungen sammeln und später ausgeben.</p>
<p>Dazu hab ich mir gedacht, ich mache sowas:</p>
<pre><code class="language-cpp">char** LogText[1000];			// Array, das 1000 Fehlermeldungen hält

(...)

// Hier die Speicherung 

for(;;) // also hier läuft irgend eine Schleife
{
       (...)
	if ((FoundErrors &gt; 0) &amp;&amp; (FoundErrors &lt; sizeof(LogText)))
	{
		char* Text = new char [32];		

		strcpy(Text, &quot;Geschrieben: &quot; + IntToHexCString(SendBuffer[i]) + &quot; Gelesen: &quot; + IntToHexCString(ReceiveBuffer[i]) + &quot;.\r\n&quot;);

		LogText[FoundErrors] = &amp;Text;
	}
	FoundErrors ++;
}

(...)

// Wenn alles vorbei ist, soll eine log-Datei geschrieben werden:

if (FoundErrors &gt; 0)	// Wenn Fehler gefunden wurden
{		
	m_TextUpdate += &quot;\r\nSchreibe Log-Datei...\r\n&quot;;
	DoEvents();

	char* Text = new char [32];
	for (i=0 ; i &lt;= FoundErrors ; i++)
	{
		&amp;Text = LogText[i];		// hier kommt der Compiler-Fehler: error C2106: '=' : Linker Operand muss ein L-Wert sein
		LogFile &lt;&lt; &amp;LogText[i];	
		//delete &amp;LogText[i];
	}
	// Log-File öffnen
	ShellExecute(0, &quot;open&quot;, &quot;log.txt&quot;, NULL, NULL, SW_SHOWNORMAL);
}
</code></pre>
<p>Ich weiß das das, was ich geschrieben hab, so nicht geht. Ich wollte damit nur zeigen was ich machen will.</p>
<p>Fragen dazu:</p>
<p>- Ist die Variante so intelligent? Während des schreibvorgangs muss das Sichern der Error-Texte so schnell wie möglich gehen, daher will ich da mit den zeigern rumhantieren<br />
- Wenn das so intelligent ist, wie muss man es abändern damit es funktioniert? Er schreibt mir nur Müll in die Textdatei!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186047/textmeldungen-sehr-schnell-speichern-und-später-auslesen-wie</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 10:26:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186047.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Jul 2007 12:19:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 12:20:38 GMT]]></title><description><![CDATA[<p>Ich stehe gerade aufm Schlauch.</p>
<p>Ich schreibe ein MFC Programm, das auf ein USB Gerät Daten schreibt und dabei Textausgaben macht. Da die Performance extrem in den Keller sinkt, wenn ich die Textausgaben bei jedem Schreibvorgang mache, will ich alle Meldungen sammeln und später ausgeben.</p>
<p>Dazu hab ich mir gedacht, ich mache sowas:</p>
<pre><code class="language-cpp">char** LogText[1000];			// Array, das 1000 Fehlermeldungen hält

(...)

// Hier die Speicherung 

for(;;) // also hier läuft irgend eine Schleife
{
       (...)
	if ((FoundErrors &gt; 0) &amp;&amp; (FoundErrors &lt; sizeof(LogText)))
	{
		char* Text = new char [32];		

		strcpy(Text, &quot;Geschrieben: &quot; + IntToHexCString(SendBuffer[i]) + &quot; Gelesen: &quot; + IntToHexCString(ReceiveBuffer[i]) + &quot;.\r\n&quot;);

		LogText[FoundErrors] = &amp;Text;
	}
	FoundErrors ++;
}

(...)

// Wenn alles vorbei ist, soll eine log-Datei geschrieben werden:

if (FoundErrors &gt; 0)	// Wenn Fehler gefunden wurden
{		
	m_TextUpdate += &quot;\r\nSchreibe Log-Datei...\r\n&quot;;
	DoEvents();

	char* Text = new char [32];
	for (i=0 ; i &lt;= FoundErrors ; i++)
	{
		&amp;Text = LogText[i];		// hier kommt der Compiler-Fehler: error C2106: '=' : Linker Operand muss ein L-Wert sein
		LogFile &lt;&lt; &amp;LogText[i];	
		//delete &amp;LogText[i];
	}
	// Log-File öffnen
	ShellExecute(0, &quot;open&quot;, &quot;log.txt&quot;, NULL, NULL, SW_SHOWNORMAL);
}
</code></pre>
<p>Ich weiß das das, was ich geschrieben hab, so nicht geht. Ich wollte damit nur zeigen was ich machen will.</p>
<p>Fragen dazu:</p>
<p>- Ist die Variante so intelligent? Während des schreibvorgangs muss das Sichern der Error-Texte so schnell wie möglich gehen, daher will ich da mit den zeigern rumhantieren<br />
- Wenn das so intelligent ist, wie muss man es abändern damit es funktioniert? Er schreibt mir nur Müll in die Textdatei!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318186</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Wed, 04 Jul 2007 12:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 12:49:12 GMT]]></title><description><![CDATA[<p>versuch's mal so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;  // ifstream
#include &lt;sstream&gt;  // i/ostringstream

    using namespace std;
    stringstream logText;   // Stream; Raum bis der Speicher platzt
    for(;;)
    {
        // ...
        // -- Schreibe in's Logbuch
        logText &lt;&lt; &quot;Geschrieben: &quot; &lt;&lt; SendBuffer[i] &lt;&lt; &quot; Gelesen: &quot; &lt;&lt; ReceiveBuffer[i] &lt;&lt; endl;
    }

    // später
    if (FoundErrors &gt; 0)    // Wenn Fehler gefunden wurden
    {
        ofstream file( &quot;log.txt&quot; ); // Log-File öffnen
        file &lt;&lt; logText.rdbuf(); // alles rein
    }
    return 0;
</code></pre>
<p>wenn das immer noch nicht schnell genug ist (warum habt Ihr es immer so eilig), dann speichere die beiden Integerwerte SendBuffer[i] und ReceiveBuffer[i] in einer struct Info und packe die in einen STL-Container (z.B. vector). Am Ende kannst Du das dann in Ruhe ausgeben.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318217</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Jul 2007 12:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 13:40:43 GMT]]></title><description><![CDATA[<p>Sehr gut, das funktioiert!!</p>
<p>Allerdings gibts ein Problem:</p>
<pre><code class="language-cpp">LogText &lt;&lt; &quot;Geschrieben: &quot; &lt;&lt; IntToHexCString(SendBuffer[i]) &lt;&lt; &quot; Gelesen: &quot; &lt;&lt; IntToHexCString(ReceiveBuffer[i]) &lt;&lt; endl;
</code></pre>
<p>Das erzeugt mir die falschen Werte für die Receive- und Sendebuffer. Da drin steht ein Byte, das ich gern hexdezimal ausgeben will. Das mach ich mit der Funktion InttoHexCString gemacht, die so aussieht:</p>
<pre><code class="language-cpp">CString MyWriter::IntToHexCString(int Zahl)
{ 
	CString mystring;
	mystring.Format(&quot;%X&quot;, Zahl);
	if (Zahl &lt; 15)
		return &quot;0&quot; + mystring;
	else
		return mystring;
}
</code></pre>
<p>Dann spuckte er mir sowas aus: &quot;Geschrieben: 00 Gelesen: FA&quot;. so will ichs haben.</p>
<p>Jetzt, mit deiner Version, macht er sowas: &quot;Geschrieben: 00336DDC Gelesen: 0033711C&quot;. Das will ich nicht <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>
<p>Warum das denn? Ist mir unklar. Wie mache ich das so, das er mit nur das Byte als Hex-Wert anzeigt, also so wies vorher war?</p>
<p>Edit: Bei großen datenmengen stürzt dasProgramm ab - &quot;der vrogang read() konnte nicht auf dem Speicher ausgeführt werden&quot;...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318246</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Wed, 04 Jul 2007 13:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 14:02:05 GMT]]></title><description><![CDATA[<p>Querdenker schrieb:</p>
<blockquote>
<p>Jetzt, mit deiner Version, macht er sowas: &quot;Geschrieben: 00336DDC Gelesen: 0033711C&quot;. Das will ich nicht <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>
</blockquote>
<p>Nee - nicht mit meiner Version. Du schreibst</p>
<p>Querdenker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">LogText &lt;&lt; &quot;Geschrieben: &quot; &lt;&lt; IntToHexCString(SendBuffer[i]) &lt;&lt; &quot; Gelesen: &quot; &lt;&lt; IntToHexCString(ReceiveBuffer[i]) &lt;&lt; endl;
</code></pre>
</blockquote>
<p>IntToHexCString kam in meiner Version nicht vor.</p>
<p>Dort wird versucht einen CString auf einem ostream auszugeben. Der Compiler frisst das, weil MS eine implizite Konvertierung von CString nach TCHAR* vorgesehen hat. Und der ostream kann jeden Pointer ausgeben. Vor impliziten Konvertierungen sollte man sich hüten.</p>
<p>Das Formatieren von Bytes in Hex schön mit 0'en aufgefüllt ist ein wenig lästig. Der C++-Weg wäre in etwa dieser:</p>
<pre><code class="language-cpp">// erfordert zusätzlich #include &lt;iomanip&gt;
struct WriteByte
{
    explicit WriteByte( char c )  // oder BYTE c
        : m_c( c ) {}
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, WriteByte b )
    {
        // Byte formatiert in hex ausgeben
        const char fillOld = out.fill('0');
        const std::ios_base::fmtflags flagsOld = out.flags();
        out &lt;&lt; std::hex &lt;&lt; std::setw(2) &lt;&lt; std::uppercase &lt;&lt; unsigned( b.m_c );
        out.flags( flagsOld );
        out.fill( fillOld );
        return out;
    }
private:
    unsigned char m_c;
};
</code></pre>
<p>und beim Aufruf dann</p>
<pre><code class="language-cpp">LogText &lt;&lt; &quot;Geschrieben: &quot; &lt;&lt; WriteByte(SendBuffer[i]) &lt;&lt; &quot; Gelesen: &quot; &lt;&lt; WriteByte(ReceiveBuffer[i]) &lt;&lt; endl;
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318284</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Jul 2007 14:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 14:19:10 GMT]]></title><description><![CDATA[<p>Klappt so nicht:</p>
<p>error C2440: 'type cast' : 'unsigned char' kann nicht in 'struct MyWriter::WriteByte' konvertiert werden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318293</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Wed, 04 Jul 2007 14:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 14:27:56 GMT]]></title><description><![CDATA[<p>dann mach doch einfach aus dem</p>
<pre><code class="language-cpp">explicit WriteByte( char c )  // oder Byte c
</code></pre>
<p>ein</p>
<pre><code class="language-cpp">explicit WriteByte( unsigned char c )  // oder WriteByte( BYTE c )
</code></pre>
<p>(siehe Kommentar hinter der Zeile)</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318304</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Jul 2007 14:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 14:29:01 GMT]]></title><description><![CDATA[<p>Querdenker schrieb:</p>
<blockquote>
<p>error C2440: 'type cast' : 'unsigned char' kann nicht in 'struct MyWriter::WriteByte' konvertiert werden</p>
</blockquote>
<p>.. das sollte trotzdem gehen. In welcher Code-Zeile erscheint der Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318306</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Jul 2007 14:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 14:39:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">LogText &lt;&lt; FoundErrors &lt;&lt; &quot;: Geschrieben: &quot; &lt;&lt; WriteByte(SendBuffer[i]) &lt;&lt; &quot; Gelesen: &quot; &lt;&lt; WriteByte(ReceiveBuffer[i]) &lt;&lt; endl;
</code></pre>
<p>Für beide Aufrufe jeweils:</p>
<p>error C2440: 'type cast' : 'unsigned char' kann nicht in 'struct MyWriter::WriteByte' konvertiert werden<br />
Quelle oder Ziel hat einen unvollstaendigen Typ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318316</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Wed, 04 Jul 2007 14:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 16:22:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Quelle oder Ziel hat einen unvollstaendigen Typ</p>
</blockquote>
<p>kann es sein, dass du da irgendwo ne vorwärtsdeklaration gemacht hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318382</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 04 Jul 2007 16:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Wed, 04 Jul 2007 20:25:35 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>kann es sein, dass du da irgendwo ne vorwärtsdeklaration gemacht hast?</p>
</blockquote>
<p>wahrscheinlich ...</p>
<p>Schreibe die struct WriteByte, so wie ich sie gepostet habe, vor die Methode oder Funktion, wo sie benutzt wird; in das cpp-File hinein.<br />
Das sollte funktionieren.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318539</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Jul 2007 20:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Mon, 09 Jul 2007 08:11:19 GMT]]></title><description><![CDATA[<p>Sorry das ich mich so lange nich gemeldet habe <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>
<p>Ich hab alle eure Tipps befolgt, es hilft nur nichts:</p>
<pre><code>C:\USBIO\USBTest\MyWriter.cpp(650) : error C2440: 'type cast' : 'unsigned char' kann nicht in 'struct MyWriter::WriteByte' konvertiert werden
        Quelle oder Ziel hat einen unvollstaendigen Typ
</code></pre>
<p>Und das für beide Aufrufe der struct, die struct steht vor ihrem Aufruf in der cpp Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321211</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Mon, 09 Jul 2007 08:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Mon, 09 Jul 2007 09:20:28 GMT]]></title><description><![CDATA[<p>Dann solltest du den Ctor von WriteByte so anpassen, daß er einen unsigned char entgegennehmen kann (anstelle des platten 'char').</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321261</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 09:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Textmeldungen sehr schnell speichern und später auslesen - wie? on Mon, 09 Jul 2007 18:58:34 GMT]]></title><description><![CDATA[<p>Querdenker schrieb:</p>
<blockquote>
<p>Ich hab alle eure Tipps befolgt, es hilft nur nichts:</p>
<pre><code>C:\USBIO\USBTest\MyWriter.cpp(650) : error C2440: 'type cast' : 'unsigned char' kann nicht in 'struct MyWriter::WriteByte' konvertiert werden
        Quelle oder Ziel hat einen unvollstaendigen Typ
</code></pre>
<p>Und das für beide Aufrufe der struct, die struct steht vor ihrem Aufruf in der cpp Datei.</p>
</blockquote>
<p>Nein - nach der Fehlermeldung hast Du sie zur nested struct Deiner Klasse MyWriter gemacht und sie ist nicht vollständig definiert. Poste doch mal das Codesegment von struct WriteByte bis zum Ende der Methode wo Du die struct anwendest.<br />
Vielleicht hast Du auch bloß den Konstruktor vergessen, oder so was.</p>
<p>Ist die Klasse MyWriter in einem H-File definiert oder im cpp-File?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321787</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 09 Jul 2007 18:58:34 GMT</pubDate></item></channel></rss>