<?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[Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser?]]></title><description><![CDATA[<p>Hallo,<br />
ich kenne mich eigentlich schon etwas länger relativ gut mit der Win32-API aus. Jetzt wollte ich allerdings mal wieder ein kleines Programm schreiben und stoße da auf seltsame Probleme:</p>
<p>Ich meiner DialogProc reagiere ich z.B. auf den Druck eines Buttons, indem ich eine Funktion aufrufe, die den Standarddialog zum Öffnen von Dateien öffnet. Dazu initialisiert diese Funktion eine OPENFILENAME Struktur und ruft anschließend GetOpenFileName auf. Der Funktion übergebe ich außerdem einen Zeiger auf einen TCHAR, der nach dem Aufruf auf den Anfang des Dateinamens zeigen soll. Das scheint allerdings nur zu gehen, wenn das TCHAR Array vorher als static deklariert wurde.</p>
<p>Eine weitere Funktion übernimmt ebenfalls mehrere TCHAR-Arrays, die als KONSTANTER Zeiger auf ein TCHAR übergeben werden. Nachdem die Funktion zur DialogProc zurückkehrt, befinden sich aber plötzlich ganz andere Adressen in den übergebenen Zeigern. Deklariere ich diese als static, ist das Problem gelöst.</p>
<p>Ich weiß nicht, ob ich hier grundsätzliche Schwierigkeiten habe, was C betrifft; aber eigentlich sagt das Schlüsselwort static doch in diesem Fall nur, dass für die Variablen nur einmal Speicher reserviert werden und nicht bei jedem Funktionsaufruf. Aber ich sehe da keinen Zusammenhang, der das Problem erklären würde.</p>
<p>Vielleicht könnt ihr mir ja helfen <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>ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188783/schlüsselwort-quot-static-quot-als-universeller-problemlöser</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 18:29:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188783.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Aug 2007 20:03:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:03:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich kenne mich eigentlich schon etwas länger relativ gut mit der Win32-API aus. Jetzt wollte ich allerdings mal wieder ein kleines Programm schreiben und stoße da auf seltsame Probleme:</p>
<p>Ich meiner DialogProc reagiere ich z.B. auf den Druck eines Buttons, indem ich eine Funktion aufrufe, die den Standarddialog zum Öffnen von Dateien öffnet. Dazu initialisiert diese Funktion eine OPENFILENAME Struktur und ruft anschließend GetOpenFileName auf. Der Funktion übergebe ich außerdem einen Zeiger auf einen TCHAR, der nach dem Aufruf auf den Anfang des Dateinamens zeigen soll. Das scheint allerdings nur zu gehen, wenn das TCHAR Array vorher als static deklariert wurde.</p>
<p>Eine weitere Funktion übernimmt ebenfalls mehrere TCHAR-Arrays, die als KONSTANTER Zeiger auf ein TCHAR übergeben werden. Nachdem die Funktion zur DialogProc zurückkehrt, befinden sich aber plötzlich ganz andere Adressen in den übergebenen Zeigern. Deklariere ich diese als static, ist das Problem gelöst.</p>
<p>Ich weiß nicht, ob ich hier grundsätzliche Schwierigkeiten habe, was C betrifft; aber eigentlich sagt das Schlüsselwort static doch in diesem Fall nur, dass für die Variablen nur einmal Speicher reserviert werden und nicht bei jedem Funktionsaufruf. Aber ich sehe da keinen Zusammenhang, der das Problem erklären würde.</p>
<p>Vielleicht könnt ihr mir ja helfen <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>ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1338388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338388</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:12:22 GMT]]></title><description><![CDATA[<p>static sorgt dafür, dass die Variable einmal angelegt wird und dann bis zum Programmende existiert. Gerade in einer WndProc bzw. DlgProc brauch man das sehr oft. Allerdings sollte man es überlegt einsetzen, da solche Variablen natürlich permanent Speicherplatz belegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1338392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338392</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:16:26 GMT]]></title><description><![CDATA[<p>OK, dann habe ich den Sinn von static wohl verstanden. Wie kann das aber meine Probleme erklären? Ich will/muss die Variablen doch gar nicht über die Funktion hinaus verwenden. Die Buffer können doch ruhig bei jedem Aufruf erneut erstellt werden. Ob das sinnvoll ist, ist die andere Frage. Aber es müsste doch gehen!?</p>
<p>ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1338399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338399</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:19:25 GMT]]></title><description><![CDATA[<p>Zeig mir mal ein Beispielcode(-Ausschnitt) <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/1338404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338404</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:19:25 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:28:42 GMT]]></title><description><![CDATA[<p>Das wäre die eine Funktion:</p>
<pre><code class="language-cpp">int getFileFromDialog(HWND hwnd, TCHAR * file)
{
	OPENFILENAME ofn;
	static TCHAR szFilter[] = TEXT(&quot;Textdateien (*.TXT)\0*.txt\0&quot;) \
							  TEXT (&quot;ASCII-Dateien (*.ASC)\0*.asc\0&quot;) \
							  TEXT (&quot;Alle Dateien (*.*)\0*.*\0\0&quot;);

	ZeroMemory(&amp;ofn, sizeof(OPENFILENAME));
	ofn.lStructSize = sizeof (OPENFILENAME);
	ofn.hwndOwner = hwnd;
	ofn.hInstance = NULL;
	ofn.lpstrFilter = szFilter;
	ofn.lpstrCustomFilter = NULL;
	ofn.nMaxCustFilter = 0;
	ofn.nFilterIndex = 0;
	ofn.lpstrFile = file; 
	ofn.nMaxFile = MAX_PATH;
	ofn.lpstrFileTitle = NULL; 
	ofn.nMaxFileTitle = MAX_PATH;
	ofn.lpstrInitialDir = NULL;
	ofn.lpstrTitle = NULL;
	ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT;
	ofn.nFileOffset = 0;
	ofn.nFileExtension = 0;
	ofn.lpstrDefExt = TEXT (&quot;txt&quot;);
	ofn.lCustData = 0L;
	ofn.lpfnHook = NULL;
	ofn.lpTemplateName = NULL;

	return GetOpenFileName(&amp;ofn);
}
</code></pre>
<p>Und hier der Codeausschnitt, wo der Buffer deklariert und die Funktion aufgerufen wird:</p>
<pre><code class="language-cpp">static TCHAR buffer[MAX_PATH+2];

	switch(id)
	{
	case IDDIR:
		getFileFromDialog(hwnd, buffer);
		SetDlgItemText(hwnd, IDC_EDIT_FILE, buffer);
		break;
</code></pre>
<p>So funktioniert alles prächtig. Wenn ich allerdings das static oben wegnehme, öffnet sich weder der Standarddialog zum öffnen einer Datei, noch enthält &quot;buffer&quot; bzw. das Textfeld &quot;IDC_EDIT_FILE&quot; irgendetwas sinnvolles.</p>
<p>ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1338414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338414</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:41:46 GMT]]></title><description><![CDATA[<p>Hm in diesem Fall ist das eigentlich nicht notwendig, wenn Du 'buffer' mit dem Inhalt nicht nochmal in einem anderen case-Zweig verwenden willst (dann wäre - beim Verzicht auf static - der Inhalt ja futsch). Hast Du denn das beachtet?</p>
<p>MSDN zu OPENFILENAME schrieb:</p>
<blockquote>
<p>The first character of this buffer must be NULL if initialization is not necessary.</p>
</blockquote>
<p>Quelle: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://msdn2.microsoft.com/en-us/library/ms646839.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms646839.aspx</a></p>
<p>Versuchs mal so:</p>
<pre><code class="language-cpp">// ...

    switch(id)
    {
    case IDDIR:
        TCHAR szBuffer[MAX_PATH + 2];
        szBuffer[0] = 0;
        getFileFromDialog(hwndszBuffer);
        SetDlgItemText(hwnd, IDC_EDIT_FILE, szBuffer);
        break;

// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1338419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338419</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Schlüsselwort &amp;quot;static&amp;quot; als universeller Problemlöser? on Fri, 03 Aug 2007 20:46:30 GMT]]></title><description><![CDATA[<p>Danke! Genau das war es <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Und jetzt meine ich mich auch daran zu erinnern, dass static Variablen automatisch mit 0 initialisiert werden. Da lag wohl die (eher zufällige) Verbindung <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>ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1338424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1338424</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Fri, 03 Aug 2007 20:46:30 GMT</pubDate></item></channel></rss>