{"id":116,"date":"2007-09-12T20:55:39","date_gmt":"2007-09-12T18:55:39","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/09\/12\/die-cx2y-falle\/"},"modified":"2007-09-12T20:57:23","modified_gmt":"2007-09-12T18:57:23","slug":"die-cx2y-falle","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/09\/12\/die-cx2y-falle\/","title":{"rendered":"Die Cx2y Falle&#8230;"},"content":{"rendered":"<p>In einem Programm habe ich diese unscheinbare Schleife f\u00fcr eine spezielle Analyse im Debug-Mode eingebaut.<\/p>\n<p class=\"ccode\">for (POSITION pos= m_aBind.GetHeadPosition(); pos; )<br \/>\n{\u00a0<br \/>\n\u00a0S_BIND&amp; b= m_aBind.GetNext(pos);<br \/>\n\u00a0TRACE(__FUNCTION__ &#8220;\u00a0 %-32s %2d\\n&#8220;,<br \/>\n\u00a0 CT2A(b.sName.GetString()),<br \/>\n\u00a0 b.GetStatus());<br \/>\n}<\/p>\n<p>Sieht auf den ersten Blick OK aus.<br \/>\nAuf den zweiten Blick wundert einen evtl. die Nutzung von <em>CT2A<\/em>. Warum nehme ich nicht einfach den Zeiger von GetString wie er ist? Es ist ja ein <em>PCTSTR<\/em>! Begr\u00fcndung:<\/p>\n<ol>\n<li>Das Projekt ist ein Unicode Projekt.<em>\u00a0<\/em><\/li>\n<li><em>CT2A<\/em> verwende ich hier, weil die <em>TRACE<\/em> Funktion in dieser Schreibweise nur MBCS Strings verwendet. D.h. <em>%s<\/em> erwartet einen Zeiger auf einen MBCS String.<\/li>\n<li>Die <em>_T <\/em>Schreibweise f\u00fcr die Ausgabemaske ist hier nicht geeignet, weil ich gerne den Funktionsnamen auch mit ausgegeben h\u00e4tte. Und <em>__FUNCTION__<\/em> ist nun mal eine normale String-Konstante, und kein <em>wchar_t<\/em>-String.<\/li>\n<li><em>T2A<\/em> verwende ich nicht, weil dies in einer Schleife t\u00f6dlich ist, weil der Stack immer weiter anw\u00e4chst.<\/li>\n<\/ol>\n<p>OK! Soweit dazu, warum der Code aussieht wie er aussieht.<\/p>\n<p>\u2757 Nur&#8230;\u00a0es kommt nur Schrott dabei heraus!<br \/>\nDie\u00a0Ausgabe zeigt brav, den Text, den ich haben m\u00f6chte, nur die Zahlenwerte stimmen in keiner Weise mit den R\u00fcckgabewerten von <em>GetStatus <\/em>\u00fcberein!\u00a0Warum? \u2753<\/p>\n<p>Was ist passiert? Der Debugger gibt schnell Auskunft:<br \/>\n<em>CT2W<\/em> erzeugt ein Objekt vom Typ <em>CW2AEX<\/em>!!! Dieses Objekt ist aber gr\u00f6\u00dfer als ein <em>PCSTR<\/em> Zeiger. Dieses Objekt umfasst bei meinen Projekteinstellungen 4 Bytes f\u00fcr einen Zeiger plus einen <em>char<\/em>-Array der Gr\u00f6\u00dfe 128. <em>TRACE<\/em> h\u00e4tte aber gerne einen 4-Byte Zeiger auf dem Stack und danach f\u00fcr die Ausgabe einen Integer.<br \/>\nAusgegeben, werden also die 4 ersten Bytes des Puffers von <em>CW2AEX <\/em>und nicht die gew\u00fcnschten numerischen Werte f\u00fcr <em>GetStatus<\/em>!<\/p>\n<p>Das ist \u00fcbrigens die selbe Falle in die man tritt, wenn man <em>CString<\/em> direkt ohne <em>CString::GetString<\/em> in <em>printf\/TRACE<\/em> und Konsorten verwendet. Nur hat man hier das Gl\u00fcck, dass ein <em>CString <\/em>exakt 4 Bytes gro\u00df ist und genau aus einem Zeiger auf einen <em>PTSTR<\/em> besteht.<\/p>\n<p>Wie macht man es richtig?<br \/>\nGenau&#8230; man f\u00fchrt den entsprechenden cast ein. Der cast benutzt nun den cast-Operator der Klasse <em>CW2AEX,<\/em> und der liefert uns den Zeiger den wir wollten.<\/p>\n<p class=\"ccode\">for (POSITION pos= m_aBind.GetHeadPosition(); pos; )<br \/>\n{<br \/>\n\u00a0S_BIND&amp; b= m_aBind.GetNext(pos);<br \/>\n\u00a0TRACE(__FUNCTION__ &#8220; %-32s %2d\\n&#8220;,<br \/>\n\u00a0 <strong><u>static_cast&lt;PCSTR&gt;(<\/u><\/strong>CT2A(b.sName.GetString())<strong><u>)<\/u><\/strong>,<br \/>\n\u00a0 b.GetStatus());<br \/>\n}<\/p>\n<p>Amerkungen:<\/p>\n<ul>\n<li>Ich brauche wahrscheinlich nicht zu erw\u00e4hnen, dass \u00e4hnliche Probleme mit <em>CA2W<\/em>, <em>CA2T <\/em>etc. auch auftauchen k\u00f6nnen.<\/li>\n<li>An den meisten Stellen an denen, wir diese Konvertierungen, wie z.B. <em>CT2A\u00a0<\/em>verwenden wird auch direkt ein <em>PCTSTR <\/em>erwartet, oder eben ein Zeiger auf den entsprechend konvertieren String. Dadurch wird implizit der Konvertierungs-Operator der Klasse aufgerufen und damit funktioniert ales wie es soll.<\/li>\n<li>Auch wenn das Projekt ein MBCS Projekt gewesen w\u00e4re, h\u00e4tte es die selben Probleme verursacht. Denn in diesem Fall wird aus <em>CT2A <\/em>eine Objekt der Klasse <em>CA2AEX<\/em>. Im Gegensatz dazu w\u00fcrde <em>T2A <\/em>einfach zu ener Noop.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In einem Programm habe ich diese unscheinbare Schleife f\u00fcr eine spezielle Analyse im Debug-Mode eingebaut. for (POSITION pos= m_aBind.GetHeadPosition(); pos; ) {\u00a0 \u00a0S_BIND&amp; b= m_aBind.GetNext(pos); \u00a0TRACE(__FUNCTION__ &#8220;\u00a0 %-32s %2d\\n&#8220;, \u00a0 CT2A(b.sName.GetString()), \u00a0 b.GetStatus()); } Sieht auf den ersten Blick OK aus. Auf den zweiten Blick wundert einen evtl. die Nutzung von CT2A. Warum nehme ich &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/09\/12\/die-cx2y-falle\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDie Cx2y Falle&#8230;\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3],"tags":[366,370],"class_list":["post-116","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","tag-atl","tag-c"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}