<?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[ich versteh das nicht [Petzold]]]></title><description><![CDATA[<p>mahlzeit</p>
<p>in dieser funktion MessageBoxPrintf aus dem buch von petzold S 42 - werden die pixelmasse geholt und ausgegeben</p>
<p>das in csScreen und cyScreen dann die maße stehen ist mir schon klar, nur durch die anweisung</p>
<p>_vsntprintf_s( szBuffer, sizeof( szBuffer ) / sizeof( TCHAR ), szFormat, pArgList );</p>
<p>wird aus &quot;Ihr Desktop hat eine Hoehe von %i und eine Breite von %i Pixeln&quot; ein neuer satz mit den maßen, ich versteh aber nicht wie die zahlen an der position von %i kommen</p>
<pre><code class="language-cpp">#include &quot;windows.h&quot;
#include &quot;tchar.h&quot;
#include &quot;stdio.h&quot;

int CDECL MessageBoxPrintf( TCHAR * szCaption, TCHAR * szFormat, ... )
{
	TCHAR szBuffer[1024];
	va_list pArgList;

	va_start( pArgList, szFormat );

	_vsntprintf_s( szBuffer, sizeof( szBuffer ) / sizeof( TCHAR ), szFormat, pArgList );

	va_end( pArgList );

	return MessageBox( NULL, szBuffer, szCaption, 0 );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
	int cxScreen, cyScreen;

	cxScreen = GetSystemMetrics( SM_CXSCREEN );
	cyScreen = GetSystemMetrics( SM_CYSCREEN );

	MessageBoxPrintf( TEXT( &quot;PixelMasse&quot; ), TEXT( &quot;Ihr Desktop hat eine Hoehe von %i und eine Breite von %i Pixeln&quot; ), cxScreen, cyScreen );

	return 0;
}
</code></pre>
<p>kann mir das jemand bitte erklaeren ? ich hab auch mit dem debugger alles durchgeschaut, nur in der main und in cyScreen sowie cxScreen sind die masse enthalten bis die printf anweisung abgearbeitet wird</p>
<p>im buch steht das ich das so unbeachtet lassen soll - also diese funktion, aber ich moechte das verstehen</p>
<p>was mir auch neu ist ist das man &quot;...&quot; als argumente machen kann ? in MessageBoxPrintf werden die masse am ende uebergeben aber in der funktion wird nur ... angenommen - wenn ich dort int x und int y mach geht das auch aber aendert nichts daran das die zahlen korrekt nach %i kommen -</p>
<p>vielen dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/141758/ich-versteh-das-nicht-petzold</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 10:27:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/141758.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Mar 2006 17:56:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ich versteh das nicht [Petzold] on Fri, 24 Mar 2006 17:58:15 GMT]]></title><description><![CDATA[<p>mahlzeit</p>
<p>in dieser funktion MessageBoxPrintf aus dem buch von petzold S 42 - werden die pixelmasse geholt und ausgegeben</p>
<p>das in csScreen und cyScreen dann die maße stehen ist mir schon klar, nur durch die anweisung</p>
<p>_vsntprintf_s( szBuffer, sizeof( szBuffer ) / sizeof( TCHAR ), szFormat, pArgList );</p>
<p>wird aus &quot;Ihr Desktop hat eine Hoehe von %i und eine Breite von %i Pixeln&quot; ein neuer satz mit den maßen, ich versteh aber nicht wie die zahlen an der position von %i kommen</p>
<pre><code class="language-cpp">#include &quot;windows.h&quot;
#include &quot;tchar.h&quot;
#include &quot;stdio.h&quot;

int CDECL MessageBoxPrintf( TCHAR * szCaption, TCHAR * szFormat, ... )
{
	TCHAR szBuffer[1024];
	va_list pArgList;

	va_start( pArgList, szFormat );

	_vsntprintf_s( szBuffer, sizeof( szBuffer ) / sizeof( TCHAR ), szFormat, pArgList );

	va_end( pArgList );

	return MessageBox( NULL, szBuffer, szCaption, 0 );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
	int cxScreen, cyScreen;

	cxScreen = GetSystemMetrics( SM_CXSCREEN );
	cyScreen = GetSystemMetrics( SM_CYSCREEN );

	MessageBoxPrintf( TEXT( &quot;PixelMasse&quot; ), TEXT( &quot;Ihr Desktop hat eine Hoehe von %i und eine Breite von %i Pixeln&quot; ), cxScreen, cyScreen );

	return 0;
}
</code></pre>
<p>kann mir das jemand bitte erklaeren ? ich hab auch mit dem debugger alles durchgeschaut, nur in der main und in cyScreen sowie cxScreen sind die masse enthalten bis die printf anweisung abgearbeitet wird</p>
<p>im buch steht das ich das so unbeachtet lassen soll - also diese funktion, aber ich moechte das verstehen</p>
<p>was mir auch neu ist ist das man &quot;...&quot; als argumente machen kann ? in MessageBoxPrintf werden die masse am ende uebergeben aber in der funktion wird nur ... angenommen - wenn ich dort int x und int y mach geht das auch aber aendert nichts daran das die zahlen korrekt nach %i kommen -</p>
<p>vielen dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023299</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Fri, 24 Mar 2006 17:58:15 GMT</pubDate></item><item><title><![CDATA[Reply to ich versteh das nicht [Petzold] on Fri, 24 Mar 2006 18:37:17 GMT]]></title><description><![CDATA[<p>Das ist eher eine Frage zu Standard C.</p>
<p>Das mit der Ellipse (...) bedeutet, dass die Funktion unbekannt viele Parameter übernimmt.</p>
<p>Im Falle von der print Funktion ist es dann so, dass im ersten Parameter ein String übergeben wird, der dann in der Funktion untersucht wird.<br />
Buchstabe für Buchstabe wird angeschaut, und wenn die Funktion beispielsweise auf ein %d trifft, dann weiß sie, dass sie sich den nächsten Parameter vom 'Stapel' ziehen soll und damit das %d ersetzen soll, wobei es als Ganzahl gedeutet werden soll.</p>
<p>Sieh mal rechts oben in der Ecke da. Da hast du Tutorials zu C und C++.<br />
Die meisten deutschen sind nicht so der Bringer, aber zum Beispiel die beiden<br />
&quot;Thinking in C++&quot; E-Bücher sind sehr empfehlenswert.<br />
Auch als Nachschlagewerk.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023334</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Mar 2006 18:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to ich versteh das nicht [Petzold] on Fri, 24 Mar 2006 19:46:34 GMT]]></title><description><![CDATA[<p>hmm</p>
<p>diese ueberlegung macht die sache schon logischer</p>
<p>_vsntprintf_s untersucht den string nach sonderzeichen - stoesst auf %i {i fuer int} und nimmt dann ne zahl vom stack - und dann die naechste usw - wenn noch ein %i auftauchen wuerd waer ein fehler dann denk ich</p>
<p>was ich aber nicht versteh</p>
<p>TCHAR szBuffer[1024]; &lt;-- das ist im prinzip das ziel des neuen strings<br />
va_list pArgList; &lt;-- was passiert hier - beinhaltet pArgsList automatishc alles was uebergeben wurde ?<br />
und va_list ist ein typedef fuer &quot;char *&quot; also ein zeiger auf ein char array</p>
<p>wo ist der stack - ist pArgsList der stack ? wenn ja wie kommen die werte dort hinein ? entsteht das automatisch bei der ueberhabe der argumente an die funktion ?</p>
<p>so siehts bestimmt aus<br />
_vsntprintf_s( szBuffer, sizeof( szBuffer ) / sizeof( TCHAR ), szFormat, pArgList );<br />
_vsntprintf_s( &quot;&quot;, 1024, &quot;Ihr Desktop hat eine Hoehe von %i und eine Breite von %i Pixeln&quot;, (stack - X - Y) );</p>
<p>so wuerde das alles auch sinn ergeben, aber wie gesagt, wie kommen die werte auf dem stack, und ist va_list die deklaration des stacks ?</p>
<p>edit: im buch steht das bei va_start die adresse des ueber dem szFormat auf dem stack liegt</p>
<p>nur wie kommen die werte da auf den stack darueber ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023371</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Fri, 24 Mar 2006 19:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to ich versteh das nicht [Petzold] on Fri, 24 Mar 2006 19:56:35 GMT]]></title><description><![CDATA[<p>Mr Evil schrieb:</p>
<blockquote>
<p>hmm</p>
<p>diese ueberlegung macht die sache schon logischer</p>
<p>_vsntprintf_s untersucht den string nach sonderzeichen - stoesst auf %i {i fuer int} und nimmt dann ne zahl vom stack - und dann die naechste usw - wenn noch ein %i auftauchen wuerd waer ein fehler dann denk ich</p>
</blockquote>
<p>Ganz so ist es nicht. Jedes %i steht für einen Integer. Das heißt, wenn du 5mal %i schreiben würdest, müsstest du auch 5 Integer angeben. Besipiel an sprintf (vom Prinzip her das gleiche):</p>
<pre><code class="language-cpp">sprintf (AusgabeBuffer, &quot;Zahl1: %i; Zahl2: %i; Zahl3: %i; Zahl4: %i&quot;, zahl1, zahl2, zahl3, zahl4);
</code></pre>
<p>Wenn jetzt zahl1 eins und zahl2 zwei und zahl3 drei und zahl4 vier wäre, dann würde AusgabeBuffer folgendes enthalten:</p>
<pre><code>Zahl1: 1; Zahl2: 2; Zahl3: 3; Zahl4: 4
</code></pre>
<p>Mfg Ominion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023386</guid><dc:creator><![CDATA[Ominion]]></dc:creator><pubDate>Fri, 24 Mar 2006 19:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to ich versteh das nicht [Petzold] on Fri, 24 Mar 2006 19:58:51 GMT]]></title><description><![CDATA[<p>aaaaaaah cih glaub ich habs</p>
<p>beim uebergeben werden die werte uebergeben und auch die zeilen, das sieht im speicher dann uebereinander so aus</p>
<p>zeile_a<br />
zeile_b<br />
zahl_x<br />
zahl_y</p>
<p>dann wird mit va_list ein stack pArgList erstellt<br />
und bei va_start( pArgList, zeile_b ); wird gesagt, &quot;packe alles auf dem stack was nach zeile_b kommt</p>
<p>dann liegt das auf dem stack pArgList</p>
<p>die funktion _vsntprintf_s ueberprueft dann zeile_b nach sonderzeichen und ersetzt diese mit dem inhalt vom stack, welches bekanntlich beim holen {pop} immer entfernt wird, dh erst zahl_x zugeweisen und weg vom stack dann zahl_y geholt und der stack ist leer</p>
<p>{=</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023389</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Fri, 24 Mar 2006 19:58:51 GMT</pubDate></item></channel></rss>