<?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[Problem mit globalem Objekt]]></title><description><![CDATA[<p>ch ein Game of life programmiert, anfangs nur für die Konsole, habe es aber letzten Endes doch noch einmal grafisch überarbeitet. Nun bin ich auf folgendes Problem gestoßen:<br />
Ich erstelle mein Game-Objekt global, damit ich sowohl in der Nachrichtenschleife der WinMain als auch in der WndProc darauf zugreifen kann. In der Nachrichtenschleife führe ich die Generation durch, das sieht wie folgt aus (UpdateWindow(), RegelnAnwenden(), WeltenTasuchen()). Im WM_ PAINT case Block führe ich die Display-Methode meines Objektes aus.. Und genau hier liegt das Problem, nichts passiert... Ändere ich die Display-Methode so ab, dass nichts gezeichnet wird, sondern die Zellen über die MessageBox ausgegeben werden (Nur um mich zu versichern das der Fehler nicht in der Game-Klasse liegt) scheint jede Zelle in meiner Spielwelt tot zu sein (Was sie nicht sind!). Führe ich die Display-Methode nun nicht im WM_PAINT case aus, sondern in der Nachrichtenschleife direkt hinter der Generation stimmt die Ausgabe allerdings.<br />
Da das Game-Objekt global deklariert wurde müsste der Inhalt der darin befindlichen Spielwelt eigentlich sowohl in der WinMain als auch in der WndProc übereinstimmen?! Stehe grade echt auf dem Schlauch.. Wo könnt der Fehler liegen?</p>
<pre><code>// Global
Game GameOfLife(SCREEN_WIDTH, SCREEN_HEIGHT);

WinMain
{
    // ...
	while (true)
	{
		if (PeekMessage(&amp;mMessage, NULL, 0, 0, PM_REMOVE))
		{
			// Nachrichten übersetzen
			TranslateMessage(&amp;mMessage);

			// Nachricht zur Fensterprozedur senden
			DispatchMessage(&amp;mMessage);

			if (mMessage.message == WM_QUIT)
				break;
		}
		else
		{
			// ----------------------------------------
			// Game Code hier einfügen
			GameOfLife.Generation();
		}
	}
	// ...
}

WndProc
{
    // ...
    case WM_PAINT:
    {
        Paintstruct ps;
        HDC hDc = BeginPaint(hWnd, &amp;ps);

        GameOfLife.Display(hDc);

        hDc = EndPaint(hWnd, &amp;ps);
    } break;
    // ...
}
</code></pre>
<p>Bitte um Hilfe... MfG Inv151673 <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/336240/problem-mit-globalem-objekt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 17:44:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336240.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jan 2016 14:51:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 14:51:38 GMT]]></title><description><![CDATA[<p>ch ein Game of life programmiert, anfangs nur für die Konsole, habe es aber letzten Endes doch noch einmal grafisch überarbeitet. Nun bin ich auf folgendes Problem gestoßen:<br />
Ich erstelle mein Game-Objekt global, damit ich sowohl in der Nachrichtenschleife der WinMain als auch in der WndProc darauf zugreifen kann. In der Nachrichtenschleife führe ich die Generation durch, das sieht wie folgt aus (UpdateWindow(), RegelnAnwenden(), WeltenTasuchen()). Im WM_ PAINT case Block führe ich die Display-Methode meines Objektes aus.. Und genau hier liegt das Problem, nichts passiert... Ändere ich die Display-Methode so ab, dass nichts gezeichnet wird, sondern die Zellen über die MessageBox ausgegeben werden (Nur um mich zu versichern das der Fehler nicht in der Game-Klasse liegt) scheint jede Zelle in meiner Spielwelt tot zu sein (Was sie nicht sind!). Führe ich die Display-Methode nun nicht im WM_PAINT case aus, sondern in der Nachrichtenschleife direkt hinter der Generation stimmt die Ausgabe allerdings.<br />
Da das Game-Objekt global deklariert wurde müsste der Inhalt der darin befindlichen Spielwelt eigentlich sowohl in der WinMain als auch in der WndProc übereinstimmen?! Stehe grade echt auf dem Schlauch.. Wo könnt der Fehler liegen?</p>
<pre><code>// Global
Game GameOfLife(SCREEN_WIDTH, SCREEN_HEIGHT);

WinMain
{
    // ...
	while (true)
	{
		if (PeekMessage(&amp;mMessage, NULL, 0, 0, PM_REMOVE))
		{
			// Nachrichten übersetzen
			TranslateMessage(&amp;mMessage);

			// Nachricht zur Fensterprozedur senden
			DispatchMessage(&amp;mMessage);

			if (mMessage.message == WM_QUIT)
				break;
		}
		else
		{
			// ----------------------------------------
			// Game Code hier einfügen
			GameOfLife.Generation();
		}
	}
	// ...
}

WndProc
{
    // ...
    case WM_PAINT:
    {
        Paintstruct ps;
        HDC hDc = BeginPaint(hWnd, &amp;ps);

        GameOfLife.Display(hDc);

        hDc = EndPaint(hWnd, &amp;ps);
    } break;
    // ...
}
</code></pre>
<p>Bitte um Hilfe... MfG Inv151673 <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/2482661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482661</guid><dc:creator><![CDATA[WildChild]]></dc:creator><pubDate>Mon, 11 Jan 2016 14:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 15:37:01 GMT]]></title><description><![CDATA[<p>// delete</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2482673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482673</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 11 Jan 2016 15:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 18:28:43 GMT]]></title><description><![CDATA[<p>Poste bitte Code der 1:1 aus deinem Projekt rauskopiert worden ist. In modifiziertem Code Fehler suchen ist einfach uninteressant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2482719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482719</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Jan 2016 18:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 19:40:03 GMT]]></title><description><![CDATA[<p>GameOfLife.cpp</p>
<pre><code>#include &lt;GameOfLife.h&gt;

Game GameOfLife(SCREEN_WIDTH, SCREEN_HEIGHT);

int WINAPI WinMain(
	HINSTANCE	hInstance,
	HINSTANCE	hPrevInstance,
	LPSTR		lpCmdLine,
	int			iCmdShow
	)
{
	HWND		hWnd;
	WNDCLASSEX	WndClass;
	RECT		WindowRect;
	MSG			mMessage;

	ZeroMemory(&amp;WndClass, sizeof(WNDCLASSEX));
	WndClass.cbSize = sizeof(WNDCLASSEX);
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	WndClass.lpfnWndProc = WndProc;
	WndClass.hInstance = hInstance;
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	// WndClass.hbrBackground	= (HBRUSH)COLOR_WINDOW;
	WndClass.lpszClassName = L&quot;MainWindow&quot;;

	RegisterClassEx(&amp;WndClass);

	// Fenstergröße korrigieren
	WindowRect = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
	AdjustWindowRect(
		&amp;WindowRect,
		WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		NULL
		);

	hWnd = CreateWindowEx(
		NULL,
		L&quot;MainWindow&quot;,		// Fensterklasse
		L&quot;Game of life&quot;,	// Fenstertitel
		WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,	// Fenster-Styles
		CW_USEDEFAULT,		// X-Position
		CW_USEDEFAULT,		// Y-Position
		SCREEN_WIDTH,		// Breite
		SCREEN_HEIGHT,		// Höhe
		NULL,
		NULL,				// Menü
		hInstance,			// Instanz
		NULL
		);

	ShowWindow(hWnd, iCmdShow);

	// Spiel initialisieren
	GameOfLife.Initialize(1, hWnd);	// 1 = Conway

	while (true)
	{
		if (PeekMessage(&amp;mMessage, NULL, 0, 0, PM_REMOVE))
		{
			// Nachrichten übersetzen
			TranslateMessage(&amp;mMessage);

			// Nachricht zur Fensterprozedur senden
			DispatchMessage(&amp;mMessage);

			if (mMessage.message == WM_QUIT)
				break;
		}
		else
		{
			// ----------------------------------------
			GameOfLife.Generation();
		}
	}

	return mMessage.wParam;
}

LRESULT CALLBACK WndProc(
	HWND	hWnd,
	UINT	uiMessage,
	WPARAM	wParam,
	LPARAM	lParam
	)
{
	switch (uiMessage)
	{
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hDc = BeginPaint(hWnd, &amp;ps);

		GameOfLife.Display(hDc);

		EndPaint(hWnd, &amp;ps);
	} break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;
	}

	// Alle Nachrichten &quot;bearbeiten&quot;, welche nicht im 
	// switch-Block abgefangen wurden
	return DefWindowProc(hWnd, uiMessage, wParam, lParam);
}
</code></pre>
<p>Die Display-Methode aus Game.cpp</p>
<pre><code>void Game::Display(HDC hDc)
{
	int iWidth = pWorld-&gt;GetWidth(),
		iHeight = pWorld-&gt;GetHeight();
	for (int y = 0; y &lt; iHeight; y++)
	{
		for (int x = 0; x &lt; iWidth; x++)
		{
			if (pWorld-&gt;GetCell(x, y).uiCell)
				SetPixel(hDc, x, y, RGB(0, 0, 255));
			else
				SetPixel(hDc, x, y, RGB(225, 255, 255));
		}
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2482737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482737</guid><dc:creator><![CDATA[Inv151673]]></dc:creator><pubDate>Mon, 11 Jan 2016 19:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 19:50:00 GMT]]></title><description><![CDATA[<p>Wm_paint wird nur wenn nötig aufgerufen, du bräuchtest also einen timer, welcher das fenster ständig invalidiert, wenn du die malarbeiten in wm_paint erledigen möchtest. Anstatt der messageBox empfehle ich dir einen richtigen Debugger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2482742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482742</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Mon, 11 Jan 2016 19:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Mon, 11 Jan 2016 21:41:56 GMT]]></title><description><![CDATA[<p>Soweit ich weiss solltest du die <code>DefWindowProc</code> nicht aufrufen wenn du <code>WM_PAINT</code> selbst behandelst. Statt dessen einfach 0 zurückgeben.<br />
Wird aber an deinem Problem nix ändern.</p>
<p>Wirf mal ein <code>InvalidateRect(hWnd, 0, false);</code> nach dem <code>GameOfLife.Generation();</code> rein.</p>
<p>Und das</p>
<p>roflo schrieb:</p>
<blockquote>
<p>Anstatt der messageBox empfehle ich dir einen richtigen Debugger.</p>
</blockquote>
<p>würde ich dir auf empfehlen. Lern so früh wir möglich mit dem Debugger umzugehen. Der ist nicht nur beim Fehler-Finden nützlich, sondern hilft mMn. auch gut zu verstehen was in einem Programm abgeht - gerade wenn man noch Anfänger ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2482764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482764</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Jan 2016 21:41:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit globalem Objekt on Tue, 12 Jan 2016 07:27:15 GMT]]></title><description><![CDATA[<p>Was erwartest Du? Das Programm läuft ja nicht weiter...</p>
<p>Also was passiert:<br />
Dein Programm läuft durch die Nachrichtenschelifen, holt Input Nachrichten und verteilt diese.<br />
Auf diesem Weg werden dann auch zwischendrin WM_PAINT Nachrichten erzeugt.</p>
<p>Wenn DU jetzt eine Messagebox anzeigst, dann muss Dir klar sein, dass diese eine eigene Nachrichtenschleife hat. Das heißt es werden weiterhin WM_PAINT Nachrichten erzeugt und Input Nachrichten abgerufen und verarbeitet, aber Deine Nachrichtenschleife läuft nicht mehr...</p>
<p>Da Dein Update aber in der Nachrichtenschleife läuft wird entsprechend auch keine nächste Generation erzeugt.</p>
<p>Damit Dein Spiel auch nicht in jedem Nachrichten Zyklus eine Generation erzeugt, würde ich Dir raten auch die Erzeugung der Generation in einen WM_TIMER Handler zu verlagern in die Fensterklasse oder über einen globalen Timer Callback abzuhandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2482793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2482793</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 12 Jan 2016 07:27:15 GMT</pubDate></item></channel></rss>