<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9975448</id><updated>2012-01-26T19:25:03.372-02:00</updated><title type='text'>Access Violation</title><subtitle type='html'>Primariamente um blog sobre programação aberto a outros assuntos...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9975448.post-115872285407119774</id><published>2006-09-20T00:27:00.000-03:00</published><updated>2006-09-20T00:27:34.286-03:00</updated><title type='text'>Antivirus....</title><content type='html'>&lt;span style="color:#660000;"&gt;Novo post no meu outro &lt;a href="http://programming-fun.blogspot.com/2006/09/eficincia-dos-antivirus-gratuitos.html"&gt;blog&lt;/a&gt;..&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115872285407119774?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115872285407119774/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115872285407119774' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115872285407119774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115872285407119774'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/09/antivirus.html' title='Antivirus....'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115758585007597017</id><published>2006-09-06T20:36:00.001-03:00</published><updated>2011-12-06T08:38:49.271-02:00</updated><title type='text'>Novo blog....</title><content type='html'>&lt;a href="http://programing-fun.blogspot.com/" style="color: #003300;"&gt;&lt;span style="font-family: verdana;"&gt;Criei um novo blog...&lt;/span&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115758585007597017?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115758585007597017/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115758585007597017' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115758585007597017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115758585007597017'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/09/novo-blog.html' title='Novo blog....'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115738839775201879</id><published>2006-09-04T13:46:00.000-03:00</published><updated>2006-09-04T13:46:38.066-03:00</updated><title type='text'>Vista RC1</title><content type='html'>&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Não é nenhuma novidade mas aqui vai...&lt;br /&gt;&lt;br /&gt;A Microsoft liberou (para Testers) o &lt;a href="http://blogs.technet.com/windowsvista/archive/2006/09/01/453491.aspx"&gt;Windows Vista RC 1&lt;/a&gt; (build 5600). Analistas esperam que a Microsoft libere esta versão para o público em geral em 07/09.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.winsupersite.com/reviews/winvista_rc1.asp"&gt;Aqui&lt;/a&gt; você encontra outra review sobre o RC1.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115738839775201879?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115738839775201879/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115738839775201879' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115738839775201879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115738839775201879'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/09/vista-rc1.html' title='Vista RC1'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115404709921579985</id><published>2006-07-27T21:29:00.000-03:00</published><updated>2006-08-02T20:20:16.200-03:00</updated><title type='text'>SerialWizard : Frames</title><content type='html'>&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;No post anterior comecei a falar sobre o SerialWizard e suas funcionalidades. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Um dos elementos apresentados foi uma "janela" chamada "&lt;em&gt;Frames"&lt;/em&gt;. Mas o que é um frame? Este conceito é muito usado na área de comunicação de dados, neste caso específico de comunicação via porta serial. Um &lt;strong&gt;frame&lt;/strong&gt; é um conjunto de dados com &lt;em&gt;início&lt;/em&gt; e &lt;em&gt;fim&lt;/em&gt; bem definidos. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Por exemplo em comunicação de dados via porta serial frames são delimitados por caracteres de controle como &lt;em&gt;STX &lt;/em&gt;e&lt;em&gt; ETX. &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Um dos principais recursos do SerialWizard é ser capaz de carregar um arquivo com a definição de um frame e, a medida que os dados são recebidos e/ou enviados, separar os diversos elementos (&lt;em&gt;fields&lt;/em&gt;) deste frame.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Este arquivo (XML) possui a seguinte sintaxe:&lt;br /&gt;&lt;pre&gt;Created with colorer-take5 library. Type 'xml'&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 132);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(0, 0, 132);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(0, 0, 132);"&gt;version&lt;/span&gt;="1.0" &lt;span style="color: rgb(0, 0, 132);"&gt;encoding&lt;/span&gt;=&lt;span style="color: rgb(0, 0, 255);"&gt;"ISO-8859-1"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 132);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;protocol&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;frame&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;stx&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;len&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; encoding=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int/hex-string&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;payload&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;[len]&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;signature&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt; &amp;lt;signature value='xxx'  /&amp;gt; not supported &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;command&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; mapping=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;commands&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;status&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; mapping=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;status&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;data&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;payload&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;etx&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;lrc&lt;/span&gt; length=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;frame&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;commands&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;item&lt;/span&gt; value=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;001&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; description=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Command 1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;item&lt;/span&gt; value=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;002&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; description=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Command 2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;commands&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;status&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;item&lt;/span&gt; value=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;004&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; description=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;status 004&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;item&lt;/span&gt; value=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;008&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; description=&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;status 008&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;'&lt;/span&gt; &lt;span style="color: rgb(127, 0, 85);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;status&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;protocol&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Neste exemplo definimos um "frame" com o seguinte formato:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Primeiro campo é o caracter de controle STX&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;O segundo campo (Len) possui  2 bytes de tamanho e representa um número inteiro em uma string hexadecimal (por exemplo "12" ou 18 em decimal).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;O próximo campo (&lt;span style="font-weight: bold;"&gt;payload&lt;/span&gt;) possui &lt;span style="font-style: italic;"&gt;len&lt;/span&gt; bytes de tamanho (ou seja, se o valor do campo &lt;span style="font-weight: bold;"&gt;len&lt;/span&gt; for "15" (em hexa) então este campo possui 21 bytes) e possi os seguintes subcampos:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="margin-left: 40px;"&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;span style="font-weight: bold;"&gt;signature&lt;/span&gt;, com 4 bytes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;span style="font-weight: bold;"&gt;command&lt;/span&gt;, com 3 bytes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;span style="font-weight: bold;"&gt;status&lt;/span&gt;, com 1 byte&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;e &lt;span style="font-weight: bold;"&gt;data&lt;/span&gt; com &lt;span style="font-weight: bold;"&gt;len&lt;/span&gt; - 4 - 3- 1 bytes.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;Caracter de controle &lt;span style="font-weight: bold;"&gt;ETX&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;span style="font-weight: bold;"&gt;LRC&lt;/span&gt; com 1 byte.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;br /&gt;Abaixo apresentamos a janela principal do programa após a carga de dados formatados segundo o frame acima:&lt;/span&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;pre&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;pre&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;pre&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6048/750/1600/SerialWizardFrames.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6048/750/320/SerialWizardFrames.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 0);font-family:verdana;" &gt;&lt;br /&gt;Observe que a janela "&lt;span style="font-style: italic;"&gt;frames"&lt;/span&gt; foi populada com  a estrutura exata do &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt;. Além disso podemos selecionar os dados relativos ao campo do frame clicando no respectivo &lt;span style="font-style: italic;"&gt;checkbox&lt;/span&gt; na janela &lt;span style="font-style: italic;"&gt;frames&lt;/span&gt; (observe o campo &lt;span style="font-style: italic;"&gt;data&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;No próximo post farei uma breve explicação sobre os elementos que definem um &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Abraços.&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115404709921579985?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115404709921579985/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115404709921579985' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115404709921579985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115404709921579985'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/07/serialwizard-frames.html' title='SerialWizard : Frames'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115379985485670067</id><published>2006-07-25T00:32:00.000-03:00</published><updated>2006-07-25T01:00:06.766-03:00</updated><title type='text'>SerialWizard for dummies :)</title><content type='html'>&lt;span style="font-family:verdana;color:#330000;"&gt;&lt;br /&gt;Como comentei no último post, vou descrever melhor as funcionalidades do SerialWizard; abaixo segue um screenshot da tela principal do programa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/SerialWizardVista3.1.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/SerialWizardVista3.1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nesta figura podemos observar alguns elementos:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Data&lt;/strong&gt; window.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frames&lt;/strong&gt; window.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Detail&lt;/strong&gt; window.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;os quais descreverei individualmente:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Data Window&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Este é a janela mais simples de se entender. A mesma apresenta os dados (em hexadecimal) enviados/recebidos pela porta serial ou dados carregados de um arquivo. Nela podemos selecionar dados, navegar pelos mesmos (com as teclas de navegação) além de realizar buscas (básicas na versão corrente).&lt;/p&gt;&lt;p&gt;Esta janela é dividida em duas "sub-janelas": uma para apresentar os dados em hexadecimal e outra para apresentar os dados como strings. Observe que ao selecionar um (ou mais bytes) em uma destas "sub-janelas" os bytes correspondentes na outra também serão selecionados.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Frames&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Esta janela apresenta uma visão mais &lt;em&gt;estruturada &lt;span style="font-family:verdana;color:#330000;"&gt;&lt;/em&gt;&lt;/span&gt;dos dados visualizados na janela &lt;em&gt;data; &lt;/em&gt;em outras palavras nesta janela temos uma visão dos diversos campos (&lt;em&gt;fields)&lt;/em&gt; que compõe um buffer. Este recurso é útil para analizarmos protocolos pois nos permite visualizar mais rapidamente os diversos campos do mesmo. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;color:#330000;"&gt;Para que este recurso esteja habiltiado é necessário que o programa conheça a estrutura do protocolo (saiba fazer parse do protocolo). Em um próximo post veremos como &lt;em&gt;"ensinar"&lt;/em&gt; o programa a fazer parse de um protocolo.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color:#330000;"&gt;Observe que ao selecionarmos um (ou mais) campo(s) (através do checkbox da treeview) os dados correspondentes serão selecionados.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;strong&gt;Details&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;A janela &lt;em&gt;details &lt;/em&gt;possui duas &lt;em&gt;tabs&lt;/em&gt;: &lt;em&gt;Details e Commands. &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;A primeira apresenta os dados selecionados em um (ou mais) formato(s) selecionado(s) (levando-se em consideração os respectivos tamanhos dos tipos de dado). Por exemplo se &lt;em&gt;Signed16&lt;/em&gt; estiver marcado e dois ou mais bytes (16 ou mais bits) estiverem selecionados o valor correspondente aos dados selecionados convertidos para um número sinalizado de 16 bits será apresentado.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;A segunda &lt;em&gt;tab&lt;/em&gt; (&lt;em&gt;commands&lt;/em&gt;) é utilizada para enviar dados pela porta serial.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115379985485670067?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115379985485670067/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115379985485670067' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115379985485670067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115379985485670067'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/07/serialwizard-for-dummies.html' title='SerialWizard for dummies :)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115378483802889785</id><published>2006-07-24T20:27:00.000-03:00</published><updated>2006-07-24T20:52:25.216-03:00</updated><title type='text'>Novo aplicativo...</title><content type='html'>&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;A algum tempo atraz eu comecei a trabalhar em uma empresa de desenvolvimento que depende muito de comunicação com dispositivos através da porta serial (&lt;a href="http://en.wikipedia.org/wiki/Rs232"&gt;RS232&lt;/a&gt;) e tive contato com um programa desenvolvido internamente (acredito que pela matriz) que permitia o envio de dados pela serial; ainda que semelhante ao Hyper&lt;/span&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Terminal do &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;Windows&lt;/a&gt;, este programa adicionava algumas características interessantes:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Cálculo automático de &lt;a href="http://en.wikipedia.org/wiki/Longitudinal_redundancy_check"&gt;LRC&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Tratamento de dados no formato hexadecimal&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Apesar destes recursos notei alguns &lt;/span&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;problemas com o mesmo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Bugs: O programa possuía vários erros e eu não tinha acesso ao código fonte.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Recursos não implementados&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Somado a estas questões havia o fato d&lt;/span&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;e eu procurar algo interessante para desenvolver usando a  plataforma &lt;a href="http://msdn.microsoft.com/netframework/"&gt;Dot Net&lt;/a&gt;; assim decidi implementar um aplicativo com as seguintes funcionalidades:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Visualização de dados no formato Hexadecimal&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Envio de dados pela porta serial com suporte a cálculo automático de LRC e tratamento de dados hexadecimal&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Parse de "&lt;span style="font-style: italic;"&gt;frames"&lt;/span&gt;, ou seja, dado um buffer contendo um frame separar os vários campos deste frame&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Assim nasceu o &lt;a href="http://sourceforge.net/projects/serialwizard"&gt;&lt;span style="font-style: italic;"&gt;SerialWizard&lt;/span&gt;&lt;/a&gt; (sei lá porque este nome).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6048/750/1600/MainWindows.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6048/750/320/MainWindows.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 0);font-family:verdana;" &gt;Neste final de semana liberei a primeira versão (ainda em alpha e com vários bugs e funcionalidades ainda não implementadas). no &lt;span style="font-style: italic;"&gt;sourceforge&lt;/span&gt;. Na medida do possível implementarei novas funcionalidades e corrigirei bugs no mesmo.&lt;br /&gt;&lt;br /&gt;Ao longo dos próximos posts irei descrever as principais funcionalidades do programa; mas não espere por isso! &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=171621"&gt;Baixe&lt;/a&gt; o mesmo e comece a brincar agora mesmo! :)&lt;br /&gt;&lt;br /&gt;Abraços.&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115378483802889785?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115378483802889785/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115378483802889785' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115378483802889785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115378483802889785'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/07/novo-aplicativo.html' title='Novo aplicativo...'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115275134931636988</id><published>2006-07-12T21:29:00.000-03:00</published><updated>2006-07-12T21:42:29.763-03:00</updated><title type='text'>O que há de errado com este código?</title><content type='html'>&lt;span style="color: rgb(51, 0, 0);"&gt;&lt;span style="font-family:verdana;"&gt;Mais um post da série o que há de errado com este código!&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;Created with colorer-take5 library. Type 'csharp'&lt;br /&gt;&lt;br /&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Windows&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Forms&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Threading&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;namespace&lt;/span&gt; TestWinForm&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; partial &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestCallBackFromDiferentThread &lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt; Form&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; System&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Threading&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Thread workerThread&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; TestCallBackFromDiferentThread&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:             InitializeComponent&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14:&lt;br /&gt;15:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; button1_Click&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;object&lt;/span&gt; sender&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; EventArgs e&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;16:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;17:             ThreadStart ts &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ThreadStart&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;AddNewLine&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:             workerThread &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Thread&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;ts&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:             workerThread&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Start&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;20:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;21:&lt;br /&gt;22:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; AddNewLine&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;23:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;24:             listBox1&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Items&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Add&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;textBox1&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Text&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;27: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bom, a resposta eu posto depois!&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115275134931636988?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115275134931636988/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115275134931636988' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115275134931636988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115275134931636988'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/07/o-que-h-de-errado-com-este-cdigo.html' title='O que há de errado com este código?'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115192290998495540</id><published>2006-07-03T07:21:00.000-03:00</published><updated>2006-07-03T07:35:10.210-03:00</updated><title type='text'>Gravando CDs for dummys</title><content type='html'>&lt;span style="font-family:verdana;color:#660000;"&gt;Hoje de manhã eu precisava gravar um CD antes de ir para o trabalho; para ganhar tempo liguei o micro e fui tomar café; como o Windows Vista é muito humilde e se instalou como minha primeira opção de SO quando acabei de tomar café e fui gravar o tal CD o Windows Vista é que tinha sido carregado (ao invés do Windows XP).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Eu pensei comigo: ok, vamos ver como ele se comporta com relação a gravação de CDs. Abri a porta do gravador de CDs, coloquei um CD regravável (já com conteúdo) e depois de algum tempo apareceu a a seguinte janela:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/cdwriter.png" border="0" /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Eu pensei: ótimo. como pode-se ver ele já reconheceu que se trata de uma mídia regravável e me deu a opção de "apagá-lo"; e esta foi exatamente meu próximo passo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Ao final do processo me foi apresentada o seguinte dialog:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/wtf.png" border="0" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Muito estranho um dialog com um botão "finish" e o texto "to close this windows click finish", não ? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Espero que seja apenas um "lapso" (afinal de contas se trata de um produto beta).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Mas o pior de tudo é que o CD não foi "apagado" e também não consegui gravar nada nele (pelo Windows Vista). &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#660000;"&gt;Solução: reiniciei com o Windows XP e utilizei o &lt;a href="http://www.cdburnerxp.se/"&gt;CDBurnerXP Pro&lt;/a&gt;. Ai sim, consegui gravar meu CD.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115192290998495540?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115192290998495540/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115192290998495540' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115192290998495540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115192290998495540'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/07/gravando-cds-for-dummys.html' title='Gravando CDs for dummys'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115102149858771371</id><published>2006-06-22T20:24:00.000-03:00</published><updated>2006-06-23T09:26:33.286-03:00</updated><title type='text'>Cool!</title><content type='html'>&lt;span style="color: rgb(0, 51, 0);font-family:verdana;" &gt;Hoje encontrei vários posts interessantes que pretendo compartilhar.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;O primeiro assunto que encontrei foi a implementação de transações pelo SO (no caso o Windows Vista).&lt;br /&gt;&lt;pre style="border-right: crimson 1pt dashed; border-top: crimson 1pt dashed; border-left: crimson 1pt dashed; border-bottom: crimson 1pt dashed; background: whitesmoke none repeat scroll 0% 50%; padding-left: 10px; color: rgb(0, 0, 0); font-size: 11pt; font-family: Tahoma, Verdana;text-align: justify;"&gt;Até onde eu sei o tão falado &lt;em&gt;"Transactional File System"&lt;/em&gt; &lt;br /&gt;havia sido removido desta primeira versão,&lt;br /&gt;mas pelo que entendi do post acima me parece que algum suporte &lt;br /&gt;já foi adicionado! E o melhor, funciona!&lt;br /&gt;Pelo menos os testes simples que realizei.&lt;/pre&gt;Hoje de manhã, com mais tempo, procurei melhor sobre o assunto e encontrei o &lt;a href="http://blogs.msdn.com/volkerw/archive/2006/06/09/624540.aspx"&gt;link&lt;/a&gt; original. Realmente o &lt;span style="font-style: italic;"&gt;Transactional NTFS&lt;/span&gt; (ou &lt;span style="font-style: italic;"&gt;TxF&lt;/span&gt; para os íntimos :) já  está  presente no  Vista Beta 2!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/Transactions.png"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/6048/750/200/Transactions.png" border="0" /&gt;&lt;/a&gt;Ao lado você observa o help de um programa de linha de comando que acompanha o Vista Beta 2 chamado &lt;em&gt;Transaction&lt;/em&gt;. Como podemos ver temos a opção de iniciar uma nova transação, fazer o &lt;em&gt;"commit"&lt;/em&gt; ou cancelar (Rollback) de uma transação em andamento. Uma vez criada a transação, qualquer operação com o sistema de arquivos parece fazer parte desta transação. Podemos observar este comportamento criando uma nova transação e a seguir criar e/ou apagar arquivos. Notamos que estas&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt; operações se completam apenas quando finalizamos a transação (&lt;em&gt;Commit&lt;/em&gt;). &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/New%20Transaction.png"&gt;&lt;img style="margin: 0px 0px 10px 10px; float: right;" alt="" src="http://photos1.blogger.com/blogger/6048/750/200/New%20Transaction.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;Na imagem à direita, utilizei o comando &lt;em&gt;"&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;&lt;strong&gt;transaction /start&lt;/strong&gt;&lt;/span&gt;"&lt;/em&gt; para iniciar uma nova transação; a seuir, criei um novo arquivo (&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;&lt;strong&gt;copy con teste.txt&lt;/strong&gt;&lt;/span&gt;), que pode ser observado na imagem abaixo.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/New%20File.0.png"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/6048/750/200/New%20File.0.png" border="0" /&gt;&lt;/a&gt;Note que no console em que o arquivo foi criado o mesmo é listado normalmente (uma vez que estamos na mesma transação que o criou!).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;O próximo passo foi abrir outro console e verificar se o arquivo aparece para o mesmo ou não. Observei que o arquivo não foi listado (mas como parece que o blogger impõe limites de imagens em um post não consigui incluir a imagem :(. amanhã eu tento novamente). De qualquer forma acredite em mim; o arquivo só apareceu no segundo console (e no Windows Explorer e para todos os demais aplicativos que não fazem parte da transação) após a mesma ser finalizada com sucesso &lt;em&gt;(&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;&lt;strong&gt;transaction /commit&lt;/strong&gt;&lt;/span&gt;&lt;/em&gt;). Outra coisa interessante é que após ter realizado o commit criei uma nova transação e apaguei o arquivo. Antes de fazer o commit novamente carreguei o Windows Explorer e tentei renomear o arquivo; o mesmo gerou um erro informando que o arquivo estava reservado por outra transação!&lt;em&gt;.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;Depois encontrei &lt;a href="http://elssblog.blogspot.com/2006/06/disk-management-in-windows-vista.html"&gt;este post&lt;/a&gt;! Cool, o Windows Vista (Beta 2) já suporta redimensionamento de partições! &lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-family:Verdana;" &gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/Disk%20Managment.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/Disk%20Managment.png" border="0" /&gt;&lt;/a&gt;Nesta imagem podemos ver as opções (Expand/Shrink) (na partição ativa :))&lt;/p&gt;&lt;p&gt;Nem precisa perguntar se eu testei ou não ;). A resposta é não! Não quero arriscar perder dados de outras partições (como não tenho um segundo computador para testes instalei o Windows Vista no meu computador onde tenho todos os meus dados mesmo ;)&lt;/p&gt;&lt;p&gt;O &lt;a href="http://blogs.msdn.com/vcblog/archive/2006/06/22/643325.aspx"&gt;último post&lt;/a&gt; que incluo fala um pouco sobre o SP1 do Visual Studio 2005 (mais especificamente do compilador C++).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115102149858771371?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115102149858771371/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115102149858771371' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115102149858771371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115102149858771371'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/cool.html' title='Cool!'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-115072439207994240</id><published>2006-06-19T10:37:00.000-03:00</published><updated>2006-06-19T10:39:52.380-03:00</updated><title type='text'>Que Linux nada!! :)</title><content type='html'>&lt;span style="font-family: verdana; color: rgb(102, 0, 0);"&gt;Você já viu este &lt;a href="http://www.reactos.org/xhtml/en/index.html"&gt;SO&lt;/a&gt;? Muito interessante.. mesmo não tendo realizado nenhum teste me pareceu bem interessante!&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-115072439207994240?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/115072439207994240/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=115072439207994240' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115072439207994240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/115072439207994240'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/que-linux-nada.html' title='Que Linux nada!! :)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114995136837199230</id><published>2006-06-10T11:55:00.000-03:00</published><updated>2006-06-10T11:56:08.600-03:00</updated><title type='text'>Win32 &lt;--&gt; BLC (.Net)</title><content type='html'>&lt;span style="color: rgb(102, 51, 51);font-family:verdana;" &gt;Hoje eu estava procurando um assundo no site do &lt;a href="http://msdn.microsoft.com/library"&gt;msdn library&lt;/a&gt; e encontrei &lt;a href="http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dndotnet/html/win32map.asp#win32map_fileiofunctions"&gt;este artigo&lt;/a&gt; sobre como mapear funções da Win32 para as respectivas classes/métodos da &lt;span style="font-style: italic;"&gt;Base Class Library&lt;/span&gt; do .Net.&lt;br /&gt;&lt;br /&gt;O mesmo é de 1/2004 mas ainda deve ser interessante :)&lt;br /&gt;&lt;br /&gt;Deus os abençoe.&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114995136837199230?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114995136837199230/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114995136837199230' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114995136837199230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114995136837199230'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/win32-blc-net.html' title='Win32 &lt;--&gt; BLC (.Net)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114963341790614600</id><published>2006-06-06T19:36:00.000-03:00</published><updated>2006-06-09T00:05:43.816-03:00</updated><title type='text'>Links...</title><content type='html'>&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Aqueles que estão acostumados com SOs &lt;span style="font-style: italic;"&gt;Unix Like&lt;/span&gt; certamente já conhecem este conceito, mas  p&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;oucos usuários do Windows sabem que o NTFS (desde o &lt;span style="font-style: italic;"&gt;Windows NT 4.0&lt;/span&gt;), suporta o conceito de &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/hard_links_and_junctions.asp"&gt;&lt;span style="font-style: italic;"&gt;hardlinks&lt;/span&gt;&lt;/a&gt;, que nada mais são que várias entradas de diretório que apontam para o mesmo arquivo (Note que este conceito aplica-se apenas a arquivos).&lt;br /&gt;&lt;br /&gt;Utilizando-se este recurso é possível fazer com que um arquivo possa &lt;span style="font-style: italic;"&gt;"estar"&lt;/span&gt; em dois (ou mais) diretórios ao mesmo tempo :).&lt;br /&gt;&lt;br /&gt;Vejam o exemplo:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Arquivo: c:\temp\teste.txt&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Hardlink: c:\dados\teste.txt&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Neste exemplo é possível com que dois arquivos aparentemente distintos representem o mesmo arquivo.&lt;br /&gt;&lt;br /&gt;Você pode estar se perguntando: "E porque eu usaría isto?". Para simplificar o gerenciamento de arquivos.&lt;br /&gt;&lt;br /&gt;Por exemplo, em alguns projetos meus, necessito que um arquivo (digamos &lt;span style="font-style: italic;"&gt;arquivo.txt&lt;/span&gt;) se encontre em um diretório específico; por outro lado este mesmo arquivo deve ser incluído no &lt;span style="font-style: italic;"&gt;programa de setup&lt;/span&gt; destes projetos que por sua vez, normalmente, tem seus arquivos armazenados em um diretório chamado &lt;span style="font-style: italic;"&gt;setup&lt;/span&gt; e, por motivos de organização, este arquivo fica neste diretório, assim acabo com a seguinte configuração:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    c:\meus projetos\nome projeto\src\arquivo.txt&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;&lt;span style="font-style: italic;"&gt;    c:\meus projetos\nome projeto\src\setup\arquivo.txt&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Agora eu tenho que decidir como gerenciar esta questão:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Mantenho o arquivo nos dois diretórios e corro o risco de ter duas versões diferentes do mesmo (e o que é pior, testar o projeto usando um arquivo e liberar um setup que usa o outro - não testado)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Manter apenas uma cópia do arquivo e ficar movendo a mesma de um diretório para o outro na medida do nescessário.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;Usando hard links é possível manter uma única cópia do arquivo (provavelmente no diretório &lt;span style="font-style: italic;"&gt;setup&lt;/span&gt;) e criar um hard link para este arquivo no direrório &lt;span style="font-style: italic;"&gt;src&lt;/span&gt; resolvendo o problema (evitando trabalho desnecessário e/ou problemas por utilizar uma versáo incorreta do arquivo).&lt;br /&gt;&lt;br /&gt;O melhor de tudo é que é possível mover qualquer uma das referências e tudo continuará a funcionar!&lt;br /&gt;&lt;br /&gt;A questão que surge então é &lt;span style="font-style: italic;"&gt;"como fazer para criar um hardlink?"&lt;/span&gt;. A resposta rápida é: nas versões  atuais o  Windows  não disponibiliza uma forma simples para se fazer isto. Mas como quase tudo no windows pode ser extendido (e o Shell não é diferente) já desenvolveram (pelo menos) uma &lt;a href="http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html"&gt;&lt;span style="font-style: italic;"&gt;Shell Extension.&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;Adriano&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:verdana;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114963341790614600?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114963341790614600/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114963341790614600' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114963341790614600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114963341790614600'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/links.html' title='Links...'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114920797008239043</id><published>2006-06-01T20:56:00.000-03:00</published><updated>2006-06-01T22:01:00.740-03:00</updated><title type='text'>Vista Beta2</title><content type='html'>&lt;span style="font-family:verdana;color:#000066;"&gt;Em um &lt;a href="http://accessviolation.blogspot.com/2006/05/streams-alternativas-de-dados.html"&gt;post sobre &lt;em&gt;streams&lt;/em&gt;&lt;/a&gt; fiz alguns comentários sobre o Windows Vista Build 5365. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Neste post pretendo falar um pouco sobre minhas primeiras impressões sobre o &lt;strong&gt;Build 5384&lt;/strong&gt;, ou seja, o &lt;/span&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;strong&gt;Windows Vista Beta 2&lt;/strong&gt;, que instalei ontem a noite. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color:#000066;"&gt;Minha primeira frustração foi que o Windows (desde que foi lançado) não respeita &lt;em&gt;dual boot &lt;/em&gt;com outros sistemas operacionais que não sejam da própria MS; resutado: bye bye &lt;/span&gt;&lt;a href="http://www.ubuntu.com/"&gt;&lt;span style="color:#000066;"&gt;Ubuntu&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#000066;"&gt;. Na realidade o SO propriamente dito (Ubuntu) não foi apagado (seria um absurdo); o que ocorreu foi que o boot mananger do Vista não &lt;em&gt;reconhece &lt;/em&gt;outros SOs, então ele não me da a opção de carregar os mesmos, ou seja, terei que reinstalar um boot manager (no caso o &lt;/span&gt;&lt;a href="http://www.gnu.org/software/grub/"&gt;&lt;span style="color:#000066;"&gt;grub&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#000066;"&gt;). &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Meu segundo passo foi tentar instalar o &lt;a href="http://free.grisoft.com"&gt;AVG&lt;/a&gt; (antivirus); para minha surpresa o Vista reclamou e disse que o AVG tem problemas de compatibilidade com esta versão do SO (acredito firmemente que estes problemas serão sanados até o lançamento do Vista); solução? Instalei o &lt;a href="http://www.avast.com/"&gt;Avast&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;No post anterior comentei que notei alguns comportamentos estranhos; bem, posso dizer que estou muito satisfeito com esta versão. Os problemas citados não se manifestaram mais (pelo menos até agora) :). &lt;/span&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;br /&gt;&lt;/li&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;O &lt;em&gt;Windows Media Player&lt;/em&gt; funcionou muito bem&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/Sound.png"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 222px; CURSOR: hand; HEIGHT: 236px" height="128" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/Sound.png" width="149" border="0" /&gt;&lt;/a&gt;O sistema de controle de volume por aplicativos é bastante interessante. É possível controlar o volume indivialmente, ou seja, é possível ouvir som no "talo" sem correr o risco de ter que ouvir aqueles avisos sonoros do Windows (e/ou outros aplicativos) em um volume que incomode.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;A performance em geral melhou bem&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;O IE não subiu no telhado nenhuma vez :)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;De qualqer forma ainda observo alguns comportamentos estranhos: &lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;Não houve como fazer com que o Vista ocupasse toda a área do meu monitor (mesmo configurando o monitor para ocupar 100% da área nota-se que temos &lt;em&gt;duas margens&lt;/em&gt; não utilizadas pelo Vista.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;Os &lt;em&gt;"commom dialogs&lt;/em&gt;" continuam não reconhecendo a sintaxe de streams.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;Bom, por enquanto é isso. Se encontrar algo acrescento depois.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;color:#000066;"&gt;Adriano&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114920797008239043?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114920797008239043/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114920797008239043' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114920797008239043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114920797008239043'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/vista-beta2.html' title='Vista Beta2'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114916469356616600</id><published>2006-06-01T09:17:00.000-03:00</published><updated>2006-06-01T09:26:42.993-03:00</updated><title type='text'>Mouse Whell no IDE do VB6</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Antes que reclamem, sim, eu entendo que VB6 é uma ótima ferramenta para desenvolvimento de aplicativos GUI (e quando o VB6 apresentar alguma limitação crie um componente COM em C++). A pelo menos 8 anos venho adotando esta linha: GUI =&gt; VB, código que necessite de mais recursos/performance/etc, componente COM em C++ e tem funcionado bem (incluse o Joel tem um &lt;a href="http://www.joelonsoftware.com/articles/fog0000000006.html"&gt;post&lt;/a&gt; bem interessante sobre o assunto).&lt;br /&gt;&lt;br /&gt;De qualquer forma, o objetivo deste post é outro.&lt;br /&gt;&lt;br /&gt;Sempre senti falta do recurso do &lt;span style="font-weight: bold;"&gt;mouse whell&lt;/span&gt; no IDE do VB6 mas nunca me dei ao trabalho de procurar uma solução; hoje de manhã eu &lt;span style="font-style: italic;"&gt;"trombei"&lt;/span&gt; com uma solução que pode ser conferida no &lt;a href="http://support.microsoft.com/Default.aspx?id=837910"&gt;site da Microsoft&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114916469356616600?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114916469356616600/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114916469356616600' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114916469356616600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114916469356616600'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/06/mouse-whell-no-ide-do-vb6.html' title='Mouse Whell no IDE do VB6'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114723176678821546</id><published>2006-05-10T00:21:00.000-03:00</published><updated>2006-05-10T01:08:26.906-03:00</updated><title type='text'>Streams alternativas de dados</title><content type='html'>&lt;span style="font-family:verdana;color:#000066;"&gt;Poucas pessoas sabem que (pelo menos a partir do Windows 2000) o NTFS suporta o conceito &lt;em&gt;de "Stream alternativa de dados"&lt;/em&gt;. Uma stream de dados nada mais é que uma sequência de bytes gravadas no arquivo. O interessante é que, por default, o Windows sempre utiliza a stream &lt;em&gt;principal&lt;/em&gt;, mas nada nos impede de criarmos outras streams:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;/span&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;p&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;/span&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/stream1.0.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/stream1.0.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No console acima observamos que não temos nenhum arquivo no dirertório &lt;em&gt;c:\test&lt;/em&gt; (observe o &lt;em&gt;0 Files&lt;/em&gt;). &lt;/p&gt;&lt;p&gt;Logo a seguir criamos uma segunda stream no arquivo &lt;em&gt;teste.txt&lt;/em&gt; chamada &lt;em&gt;segunda_stream&lt;/em&gt; (ok, estou sem criatividade agora). Como o exemplo demonstra, a sintaxe para nomes de &lt;em&gt;streams alternativas &lt;/em&gt;é:&lt;/p&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;nome_arquivo.ext:nome-stream&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Mas como podemos verificar se um arquivo possui ou não streams alternativa? Simples; se você possui uma versão do Windows anterior ao Vista baixe o programa &lt;a href="http://www.sysinternals.com/Utilities/Streams.html"&gt;&lt;em&gt;streams.&lt;/em&gt;exe do site &lt;em&gt;Sysinternals.com&lt;/em&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/SI-Streams.0.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6048/750/320/SI-Streams.0.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como podemos observar o programa detectou a stream &lt;em&gt;segunda_stream&lt;/em&gt;. &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Por outro lado, se você esta utilizando o Windows Vista basta acrescentar o &lt;em&gt;parâmetro /r&lt;/em&gt; ao comando &lt;em&gt;dir.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6048/750/1600/StreamDir.0.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="dir /r" src="http://photos1.blogger.com/blogger/6048/750/320/StreamDir.0.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Algumas considerações importantes:&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Apesar de muitos programas não trabalharem corretamente com stream a Win32 API não apresenta problemas para lidar com as mesmas (por exemplo a função &lt;em&gt;CreateFile()&lt;/em&gt; trata nomes de arquivos com streams corretamente).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Você pode utilizar streams alternativas para armazenar dados &lt;em&gt;extras&lt;/em&gt; de um programa sem &lt;em&gt;dar muito na cara :)&lt;/em&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;O Windows Vista (build 5365) apresentou várias anomalias enquanto eu estava escrevendo este post (entre elas, o Explorer foi pro cacau várias vezes, o IE deu PT pelo menos uma vez, a performance para navegar no sistema de arquivos esta uma *$&amp;*&amp;amp;@*, etc.); de qualquer forma não poss me esquecer que estou usando um produto beta.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Falem o que quiser... o visual do Vista esta cada vez melhor! Aero, Side bar, Miniaturas na task bar, etc.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Bem, espero que tenham achado este post útil :)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;[]'s&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;color:#000066;"&gt;Adriano&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114723176678821546?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114723176678821546/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114723176678821546' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114723176678821546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114723176678821546'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/05/streams-alternativas-de-dados.html' title='Streams alternativas de dados'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114667563830868721</id><published>2006-05-03T13:54:00.000-03:00</published><updated>2006-05-24T10:02:26.690-03:00</updated><title type='text'>Evolução....</title><content type='html'>&lt;span style=";font-family:verdana;font-size:100%;"&gt;&lt;br /&gt;Bom, este post é um pouco nostáugico :)&lt;br /&gt;&lt;br /&gt;Ontem a noite estava pensando nas configurações de meus computadores e como elas evoluiram. Apenas como curiosidade aqui estão elas: &lt;table style="border: 1px solid gray; border-spacing: 0px; order-collapse: separate; background-color: rgb(255, 255, 240); font-size: 11pt;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr style="border: 1px solid gray; padding: 1px; background-color: rgb(255, 255, 240); -moz-border-radius-topleft: 0px; -moz-border-radius-topright: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px;"&gt;&lt;br /&gt;&lt;th&gt;Ano&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Processador&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Frequência&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Cooler&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Memória&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Disco Rígido&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Placa Vídeo&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Internet&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr style="border: 1px solid gray; padding: 1px; background-color: white;"&gt;&lt;br /&gt;&lt;td&gt;1989&lt;/td&gt;&lt;br /&gt;&lt;td&gt;6502&lt;/td&gt;&lt;br /&gt;&lt;td&gt;0,75 MHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;O que é serve isto mesmo?&lt;/td&gt;&lt;br /&gt;&lt;td&gt;256 Kb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;NA&lt;/td&gt;&lt;br /&gt;&lt;td&gt;OnBoard&lt;/td&gt;&lt;br /&gt;&lt;td&gt;NA&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;1992&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Ciryx 486 DLC&lt;/td&gt;&lt;br /&gt;&lt;td&gt;40 MHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Pra que?&lt;/td&gt;&lt;br /&gt;&lt;td&gt;4 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;100 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Trident&lt;/td&gt;&lt;br /&gt;&lt;td&gt;NA&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;1996&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Intel Pentium 100&lt;/td&gt;&lt;br /&gt;&lt;td&gt;100 MHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Ainda não era necessário&lt;/td&gt;&lt;br /&gt;&lt;td&gt;16 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;1.0 Gb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;?&lt;/td&gt;&lt;br /&gt;&lt;td&gt;28 Kbps&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;1999&lt;/td&gt;&lt;br /&gt;&lt;td&gt;AMD Athlon 400&lt;/td&gt;&lt;br /&gt;&lt;td&gt;400 MHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Pequeno e silencioso.&lt;/td&gt;&lt;br /&gt;&lt;td&gt;128 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;30.0 Gb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;OnBoard 4 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;56 Kbps&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;2002&lt;/td&gt;&lt;br /&gt;&lt;td&gt;AMD Athlon XP 2.1&lt;/td&gt;&lt;br /&gt;&lt;td&gt;1.8 GHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Um monstro. Parece uma turbina de avião.&lt;/td&gt;&lt;br /&gt;&lt;td&gt;512 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;60.0 Gb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;AGP 64 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;ADSL 350 Kbps&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;2006&lt;/td&gt;&lt;br /&gt;&lt;td&gt;AMD Athlon 64 3.8 X2&lt;/td&gt;&lt;br /&gt;&lt;td&gt;2.0 GHz&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Mais silencioso que o anterior&lt;/td&gt;&lt;br /&gt;&lt;td&gt;2.0 Gb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;370.0 Gb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;PCI-X 256 Mb&lt;/td&gt;&lt;br /&gt;&lt;td&gt;2.0 Mbps&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Algumas observações interessantes sobre as mudanças nestes 17 anos....:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Apesar da frequência dos processadores aumentar consistentemente notamos que nos últimos anos este aumento foi mais lento e atualmente observamos até uma redução; por exemplo&lt;br /&gt;    o processador Athlon 64 3.8 single core da AMD roda a 2.1 Ghz enquanto o &lt;b&gt;3.8 X2 (dual core)&lt;/b&gt; roda a 2.0 Ghz. Ok eu sei que isto é decorrência dos limites do processo atual (aumento&lt;br /&gt;    na frequência de operação implica basicamente em aumento da dissipassão térmica)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As empresas passaram a utilizar outros indicadores para comparação de performance (em detrimento à frequência).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ao mesmo tempo eficiência térmica se tornou um item importante (também, ninguém merece um &lt;b&gt;mini-aquecedor&lt;/b&gt;!)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Em 1992 as configurações mais comuns possuiam entre 2 e 4 Mb. Atualmente as configurações mais comuns estão na faixa dos 1.0 ~ 2.0 Gb (algo entre 250 e 500 vezes)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Neste mesmo período (1992 ~ 2006) o aumento da capacidade de armazenamento do disco rígido foi substancialmente maior (no mínimo 1000 vezes considerando-se discos atuais de 100 Gb)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O acesso a internet... aqueles que utilizaram modens de 14.400 Kbps sabem a tortura que era. Atualmente? Bom estou feliz com meu acesso de 2.0 Gbps (ok, confesso que já andei dando uma olhado no&lt;br /&gt;    plano de 8.0 Gbps :) mas ainda é muito caro)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Observe que a nomenclatura da AMD não especifica a frequencia do processador, mas sim um valor comparativo. Por exemplo, a frequência do Athlon 64 3.8 X2 é 2.0 GHz (ao invés de 3.8 GHz como o nome sugere).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="tags"&gt;Tags:teste&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/accessviolation/accessviolation+hardware" rel="tag"&gt;hardware&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114667563830868721?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114667563830868721/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114667563830868721' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114667563830868721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114667563830868721'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/05/evoluo.html' title='Evolução....'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-114366393677203878</id><published>2006-03-29T17:23:00.000-03:00</published><updated>2006-03-29T17:25:37.010-03:00</updated><title type='text'>Brinquedo novo II</title><content type='html'>&lt;span style="font-family: verdana; font-size: 100%;"&gt;&lt;a href="http://accessviolation.blogspot.com/2006/02/novo-brinquedo.html"&gt;Neste post&lt;/a&gt; comentei que estava comprando um computador novo e listei os componentes da minha máquina dos sonhos; pois bem, depois de quase um mês (de férias, graças a Deus) finalmente&lt;br /&gt;montei meu novo computador com a seguinte configuração:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Processador: AMD X2 3800&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Placa mãe: ASUS A8N SLI&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Memória: Coirsar 2GB (2 x 1GB) DDR 400&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Placa Vídeo: GeForce 6800 GS 256Mb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HD1: Seagate 120GB ATA (já possuia)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HD2: Maxtor 250GB SATA&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Monitor: Samsung 17" CRT (já possuia) &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cooler: BOX&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DVD: LG&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fonte: Thermaltake 430 W&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Teclado: ABNT 2 Wireless Logitech&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mouse: Wireless Logitech&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;       &lt;br /&gt;&lt;br /&gt;PS: Se você comprou um HD Sata II que não é reconhecido e/ou não funciona corretamente configure o mesmo para SATA I (normalmente através de um jumper no próprio HD);&lt;br /&gt;isto deve resolver o problema. Outra possibilidade é tentar atualizar o firmware do seu HD (por sua conta e risco :). &lt;br /&gt;&lt;br /&gt;No meu caso a &lt;a href="http://maxtor.custhelp.com/cgi-bin/maxtor.cfg/php/enduser/std_adp.php?p_faqid=2685&amp;p_created=1136595488&amp;p_sid=H8kyDI3i&amp;p_lva=&amp;p_sp=cF9zcmNoPTEmcF9zb3J0X2J5PSZwX2dyaWRzb3J0PSZwX3Jvd19jbnQ9MSZwX3Byb2RzPTY2LDIwNSZwX2NhdHM9MCZwX3B2PTIuMjA1JnBfY3Y9JnBfc2VhcmNoX3R5cGU9YW5zd2Vycy5zZWFyY2hfbmwmcF9wYWdlPTEmcF9zZWFyY2hfdGV4dD1uZm9yY2U*&amp;p_li=&amp;p_topview=1"&gt;Maxtor possui este artigo que trata sobre o assunto&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bom, acho que é isto :) Agora vou aproveitar um pouco da minha nova máquina para jogar CS Source!&lt;br /&gt;&lt;br /&gt;Abraços.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="tags"&gt;Tags:teste&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/accessviolation/accessviolation+hardware" rel="tag"&gt;hardware&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-114366393677203878?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/114366393677203878/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=114366393677203878' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114366393677203878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/114366393677203878'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/03/brinquedo-novo-ii.html' title='Brinquedo novo II'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113992365090440904</id><published>2006-02-14T11:26:00.000-02:00</published><updated>2006-02-14T11:27:31.190-02:00</updated><title type='text'>Novo brinquedo :)</title><content type='html'>&lt;span style=";font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;Como todo bom apaixonado por informática estou sempre atualizando meu computador. Atualmente estou pesquisando uma configuração para minha nova máquina.&lt;br /&gt;&lt;br /&gt;Abaixo segue a configuração dos sonhos :)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Processador: AMD X2 4600&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Placa mãe: DFI LANPARTY nF4 SLI-DR&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Memória: GeIL 2GB (2 x 1GB) DDR 400&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Placa Vídeo: 2 x GeForce 7800GTX 256Mb (SLI é claro)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HD1: Western Digital Raptor 150GB&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HD2: Seagate 7200.9 300GB SATA&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Monitor: ViewSonic VX922 LCD&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cooler: COOLER MASTER AQUAGATE Mini R120&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DVD: Qualquer gravador da LG esta bom&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fonte: OCZ OCZ520ADJ - 520W&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;      &lt;br /&gt;&lt;br /&gt;Será que esqueci de alguma coisa? Com uma máquina destas acho que da para jogar CS, DOOM3, etc.&lt;br /&gt;&lt;br /&gt;Bom, como esta é uma configuração que não tenho como pagar por ela ( +- R$ 11.000,00 em uma loja oficial aqui no Brasil) no próximo post colocarei a configuração que pretendo comprar :).&lt;br /&gt;&lt;br /&gt;Abraços.&lt;br /&gt;&lt;/span&gt; &lt;div class="tags"&gt;Tags:teste&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/accessviolation/accessviolation+hardware" rel="tag"&gt;hardware&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113992365090440904?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113992365090440904/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113992365090440904' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113992365090440904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113992365090440904'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/02/novo-brinquedo.html' title='Novo brinquedo :)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113948419159722204</id><published>2006-02-09T08:37:00.000-02:00</published><updated>2006-02-10T08:54:42.023-02:00</updated><title type='text'>O que esta errado com este programa (parte iv) : Resposta</title><content type='html'>&lt;span style="font-family: verdana; font-size: 100%;"&gt;&lt;br /&gt;O problema &lt;a href="http://accessviolation.blogspot.com/2006/02/o-que-esta-errado-com-este-programa.html"&gt;com o programa do post anterior&lt;/a&gt; se encontra na linha &lt;b&gt;8&lt;/b&gt; da função fatorial (isto não é muito difícil de se perceber). &lt;br /&gt;Esta linha deveria se parecer com:&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt; 0: &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; n &lt;span style='color:#808030; '&gt;*&lt;/span&gt; fatorial&lt;span style='color:#808030; '&gt;(&lt;/span&gt;n &lt;span style='color:#808030; '&gt;-&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ou seja, o desenvolvedor se esqueceu de incluir o &lt;b&gt;return&lt;/b&gt;. É claro que o compilador gerou uma warning (aviso) mas eu a ignorei conscientemente.&lt;table style="border-width: 1px; padding: 0px;" border="1" cellpadding="5" cellspacing="0"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr style="border-width: 0px 0px 1px 1px; padding: 4px 6px; background-color: rgb(221, 221, 221);" valign="top"&gt;&lt;br /&gt;&lt;td&gt;&lt;span style="font-size: 85%; color: red;"&gt;&lt;b&gt;Atenção&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr valign="top"&gt;&lt;br /&gt;&lt;td&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;Ignorar avisos (warnings) do compilador não é uma prática saudável e eu não recomendo a ninguém fazê-lo! Pelo contrário; analise todas&lt;br /&gt;as warnings geradas em seu código e entenda o porque o compilador esta reclamando. Não assuma que "o compilador possui bugs" muito menos&lt;br /&gt;tome a postura arrogante de achar que sabe mais que o compilador. Se depois de estudar o motivo da warning você concluir que o código que causou&lt;br /&gt;a warning é legítimo, desabilite a warning específica (via #pragma warning) no trecho de código em questão.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Agora vem a segunda pergunta: Porque, mesmo faltando o return (ou seja, o retorno da função não foi especificado nesta condição) o programa gera o resultado&lt;br /&gt;correto (pelo menos compilando com o BC++ 3.0 e o VC7.1)?&lt;br /&gt;&lt;br /&gt;Para responder esta pergunta teremos que recorrer à linguagem assembly do programa (não se preocupe, não é tão complicado assim).&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt;Created with colorer-take5 library. Type 'asm'&lt;br /&gt;&lt;br /&gt; 0: &lt;span style='color:#e34adc; '&gt;fatorial:&lt;/span&gt;&lt;br /&gt; 1:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt;    &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt; 2:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;br /&gt; 3:     &lt;span style='color:#800000; font-weight:bold; '&gt;cmp&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;dword&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;ptr&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x1&lt;/span&gt;&lt;br /&gt; 4:     &lt;span style='color:#800000; font-weight:bold; '&gt;jnz&lt;/span&gt;     &lt;span style='color:#e34adc; '&gt;proximo_valor&lt;/span&gt;&lt;br /&gt; 5:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x1&lt;/span&gt;&lt;br /&gt; 6:     &lt;span style='color:#800000; font-weight:bold; '&gt;jmp&lt;/span&gt;     &lt;span style='color:#e34adc; '&gt;fim&lt;/span&gt;&lt;br /&gt; 7: &lt;br /&gt; 8: &lt;span style='color:#e34adc; '&gt;proximo_valor:&lt;/span&gt;&lt;br /&gt; 9:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;10:     &lt;span style='color:#800000; font-weight:bold; '&gt;sub&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x1&lt;/span&gt;&lt;br /&gt;11:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt;    &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;12:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt;    &lt;span style='color:#e34adc; '&gt;fatorial&lt;/span&gt;&lt;br /&gt;13:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x4&lt;/span&gt;&lt;br /&gt;14:     &lt;span style='color:#800000; font-weight:bold; '&gt;imul&lt;/span&gt;    &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;15:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;16: &lt;br /&gt;17: &lt;span style='color:#e34adc; '&gt;fim:&lt;/span&gt;&lt;br /&gt;18:     &lt;span style='color:#800000; font-weight:bold; '&gt;pop&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;19:     &lt;span style='color:#800000; font-weight:bold; '&gt;ret&lt;/span&gt;&lt;br /&gt;20: &lt;br /&gt;21: &lt;span style='color:#696969; '&gt;; Programa principal (apenas a parte da chamada da função&lt;/span&gt;&lt;br /&gt;22: &lt;span style='color:#696969; '&gt;; fatorial e do retorno da mesma.)&lt;/span&gt;&lt;br /&gt;23: &lt;br /&gt;24: &lt;span style='color:#e34adc; '&gt;main:&lt;/span&gt;&lt;br /&gt;25:     &lt;span style='color:#696969; '&gt;;  [ebp  - 0x4] ==&gt; Variável I&lt;/span&gt;&lt;br /&gt;26:     &lt;span style='color:#696969; '&gt;;  [ebp  - 0x8] ==&gt; Variável N&lt;/span&gt;&lt;br /&gt;27:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt;    &lt;span style='color:#e34adc; '&gt;fatorial&lt;/span&gt;&lt;br /&gt;28:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x4&lt;/span&gt;&lt;br /&gt;29:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x4&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#000080; '&gt;eax&lt;/span&gt; &lt;span style='color:#696969; '&gt;; Aqui esta o motivo!&lt;/span&gt;&lt;br /&gt;30:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x4&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;31:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt;    &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt; &lt;span style='color:#696969; '&gt;; Efetivamente colocou o valor de EAX na pilha para a função printf!&lt;/span&gt;&lt;br /&gt;32:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;edx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;33:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt;    &lt;span style='color:#000080; '&gt;edx&lt;/span&gt;&lt;br /&gt;34:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt;    &lt;span style='color:#008000; '&gt;0x40cb40&lt;/span&gt;&lt;br /&gt;35:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt;    &lt;span style='color:#e34adc; '&gt;printf&lt;/span&gt;&lt;br /&gt;36:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008000; '&gt;0xc&lt;/span&gt;&lt;br /&gt;37:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;38:     &lt;span style='color:#800000; font-weight:bold; '&gt;pop&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;39:     &lt;span style='color:#800000; font-weight:bold; '&gt;ret&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O código da função fatorial começa na linha 0 (zero) e vai até a linha 19 (instrução &lt;b&gt;ret&lt;/b&gt;). O código do programa principal começa na linha 24&lt;br /&gt;e se extende até a linha 39.&lt;br /&gt;&lt;br /&gt;Na linha 25 temos a chamada à função &lt;b&gt;fatorial&lt;/b&gt; a partir do programa principal (observe que não inclui todo o código assembly do programa principal&lt;br /&gt;por motivos de simplicidade).&lt;br /&gt;&lt;br /&gt;Vamos analisar o código da função &lt;b&gt;fatorial&lt;/b&gt; e, quando pertinente, entrar no código do programa principal. &lt;br /&gt;&lt;br /&gt;Nas linhas 1 e 2 temos o código de prologo padrão de uma chamada de função em &lt;b&gt;c&lt;/b&gt;; na linha 3 temos a comparação&lt;br /&gt;da variável &lt;b&gt;n&lt;/b&gt; com 1; se forem iguais, a instrução &lt;b&gt;jnz&lt;/b&gt; na linha 4 não irá desviar o programa para o ponto &lt;b&gt;proximo_valor&lt;/b&gt;, ou seja,&lt;br /&gt;a execução do programa irá para a linha 5 que atribui 1 ao registrador &lt;b&gt;eax&lt;/b&gt; e retorna para o programa principal.&lt;br /&gt;&lt;br /&gt;Caso &lt;b&gt;n&lt;/b&gt; seja maior que 1 a instrução &lt;b&gt;jnz&lt;/b&gt; na linha 4 desviará a execução do programa para o label &lt;b&gt;proximo_valor&lt;/b&gt; na linha 8; na linha 9&lt;br /&gt;o valor valor de &lt;b&gt;n&lt;/b&gt; é atribuido a &lt;b&gt;eax&lt;/b&gt;, subtraido de 1 na linha 10, colocado na pilha novamente na linha 11 e, finalmente, na linha 12 a função&lt;br /&gt;&lt;b&gt;fatorial&lt;/b&gt; é executada recursivamente. &lt;br /&gt;&lt;br /&gt;O ponto importante aqui é observarmos que o valor do registrador &lt;b&gt;eax&lt;/b&gt; é utilizado como retorno da função &lt;b&gt;fatorial&lt;/b&gt;. Podemos observar isto tanto na linha 5&lt;br /&gt;da função, quanto na linhas 29, 30 e 31 do programa principal (visto que ele passa o valor de &lt;b&gt;eax&lt;/b&gt; para a posição de memória &lt;b&gt;[ebp-0x4]&lt;/b&gt;, ou seja, a variável &lt;b&gt;i&lt;/b&gt;, o que deixa claro que &lt;b&gt;eax&lt;/b&gt; contém&lt;br /&gt;o valor de retorno da função).&lt;br /&gt;&lt;br /&gt;Assim, compreendemos que o programa funciona apenas quando o compilador mantém o resultado da expressão:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt;Created with colorer-take5 library. Type 'c'&lt;br /&gt;&lt;br /&gt;0: n &lt;span style='color:#808030; '&gt;*&lt;/span&gt; fatorial&lt;span style='color:#808030; '&gt;(&lt;/span&gt;n &lt;span style='color:#808030; '&gt;-&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;no registrador &lt;b&gt;eax&lt;/b&gt; como é o caso quando compilamos com o BC++ 3.0 ou VC 7.1 (observe as linhas 15 e 16 do programa assembly):&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt;Created with colorer-take5 library. Type 'asm'&lt;br /&gt;&lt;br /&gt;0: &lt;span style='color:#800000; font-weight:bold; '&gt;imul&lt;/span&gt;    &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;1: &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#008000; '&gt;0x8&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;que armazena o resultado da referida expressão no registrador &lt;b&gt;eax&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Por outro lado observe o código assembly gerado pelo VC 6.0 (usando a linha &lt;b&gt;&lt;i&gt;cl fatorial.c /Fafatorial.vc6.asm&lt;/i&gt;&lt;/b&gt; e editado para simplificar o código):&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt;Created with colorer-take5 library. Type 'asm'&lt;br /&gt;&lt;br /&gt; 0: &lt;span style='color:#e34adc; '&gt;fatorial:&lt;/span&gt;&lt;br /&gt; 1:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt; 2:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;br /&gt; 3:     &lt;span style='color:#800000; font-weight:bold; '&gt;cmp&lt;/span&gt;     &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;br /&gt; 4:     &lt;span style='color:#800000; font-weight:bold; '&gt;jne&lt;/span&gt;     &lt;span style='color:#e34adc; '&gt;proximo_valor&lt;/span&gt;&lt;br /&gt; 5:     &lt;br /&gt; 6:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;br /&gt; 7:     &lt;span style='color:#800000; font-weight:bold; '&gt;jmp&lt;/span&gt;     &lt;span style='color:#e34adc; '&gt;fim&lt;/span&gt;&lt;br /&gt; 8:     &lt;br /&gt; 9: &lt;span style='color:#e34adc; '&gt;proximo_valor:&lt;/span&gt;&lt;br /&gt;10:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;11:     &lt;span style='color:#800000; font-weight:bold; '&gt;sub&lt;/span&gt;     &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;br /&gt;12:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;13:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;_fatorial&lt;/span&gt;&lt;br /&gt;14:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;4&lt;/span&gt;&lt;br /&gt;15:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;16:     &lt;span style='color:#800000; font-weight:bold; '&gt;imul&lt;/span&gt; &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;17:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;br /&gt;18: &lt;br /&gt;19: &lt;span style='color:#e34adc; '&gt;fim:&lt;/span&gt;&lt;br /&gt;20:     &lt;span style='color:#800000; font-weight:bold; '&gt;pop&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;21:     &lt;span style='color:#800000; font-weight:bold; '&gt;ret&lt;/span&gt;     &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;br /&gt;22: &lt;br /&gt;23: &lt;span style='color:#e34adc; '&gt;main:&lt;/span&gt;&lt;br /&gt;24:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;  &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;25:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;26:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;_fatorial&lt;/span&gt;&lt;br /&gt;27:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;  &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;4&lt;/span&gt;&lt;br /&gt;28:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;  &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _i$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;eax&lt;/span&gt;&lt;br /&gt;29:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _i$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;30:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#000080; '&gt;ecx&lt;/span&gt;&lt;br /&gt;31:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;edx&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;DWORD&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;PTR&lt;/span&gt; _n$&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;32:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#000080; '&gt;edx&lt;/span&gt;&lt;br /&gt;33:     &lt;span style='color:#800000; font-weight:bold; '&gt;push&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;OFFSET&lt;/span&gt; &lt;span style='color:#004a43; '&gt;FLAT&lt;/span&gt;&lt;span style='color:#808030; '&gt;:&lt;/span&gt;$SG4&lt;span style='color:#008c00; '&gt;80&lt;/span&gt;&lt;br /&gt;34:     &lt;span style='color:#800000; font-weight:bold; '&gt;call&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;_printf&lt;/span&gt;&lt;br /&gt;35:     &lt;span style='color:#800000; font-weight:bold; '&gt;add&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;12&lt;/span&gt;&lt;br /&gt;36:     &lt;span style='color:#800000; font-weight:bold; '&gt;mov&lt;/span&gt;     &lt;span style='color:#000080; '&gt;esp&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;37:     &lt;span style='color:#800000; font-weight:bold; '&gt;pop&lt;/span&gt;     &lt;span style='color:#000080; '&gt;ebp&lt;/span&gt;&lt;br /&gt;38:     &lt;span style='color:#800000; font-weight:bold; '&gt;ret&lt;/span&gt;     &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Observe que nas linhas 16 e 17 o resultado da expressão&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0); font-family: Courier New,Courier,Monospace; font-size: 14px;"&gt;Created with colorer-take5 library. Type 'c'&lt;br /&gt;&lt;br /&gt;0: n &lt;span style='color:#808030; '&gt;*&lt;/span&gt; fatorial&lt;span style='color:#808030; '&gt;(&lt;/span&gt;n &lt;span style='color:#808030; '&gt;-&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;é armazenado no registrador &lt;b&gt;ecx&lt;/b&gt; ao invés do &lt;b&gt;eax&lt;/b&gt;. Por isso quando compilado no vc6 este programa não funciona!&lt;br /&gt;&lt;br /&gt;Observe que mesmo com os compiladores onde observei que o programa funcionava, qualquer mudança de opção (por exemplo otimização do código gerado) pode fazer com que o programa resultante não funcione.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113948419159722204?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113948419159722204/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113948419159722204' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113948419159722204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113948419159722204'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/02/o-que-esta-errado-com-este-programa_09.html' title='O que esta errado com este programa (parte iv) : Resposta'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113888111545545338</id><published>2006-02-02T09:09:00.000-02:00</published><updated>2006-02-02T11:00:11.476-02:00</updated><title type='text'>O que esta errado com este programa (parte iv)?</title><content type='html'>&lt;span style="font-family: verdana; font-size: 100%"&gt;&lt;br /&gt;Antes de mais nada gostaria de explicar: encontrar o problema não é difícil (mesmo assim não vou dizer agora); o mais interessante&lt;br /&gt;é entender porque o mesmo funciona (ou pelo menos, funciona em alguns compiladores).&lt;br /&gt;&lt;br /&gt;Vi este programa ao corrigir o trabalho de um dos meus alunos (agora sou um ex-professor :) ). Na época compilei&lt;br /&gt;usando o Borlando C++ 3.0 e funcionou! No VC98 o comportamento muda, mas no Visual Studio 2003 o comportamento foi o mesmo do&lt;br /&gt;Borland C++ 3.0; é claro que o compilador emitiu um aviso (warning) o qual foi ignorado prontamente!&lt;br /&gt;&lt;br /&gt;&lt;table style="border-width: 1px; padding: 0px;" border="1" cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr style="border-width: 0px 0px 1px 1px; padding: 4px 6px; background-color: rgb(221, 221, 221);" valign="top"&gt;&lt;td&gt;&lt;span style=";font-size:85%;color:red"&gt;&lt;b&gt;Atenção&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Ignorar avisos (warnings) do compilador não é uma prática saudável e eu não recomendo a ninguém fazê-lo! Pelo contrário; analise todas&lt;br /&gt;as warnings geradas em seu código e entenda o porque o compilador esta reclamando. Não assuma que "o compilador possui bugs" muito menos&lt;br /&gt;tome a postura arrogante de achar que sabe mais que o compilador. Se depois de estudar o motivo da warning você concluir que o código que causou&lt;br /&gt;a warning é legítimo, desabilite a warning específica (via #pragma warning) no trecho de código em questão.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;O programa recebe um número pela linha de comando e, a seguir, chama uma função para calcular o fatorial deste número.&lt;br /&gt;&lt;br /&gt;Bom, vamos ao programa:&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; fatorial&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;n &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;3:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;else&lt;/span&gt;&lt;br /&gt;5:         n &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; n &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt; fatorial&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;n &lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;7:&lt;br /&gt;8: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: rgb(64, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; argc&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;argv&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;9: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;10:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; argc &lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;?&lt;/span&gt; atoi&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;argv&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; i &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; fatorial&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;n&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:   &lt;br /&gt;13:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Farotial(&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;): &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; n&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Depois de algum tempo estudando o mesmo entendi porque ele funcionou (mas só vou contar em um post futuro :)).&lt;br /&gt;&lt;br /&gt;Abraços.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113888111545545338?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113888111545545338/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113888111545545338' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113888111545545338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113888111545545338'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/02/o-que-esta-errado-com-este-programa.html' title='O que esta errado com este programa (parte iv)?'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113872478657154694</id><published>2006-01-31T13:57:00.000-02:00</published><updated>2006-01-31T14:26:26.860-02:00</updated><title type='text'>Oque esta errado com este código (Parte III) : Resposta</title><content type='html'>&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;Este programa apresenta dois erros comuns relacionados ao desenvolvimento de clientes de componentes COM (é isso ai Daniel, você encontrou os dois!):&lt;/span&gt;&lt;br /&gt;&lt;ul  style="color: rgb(0, 0, 102);font-family:verdana;"&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;Utilizar &lt;b&gt;smart pointers&lt;/b&gt; no mesmo escopo em que se chama CoInitialize() e CoUninitialize().&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;Tratamento incorreto quando os métodos selectNodes() / selectSingleNode() não retorna nenhum item.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;O primeiro problema esta relacionado com o fato de que a chamada a &lt;span style="font-weight: bold;"&gt;CoUninitialize()&lt;/span&gt; será realizada antes do destrutor da classe &lt;span style="font-weight: bold;"&gt;CComPtr&lt;/span&gt; (devido ao&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;escopo da variável).&lt;br /&gt;&lt;br /&gt;Quando o destrutor da classe for executado o método &lt;span style="font-weight: bold;"&gt;Release()&lt;/span&gt; da interface será executado resultando provavelmente em uma exceção (Access Violation). &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;Como solucionar este problema? Simples, basta declarar a variável em um bloco interno de forma que o mesmo tenha um escopo que termine antes do &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;escopo da função &lt;span style="font-style: italic;"&gt;main()&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;O segundo problema é que os métodos &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153); font-family: verdana; font-style: italic;"&gt;selectSingleNode()&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt; e &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153); font-family: verdana; font-style: italic;"&gt;selectNodes()&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt; retornam S_FALSE caso o &lt;/span&gt;&lt;b style="color: rgb(51, 51, 153); font-family: verdana;"&gt;XPath&lt;/b&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt; passado não selecione &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt;nenhum nó, ou seja, a expressão da linha 15 será availada como &lt;/span&gt;&lt;b style="color: rgb(51, 51, 153); font-family: verdana;"&gt;true&lt;/b&gt;&lt;span style="color: rgb(51, 51, 153);font-family:verdana;" &gt; mas o smart pointer &lt;span style="font-weight: bold;"&gt;item&lt;/span&gt; estará igual a NULL.&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113872478657154694?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113872478657154694/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113872478657154694' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113872478657154694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113872478657154694'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/oque-esta-errado-com-este-cdigo-parte_31.html' title='Oque esta errado com este código (Parte III) : Resposta'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113806482122915148</id><published>2006-01-23T23:06:00.000-02:00</published><updated>2006-01-23T23:15:38.440-02:00</updated><title type='text'>Oque esta errado com este código (Parte III)</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Dando continuidade a série &lt;span style="font-style: italic;"&gt;"Oque esta errado com este código?"&lt;/span&gt; apresento o terceito artigo.&lt;br /&gt;&lt;br /&gt;Neste post o problema esta relacionado com COM (Component Object Model) e com o MSXML. Na realidade neste exemplo temos dois problemas.&lt;br /&gt;&lt;br /&gt;Prepare suas ferramentas e boa sorte!&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 60%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 5px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:11px;"&gt; 0: &lt;span style='color:#004a43; '&gt;#&lt;/span&gt;&lt;span style='color:#004a43; '&gt;define&lt;/span&gt;&lt;span style='color:#004a43; '&gt; _WIN32_WINNT 0x500&lt;/span&gt;&lt;br /&gt; 1: &lt;br /&gt; 2: &lt;span style='color:#004a43; '&gt;#&lt;/span&gt;&lt;span style='color:#004a43; '&gt;include &lt;/span&gt;&lt;span style='color:#800000; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#40015a; '&gt;windows.h&lt;/span&gt;&lt;span style='color:#800000; '&gt;&gt;&lt;/span&gt;&lt;br /&gt; 3: &lt;span style='color:#004a43; '&gt;#&lt;/span&gt;&lt;span style='color:#004a43; '&gt;include &lt;/span&gt;&lt;span style='color:#800000; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#40015a; '&gt;atlbase.h&lt;/span&gt;&lt;span style='color:#800000; '&gt;&gt;&lt;/span&gt;&lt;br /&gt; 4: &lt;span style='color:#004a43; '&gt;#&lt;/span&gt;&lt;span style='color:#004a43; '&gt;include &lt;/span&gt;&lt;span style='color:#800000; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#40015a; '&gt;atlcom.h&lt;/span&gt;&lt;span style='color:#800000; '&gt;&gt;&lt;/span&gt;&lt;br /&gt; 5: &lt;br /&gt; 6: &lt;span style='color:#004a43; '&gt;#import &lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;msxml3.dll&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#004a43; '&gt; raw_interfaces_only&lt;/span&gt;&lt;br /&gt; 7: &lt;br /&gt; 8: &lt;span style='color:#800000; font-weight:bold; '&gt;void&lt;/span&gt; &lt;span style='color:#400000; '&gt;main&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt; 9: &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;10:     CoInitializeEx&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#7d0045; '&gt;NULL&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; COINIT_MULTITHREADED&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;11:     CComPtr&lt;span style='color:#800080; '&gt;&amp;lt;&lt;/span&gt;MSXML2&lt;span style='color:#800080; '&gt;::&lt;/span&gt;IXMLDOMDocument&lt;span style='color:#800080; '&gt;&gt;&lt;/span&gt; doc&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;12:     &lt;br /&gt;13:     HRESULT hr&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;14:     hr &lt;span style='color:#808030; '&gt;=&lt;/span&gt; doc&lt;span style='color:#808030; '&gt;.&lt;/span&gt;CoCreateInstance&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;__uuidof&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;MSXML2&lt;span style='color:#800080; '&gt;::&lt;/span&gt;DOMDocument30&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;15:     &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;SUCCEEDED&lt;span style='color:#808030; '&gt;(&lt;/span&gt;hr&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;16:     &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;17:         VARIANT_BOOL sucesso&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;18:         hr&lt;span style='color:#808030; '&gt;=&lt;/span&gt;doc&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;load&lt;span style='color:#808030; '&gt;(&lt;/span&gt;CComVariant&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; '&gt;L"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;c:&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\\&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;Teste.xml&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt;sucesso&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;19:         &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;SUCCEEDED&lt;span style='color:#808030; '&gt;(&lt;/span&gt;hr&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt; sucesso &lt;span style='color:#808030; '&gt;!&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; VARIANT_FALSE&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;20:         &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;21:             CComPtr&lt;span style='color:#800080; '&gt;&amp;lt;&lt;/span&gt;MSXML2&lt;span style='color:#800080; '&gt;::&lt;/span&gt;IXMLDOMNode&lt;span style='color:#800080; '&gt;&gt;&lt;/span&gt; item&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;22:             hr &lt;span style='color:#808030; '&gt;=&lt;/span&gt; doc&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;selectSingleNode&lt;span style='color:#808030; '&gt;(&lt;/span&gt;CComBSTR&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; '&gt;L"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;//a/b/c&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt;item&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;23:             &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;SUCCEEDED&lt;span style='color:#808030; '&gt;(&lt;/span&gt;hr&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;24:             &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;25:                 &lt;span style='color:#696969; '&gt;// Faz alguma coisa com o nó apontado por 'item'.&lt;/span&gt;&lt;br /&gt;26:             &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;27:         &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;28:     &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;29:     &lt;br /&gt;30:     CoUninitialize&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;31: &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113806482122915148?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113806482122915148/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113806482122915148' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113806482122915148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113806482122915148'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/oque-esta-errado-com-este-cdigo-parte.html' title='Oque esta errado com este código (Parte III)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113777406634883635</id><published>2006-01-20T14:20:00.000-02:00</published><updated>2006-01-26T14:58:05.476-02:00</updated><title type='text'>O que esta errado com este código (parte II) : Resposta</title><content type='html'>&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;Se você executar o programa em questão verá que o resultado impresso sera:&lt;br /&gt;&lt;br /&gt;N: 1 J: 7&lt;br /&gt;N: 2 J: 6&lt;br /&gt;N: 3 J: 5&lt;br /&gt;N: 4 J: 4&lt;br /&gt;&lt;br /&gt;Certamente esse não era o resultado esperado!&lt;br /&gt;&lt;br /&gt;Olhando mais a fundo você observará que foram impressos itens consecutivos do vetor, no entanto a linha 38 (função &lt;i&gt;printIt()&lt;/i&gt;) avança o índice de dois em dois (ou seja, os itens deveriam ser impressos intercalados)!&lt;br /&gt;&lt;br /&gt;Para entender melhor o problema vamos analiasar a função "&lt;i&gt;printIt()&lt;/i&gt;" (muito simples por sinal).&lt;br /&gt;&lt;br /&gt;Na linha 38 temos um loop de 0 até o n. A cada passo o índice (&lt;i&gt;i&lt;/i&gt;) utilizado para acessar o array é incrementado de dois, ou seja, o primeiro elemento acessado é o de índice 0 (zero), seguido pelos elementos de índice 2, 4 e assim sucessivamente.&lt;br /&gt;&lt;br /&gt;Este acesso se dá através da chamada do método &lt;i&gt;print()&lt;/i&gt; do objeto que se encontra no índice corrente (0, 2, 4, etc) na linha 40:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;&lt;span style="color: rgb(0, 51, 51);"&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;a&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;O problema esta na forma como o compilador gera código para resolver a expressão &lt;i style="font-weight: bold;"&gt;a[i]&lt;/i&gt;. Esta expressão é equivalente a&lt;b&gt; *(a + i)&lt;/b&gt; que nada mais é que aritmética de ponteiros. Bom, a especificação da linguagem determina que esta aritmética deve ser realizada baseada no tamanho do tipo em questão (neste caso o tipo da variável &lt;i style="font-weight: bold;"&gt;a&lt;/i&gt;), ou seja, sendo &lt;i style="font-weight: bold;"&gt;p&lt;/i&gt; um ponteiro igual a 1000, o endereço &lt;i style="font-weight: bold;"&gt;(p+2)&lt;/i&gt; é calculado como &lt;i style="font-weight: bold;"&gt;1000 + 2 * sizeof(*p)&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Se &lt;i style="font-weight: bold;"&gt;p&lt;/i&gt; for um ponteiro para &lt;i style="font-weight: bold;"&gt;char&lt;/i&gt; então &lt;i style="font-weight: bold;"&gt;p+2&lt;/i&gt; será efetivamente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;i style="font-weight: bold;"&gt;1000 + 2 * sizeof(char) =&gt; 1000 + 2 * 1 == 1002&lt;/i&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;&lt;br /&gt;Contudo se &lt;i&gt;&lt;span style="font-weight: bold;"&gt;p&lt;/span&gt; &lt;/i&gt;for um ponteiro para &lt;i style="font-weight: bold;"&gt;int&lt;/i&gt; então &lt;span style="font-weight: bold;"&gt;p+2 &lt;/span&gt;sera:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;span style="font-weight: bold;"&gt;1000 + 2 * sizeof(int) =&gt; 1000 + 2 * 4 =&gt; 1008&lt;/span&gt; (isto em 32 bits).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;&lt;br /&gt;Veja o exemplo abaixo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; v&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;p &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; v&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;      &lt;span style="color: rgb(105, 105, 105);"&gt;// p == &amp;v[0];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;p1 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; p &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(105, 105, 105);"&gt;// p1 == &amp;v[1];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;pc &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; p&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;p1c &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; p1&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Diferença: &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; p1 &lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt; p&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;Agora que você já relembrou como é realizada aritimética de ponteiros, voltemos à nossa expressão:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;&lt;span style="color: rgb(0, 51, 51);"&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;a&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;Como dissemos esta expressão é equivalente à:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;base &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;p &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;&lt;/span&gt;a&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;p&lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;que é equivalente à:      &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:14px;"&gt;base &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;p &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;a &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;p&lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;Já percebeu? Não?&lt;br /&gt;&lt;br /&gt;Imagine que o vetor &lt;span style="font-weight: bold;"&gt;a[]&lt;/span&gt; possua a seguinte configuração na memória:&lt;br /&gt;&lt;br /&gt;        a[0] (1000)&lt;br /&gt;        a[1] (1016)&lt;br /&gt;        a[2] (1032)&lt;br /&gt;        ...   ...&lt;br /&gt;        a[n]&lt;br /&gt;&lt;br /&gt;No diagrama acima observamos que o primeiro elemento de &lt;i style="font-weight: bold;"&gt;a[]&lt;/i&gt;, ou seja, &lt;i style="font-weight: bold;"&gt;a[0]&lt;/i&gt; se encontra no endereço 1000. E &lt;i style="font-weight: bold;"&gt;a[1]&lt;/i&gt;? qual seu endereço?&lt;br /&gt;&lt;br /&gt;Baseado no diagrama acima responderíamos: 1016 é claro!&lt;br /&gt;&lt;br /&gt;O problema é que o compildor não viu este diagrama; então para calcular este endereço o mesmo irá empregar aritmética de ponteiros com as informações que possui  em mãos, ou seja, o endereço inicial de &lt;i style="font-weight: bold;"&gt;a&lt;/i&gt; e seu tipo um&lt;i&gt; vetor&lt;br /&gt;de objetos do tipo &lt;b&gt;base&lt;/b&gt;&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;b&gt;&amp;a[i] == (a + i * sizeof(base))&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;Observe bem a expressão acima!&lt;br /&gt;&lt;br /&gt;O compilador esta considerando o tamanho de &lt;i&gt;"&lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;"&lt;/i&gt; para calcular o deslocamento do elemento de indice &lt;i&gt;"&lt;span style="font-weight: bold;"&gt;i&lt;/span&gt;"&lt;/i&gt; a partir do início do vetor, quando na realidade temos um vetor de objetos &lt;i&gt;"&lt;span style="font-weight: bold;"&gt;derived&lt;/span&gt;"&lt;/i&gt;, ou seja, para funcionar deveríamos tomar &lt;i style="font-weight: bold;"&gt;sizeof(derived)&lt;/i&gt; e não &lt;i style="font-weight: bold;"&gt;sizeof(base)&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Assim,&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;i style="font-weight: bold;"&gt;&amp;a[1]&lt;/i&gt; será (assumindo que o primeiro elemento do vetor "a" se encontra no endereço 1000):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;    &amp;a[1] =&gt; (1000 + 1 * sizeof(base)) =&gt; (1000 + 1 * 8) =&gt; 1008&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 51);font-family:verdana;" &gt;&lt;br /&gt;Opss!! Não deveria ser 1016?&lt;br /&gt;&lt;br /&gt;Então para a função &lt;i&gt;"printIt()"&lt;/i&gt; o vetor 'a' tem a seguinte configuração:&lt;br /&gt;&lt;br /&gt;Visão printIt()     &lt;br /&gt;---------------                        &lt;br /&gt;a[0] (1000)                                  &lt;br /&gt;a[1] (1008)&lt;br /&gt;a[2] (1016)                                  &lt;br /&gt;a[3] (1024)&lt;br /&gt;a[4] (1032)                                  &lt;br /&gt;a[5] (1040)&lt;br /&gt;a[6] (1048)                                  &lt;br /&gt;...   ...                                                      &lt;br /&gt;a[n]               &lt;br /&gt; &lt;br /&gt;Observe que isto ocorre porque &lt;i style="font-weight: bold;"&gt;sizeof(base) * 2 == sizeof(derived)&lt;/i&gt;. Isto não é uma coicidência! Eu escrevi as classes para obter este resultado.&lt;br /&gt;&lt;br /&gt;Na vida real, um erro como este (utilizar um vetor de objetos de forma polimorfica) normalmente causaria exceções de acesso a memória (access violations).&lt;br /&gt;&lt;br /&gt;Quer fazer um teste? É bem simples, basta modificar o código de forma que o índice 'i' seja incrementado de 1 (um) ao invés de 2 (dois). Isto fará com que o programa tente acessar &lt;i style="font-weight: bold;"&gt;&amp;amp;a[1]&lt;/i&gt; que na realidade não é o endereço do segundo elemento do vetor mas sim um endereço no meio do primeiro objeto do vetor.&lt;br /&gt;&lt;br /&gt;Como resolver isto? Simples! Nunca utilize vetores de objetos de forma polimorfica! Utilize um vetor de ponteiros para objetos!&lt;br /&gt;&lt;br /&gt;Espero ter contribuido!&lt;br /&gt;&lt;br /&gt;Adriano&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113777406634883635?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113777406634883635/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113777406634883635' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113777406634883635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113777406634883635'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/o-que-esta-errado-com-este-cdigo-parte_20.html' title='O que esta errado com este código (parte II) : Resposta'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113771964422574389</id><published>2006-01-19T23:07:00.000-02:00</published><updated>2006-01-25T15:08:02.816-02:00</updated><title type='text'>Executando métodos de um objeto JScript a partir de um componente COM</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);font-family:georgia;" &gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Outro dia recebi um email de um amigo perguntando como ele poderia chamar um método de um objeto JScript a partir de um componente COM, ou seja, ele queria fazer um &lt;span style="font-style: italic;"&gt;call back&lt;/span&gt; para o script que havia executado o método em questão.&lt;br /&gt;&lt;br /&gt;No primeiro momento não entendi direito.. achei que não pudesse ser feito; em casa, tomando banho (como sempre ocorre) me veio a solução (ou melhor, eu entendi o problema :). Vamos ao que interessa, o exemplo.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol  style="color: rgb(0, 0, 102);font-family:verdana;"&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;A primeira coisa que temos que entender é que o JScript (da Microsoft) é implementado utilizando-se a &lt;span style="font-style: italic;"&gt;Script Engine&lt;/span&gt; que nada mais é que um &lt;span style="font-style: italic;"&gt;punhado&lt;/span&gt; de componentes COM (ok estou simplificando um pouco as coisas). Assim sendo é natural que objetos em JScript suportem o modelo do COM.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Ótimo, o próximo ponto que devemos ter em mente é que sendo uma linguagem de script também é natural que estes objetos suportem a interface &lt;span style="font-style: italic;"&gt;IDispatch&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Com isto em mente podemos escrever nosso código JScript que deve&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Implementar uma classe&lt;/li&gt;&lt;li&gt;Instanciar um componente COM&lt;/li&gt;&lt;li&gt;Passar, de alguma forma, uma referância do objeto JScript para o componente COM&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Primeiro vamos apresentar o código JScript.&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; MinhaClasse_Teste1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Valor &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; i &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; MinhaClasse_Teste2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;6: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Valor&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; MinhaClasse&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Teste1 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; MinhaClasse_Teste1&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Teste2 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; MinhaClasse_Teste2&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Valor &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;16:&lt;br /&gt;17: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; obj&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18: obj &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; MinhaClasse&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20: obj&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Teste1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21: WScript&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Echo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Valor: "&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;22:                  obj&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Teste2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;23:                  &lt;span style="color: rgb(0, 0, 230);"&gt;" [Antes de ter o callback executado]"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24:&lt;br /&gt;25: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ActiveXObject&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"TestScript.ScriptCallBack"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;26: t&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Callback &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; obj&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;27: t&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;DoSomeAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;40&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28:&lt;br /&gt;29: WScript&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Echo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Valor: "&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;30:                   obj&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Teste2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;31:                   &lt;span style="color: rgb(0, 0, 230);"&gt;" [Depois de executar o objeto COM]"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Nas linhas 10-15 declaramos uma classe (a função &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);font-family:verdana;" &gt;MinhaClasse() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;é tratada como o construtor da classe); dentro do &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);font-family:verdana;" &gt;construtor&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt; adicionamos os métodos/propriedades à classe (através de atribuição).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Pronto! Nossa classe já esta definida! A mesma possui dois métodos (&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);font-family:verdana;" &gt;Teste1() e Teste2()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;) e uma propriedade (&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);font-family:verdana;" &gt;Valor&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Nas linhas 17-23 executamos alguns métodos da classe apenas a título de teste.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Na linha 25 instanciamos o objeto COM que iremos utilizar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Na linha 26 informamos a este objeto qual o objeto deve ser utilizado para realizar o callback (note que o mesmo deve possuir conhecimento prévio da estrutura da classe, ou seja, o objeto COM deve saber o nome do método e número de parâmetros do método a ser executado como &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);font-family:verdana;" &gt;callback&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;Finalmente na linha 27 executamos o método do objeto COM que irá (em algum momento) executar o método do objeto JScript. O método &lt;span style="font-style: italic;"&gt;DoSomeAction()&lt;/span&gt; irá chamar a função &lt;span style="font-style: italic;"&gt;Teste1()&lt;/span&gt; da classe &lt;span style="font-style: italic;"&gt;MinhaClasse()&lt;/span&gt; (JScript).&lt;br /&gt;&lt;br /&gt;Neste ponto finalizamos a parte do script. Agora vamos abordar o componente COM:&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;stdafx.h&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;TestScript.h&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;TestScriptImpl.h&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;3:&lt;br /&gt;4: STDMETHODIMP CScriptCallBack&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;put_Callback&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;IDispatch&lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt; rhs&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;obj&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:         obj&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Release&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10:&lt;br /&gt;11:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;rhs&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:         obj &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; rhs&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; S_OK&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;18:&lt;br /&gt;19: STDMETHODIMP CScriptCallBack&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;DoSomeAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;INT&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;20: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;21:     HRESULT hr &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; E_UNEXPECTED&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;22:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;obj&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;23:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;24:         CComVariant param&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:         hr &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; obj&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Invoke1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;OLESTR&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Teste1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;&lt;/span&gt;param&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;27:&lt;br /&gt;28:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; hr&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Este é um componente típico, sem maiores complicadores. O ponto importante no mesmo é a propriedade &lt;span style="font-style: italic;"&gt;Callback&lt;/span&gt;; a mesma espera um ponteiro para uma interface do tipo &lt;span style="font-style: italic;"&gt;IDispatch&lt;/span&gt; que implemente um método com a seguinte assinatura:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 102, 0);font-family:verdana;" &gt;&lt;span style="font-style: italic;"&gt;Teste1(int n)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 0, 102);font-family:verdana;" &gt;&lt;br /&gt;Quando o método &lt;span style="font-style: italic;"&gt;DoSomeAction()&lt;/span&gt; é executado o mesmo chama o método &lt;span style="font-style: italic;"&gt;Teste1()&lt;/span&gt; do objeto passado para a propriedade &lt;span style="font-style: italic;"&gt;Callback&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Observe que para o componente COM não importa se o objeto apontado pela interface IDispatch em questão é ou não um objeto JScript; tudo que é necessário é que este objeto implemente a interface &lt;span style="font-style: italic;"&gt;IDispatch&lt;/span&gt; e possua o método &lt;span style="font-style: italic;"&gt;Teste1()&lt;/span&gt; com uma assinatura compatível.&lt;br /&gt;&lt;br /&gt;Aproveitando a oportunidade, você consegue ver um problema em potencial neste código? Então fique atento... este será o assunto de um post futuro na série: &lt;span style="font-style: italic;"&gt;"Oque esta errado com este código - parte N" :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Have fun!&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113771964422574389?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113771964422574389/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113771964422574389' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113771964422574389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113771964422574389'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/executando-mtodos-de-um-objeto-jscript.html' title='Executando métodos de um objeto JScript a partir de um componente COM'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113749458815937385</id><published>2006-01-17T08:31:00.000-02:00</published><updated>2006-01-17T08:43:08.196-02:00</updated><title type='text'>O que esta errado com este código (parte II)</title><content type='html'>Este é um pouco mais difícil de entender apenas olhando o código. Para facilitar adianto que o programa deveria imprimir o seguinte:&lt;br /&gt;        - N: 1 J: 7&lt;br /&gt;        - N: 3 J: 5&lt;br /&gt;        - N: 5 J: 3&lt;br /&gt;        - N: 7 J: 1&lt;br /&gt;        &lt;br /&gt;Compile o programa e teste :) (tanto o VC6 quanto o VC7 geram o mesmo resultado)&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;0: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;iostream&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; base&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;5:     base&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;:&lt;/span&gt; n&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:    &lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;10:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;N: &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; n &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:    &lt;br /&gt;14: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;15:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; derived &lt;span style="color: rgb(128, 0, 128);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; base&lt;br /&gt;19: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;20: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;21:     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; x&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; y&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;:&lt;/span&gt; base&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;x&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; j&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;y&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; t&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;22:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;23:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;24:    &lt;br /&gt;25:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;27:         base&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;J: &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; j &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;endl&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; &lt;br /&gt;29:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;30:    &lt;br /&gt;31: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;32:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; j&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;33:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; t&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;34: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;35:&lt;br /&gt;36: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; printIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;base a&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;37: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;38:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; i &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; n&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; i &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;39:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;40:         a&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;i&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;print&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;41:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;42: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;43:&lt;br /&gt;44: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; &lt;span style="color: rgb(64, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;45: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;46:     derived d&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;47:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;7&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;48:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;49:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;50:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;51:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;52:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;53:                     derived&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;7&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;54:                     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;55:                        &lt;br /&gt;56:    &lt;br /&gt;57:     printIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;d&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;d&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;/&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;d&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;58: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113749458815937385?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113749458815937385/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113749458815937385' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113749458815937385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113749458815937385'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/o-que-esta-errado-com-este-cdigo-parte_17.html' title='O que esta errado com este código (parte II)'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113706220808963703</id><published>2006-01-12T08:24:00.000-02:00</published><updated>2006-01-12T09:33:44.613-02:00</updated><title type='text'>O que esta errado com este código (Parte I) : Resposta</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Não fique  frustrado se você não conseguiu identificar o problema (muitos desenvolvedores C++ ainda discutem se realmente o que vou expor representa ou não um problema).&lt;br /&gt;&lt;br /&gt;A questão aqui é que o objeto &lt;span style="font-weight: bold;"&gt;X&lt;/span&gt; sofre de &lt;span style="font-style: italic;"&gt;crise de identidade&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para entender o problema pense em qual o resultado esperado quando executado o programa. Se você me fizesse esta pergunta a algum tempo atraz eu responderia de pronto: &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;"Eu espero que seja impresso a string '&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;[C++] In base constructor I'm &lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;derived'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Para minha surpresa (e de muitos, pode estar certo), quando executado o programa imprime:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-style: italic;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;[C++] In base constructor I'm &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;base&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;'&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Entendeu? Não? Eu explico melhor.&lt;br /&gt;&lt;br /&gt;Uma vez que o &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;método &lt;span style="font-style: italic;"&gt;WhoAmI()&lt;/span&gt; foi definido como virtual os &lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;desenvolvedores esperam&lt;/span&gt; que a chamada a este método no construtor da classe &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;base&lt;/span&gt;&lt;/span&gt; resolva para o método adequado, ou seja, se estivermos instanciando um objeto da classe  &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;base&lt;/span&gt;&lt;/span&gt; o método &lt;span style="font-style: italic;"&gt;WhoAmI()&lt;/span&gt; desta classe deveria ser chamado; se estivermos instanciando um objeto da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;derived&lt;/span&gt;&lt;/span&gt; o método desta classe deveria ser executado. &lt;span style="color: rgb(0, 153, 0);"&gt;Contudo este não é o comportamento observado ao executar o programa&lt;/span&gt;. Na realidade observamos que o método da classe  &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;&lt;/span&gt; será executado, não importa se estamos instanciando um objeto desta classe ou de uma subclasse (por exemplo a classe &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;derived&lt;/span&gt;&lt;/span&gt;). Faça o teste.&lt;br /&gt;&lt;br /&gt;Neste momento tenho certeza que já tem alguém dizendo: &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;"Mas que estúpido! Porque não implementam isto de forma correta?" &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos tentar analisar: O padrão C++ dita que um objeto deve ter os construtores de suas classes executados da &lt;span style="font-style: italic;"&gt;classe mais base&lt;/span&gt; para a &lt;span style="font-style: italic;"&gt;classe mais derivada&lt;/span&gt;; neste exemplo, quando o objeto &lt;span style="font-weight: bold;"&gt;x&lt;/span&gt; for instanciado os construtores serão executados na ordem:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;base --&gt; derived&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;ou seja,  o construtor da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;&lt;/span&gt; será executado primeiro, depois o construtor da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;derived&lt;/span&gt;&lt;/span&gt; será executado. Neste ponto surge o problema de &lt;span style="font-style: italic;"&gt;"crise de identidade"&lt;/span&gt; do objeto &lt;span style="font-weight: bold;"&gt;x&lt;/span&gt;. A maioria dos compiladores implementa  métodos virtuais através do conceito de &lt;span style="font-weight: bold;"&gt;vtables&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;(para ser sincero não conheço nenhum que não utilize esta técnica).&lt;br /&gt;&lt;br /&gt;[&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;você não sabe o que é uma &lt;span style="font-weight: bold;"&gt;vtable&lt;/span&gt;? Vou emprestar uma frase feminina milenar:&lt;br /&gt;&lt;br /&gt;"se você não sabe o que é uma vtable não sou eu quem vou lhe dizer";&lt;br /&gt;&lt;br /&gt;brincadeira a parte, este é um assunto para outro post].&lt;br /&gt;&lt;br /&gt;O problema é que neste ponto o (construtor da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;&lt;/span&gt;) o construtor da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;derived&lt;/span&gt;&lt;/span&gt; ainda não foi executado e, assim sendo, a entrada do método  &lt;span style="font-style: italic;"&gt;WhoAmI()&lt;/span&gt; na vtable do objeto &lt;span style="font-weight: bold;"&gt;x&lt;/span&gt; ainda aponta para o método da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Somente após a execução do construtor da classe &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;derived&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;é que a vtable será corrida, ou seja, chamadas ao método &lt;span style="font-style: italic;"&gt;WhoAmI()&lt;/span&gt; serão direcionados ao método desta classe ao invés da classe &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;base&lt;/span&gt;&lt;/span&gt;. Faça um teste; simplesmente adicione a linha abaixo à função &lt;span style="font-style: italic;"&gt;main()&lt;/span&gt; do programa de exemplo:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;x.WhoAmI();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Observe que será impresso &lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;derived&lt;/span&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;, ou seja, neste ponto a vtable do objeto &lt;span style="font-weight: bold;"&gt;x&lt;/span&gt; já esta correta.&lt;br /&gt;&lt;br /&gt;Isto occorre porque objetos &lt;span style="font-style: italic;"&gt;nascem&lt;/span&gt; como objetos da classe mais base e vão &lt;span style="font-style: italic;"&gt;amadurecendo&lt;/span&gt;, tomando a identidade de cada uma das classes base deste objeto, a medida que seus respectivos construtores vão sendo executados.&lt;br /&gt;&lt;br /&gt;Observe que este comportamento não é decorrente de limitações tecnologicas mas sim de uma descisão consciente para previnir problemas; imagine qual seria o resultado de executar um método virtual de uma classe cujo construtor ainda não tenha sido executado (sim, a ordem de execução dos construtores não pode ser modificada). Neste exemplo não teriamos problema algum, contudo, em qualquer classe &lt;span style="font-style: italic;"&gt;útil&lt;/span&gt;, possivelmente teríamos variáveis não inicializadas sendo utilizadas (isto realmente não é o comportamento que você deseja pode ter certeza).&lt;br /&gt;&lt;br /&gt;Inclusive em algumas linguagens (por exemplo C#) objetos não sofrem desta &lt;span style="font-style: italic;"&gt;crise de identidade&lt;/span&gt; mas por outro lado podem acessar variáveis não inicializadas se não forem corretamente implementados.&lt;br /&gt;&lt;br /&gt;Espero ter sido claro.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113706220808963703?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113706220808963703/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113706220808963703' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113706220808963703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113706220808963703'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2006/01/o-que-esta-errado-com-este-cdigo-parte.html' title='O que esta errado com este código (Parte I) : Resposta'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113525592505706018</id><published>2005-12-22T10:45:00.000-02:00</published><updated>2006-01-12T08:05:15.476-02:00</updated><title type='text'>O que esta errado com este código (Parte I) ?</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Antes de mais nada, eu sei, esta não é uma idéia muito original, mas eu acredito que seja uma forma bastante eficiente de apresentar tópicos de interesse e de chamar a atenção; então vamos lá, esta é relativamente simples.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt; 0: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;iostream&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; base&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;5:     base&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;[C++] In 'base' constructor I'm: &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:         WhoAmI&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10:   &lt;br /&gt;11:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;~&lt;/span&gt;base&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;[C++] In 'base' destructor I'm: &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:         WhoAmI&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;16:   &lt;br /&gt;17:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; WhoAmI&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;const&lt;/span&gt;&lt;br /&gt;18:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;19:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;base&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;endl&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;22:&lt;br /&gt;23: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; derived &lt;span style="color: rgb(128, 0, 128);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; base&lt;br /&gt;24: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;25: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; WhoAmI&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;const&lt;/span&gt;&lt;br /&gt;27:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;28:         &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(96, 48, 0);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;derived&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(102, 102, 22);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;::&lt;/span&gt;endl&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;30: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;31:&lt;br /&gt;32: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; &lt;span style="color: rgb(64, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;33: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;34:     derived x&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;35: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;No próximo post dou a resposta.&lt;br /&gt;&lt;br /&gt;[Editado dia 12/01/2006: Incluí "Parte I" no título]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113525592505706018?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113525592505706018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113525592505706018' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113525592505706018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113525592505706018'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/12/o-que-esta-errado-com-este-cdigo-parte.html' title='O que esta errado com este código (Parte I) ?'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113268595337250451</id><published>2005-11-22T16:58:00.000-02:00</published><updated>2005-11-22T16:59:13.386-02:00</updated><title type='text'>Livros</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-family:verdana;"&gt;Hoje vou postar apenas &lt;a href="http://www.amazon.com/gp/registry/registry.html/ref=wlem-si-html_viewall/104-9547256-5032718?id=333WJE16FP06F"&gt;este link&lt;/a&gt; para uma lista de livros de programação/informática que acho bem interessante.&lt;br /&gt;&lt;br /&gt;Antes que alguém pergunte, sim, eu já li a maioria dos livros que estão na lista (para falar a verdade tem 3 que ainda não li; dois eu pretendo comprar e 1 ainda não foi publicado).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113268595337250451?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113268595337250451/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113268595337250451' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113268595337250451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113268595337250451'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/11/livros.html' title='Livros'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113164198245005891</id><published>2005-11-10T14:40:00.000-02:00</published><updated>2005-11-10T15:02:27.650-02:00</updated><title type='text'>Diferenças entre Generics X Templates C++</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Neste post vou abordar as principais diferenças entre generics e templates (gostaria de reafirmar que o assunto é muito extenso e que não tenho a pretenção de abordá-lo em profundidade. Assim se você deseja aprender mais visite o site da Microsoft e/ou outros sites).&lt;br /&gt;&lt;br /&gt;Assim, se você não conhece C++ pode ignorar este post. Também gostaria de lembrar que além dos pontos aqui abordados temos a questão da integração Generics X Templates quando desenvolvemos em Managed C++, mas isto é um outro assunto.&lt;br /&gt;&lt;br /&gt;Bom, vamos começar pelas diferenças que vem melhorar a utilização de Generics em relação à templates: code bloating. Code Bloating é o efeito resultante da instanciação de um mesmo template para vários tipos de dados. Por exemplo, imagine o seguinte template em C++:&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;stdio.h&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;template&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;typename&lt;/span&gt; T&lt;span style="color: rgb(128, 0, 128);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; MyTestTemplate&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;6:     MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T t&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:         data_ &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; t&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10:&lt;br /&gt;11:     T GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; data_&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="color: rgb(227, 74, 220);"&gt;:&lt;/span&gt;&lt;br /&gt;17:     T data_&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;struct&lt;/span&gt; TestStruct&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;22:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n1&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;23:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;str&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:&lt;br /&gt;26: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; &lt;span style="color: rgb(64, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;27: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;28:     MyTestTemplate&lt;span style="color: rgb(128, 0, 128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&gt;&lt;/span&gt; a&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;          printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;int   : &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; a&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29:     MyTestTemplate&lt;span style="color: rgb(128, 0, 128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&gt;&lt;/span&gt; b&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;'A'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;        printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;char  : &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%c&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; b&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;30:     MyTestTemplate&lt;span style="color: rgb(128, 0, 128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;double&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&gt;&lt;/span&gt; c&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;1.2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;      printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;double: &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%f&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; c&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;31:                                  &lt;br /&gt;32:     TestStruct t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Adriano&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;33:     MyTestTemplate&lt;span style="color: rgb(128, 0, 128);"&gt;&amp;lt;&lt;/span&gt;TestStruct&lt;span style="color: rgb(128, 0, 128);"&gt;&gt;&lt;/span&gt; d&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;t&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;    printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;struct: &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt; &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; d&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;n1&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; d&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;str&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;34: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Uau! Isto não é nenhuma obra prima mas serve para nosso propósito! :).&lt;br /&gt;&lt;br /&gt;No exemplo acima estamos instanciando o template &lt;span style="font-weight: bold;"&gt;MyTestTemplate&lt;/span&gt; 4 vezes (um para o tipo de dado int, um para char, um para double e um para TestStruct).&lt;br /&gt;&lt;br /&gt;Neste exemplo o compilador irá gerar quatro cópias do código fonte, uma para cada tipo instanciado. De uma forma bastante simplista podemos dizer que o código fonte resultante é equivalente ao gerado se escrevessemos algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(64, 1, 90);"&gt;stdio.h&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(0, 74, 67);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;define&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; DEFINE_TEST_CLASS&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;TYPE&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;               \&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(0, 74, 67);"&gt;class MyTestTemplate_&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;TYPE                   \&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 128, 48);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                             \&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(0, 74, 67);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                       \&lt;/span&gt;&lt;br /&gt;6: &lt;span style="color: rgb(0, 74, 67);"&gt;    MyTestTemplate_&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;#&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;TYPE&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;TYPE t&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;             \&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(0, 74, 67);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                         \&lt;/span&gt;&lt;br /&gt;8: &lt;span style="color: rgb(0, 74, 67);"&gt;        data_ &lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; t&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                            \&lt;/span&gt;&lt;br /&gt;9: &lt;span style="color: rgb(0, 74, 67);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                         \&lt;/span&gt;&lt;br /&gt;10: &lt;span style="color: rgb(0, 74, 67);"&gt;                                             \&lt;/span&gt;&lt;br /&gt;11: &lt;span style="color: rgb(0, 74, 67);"&gt;    TYPE GetIt&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                             \&lt;/span&gt;&lt;br /&gt;12: &lt;span style="color: rgb(0, 74, 67);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                        \&lt;/span&gt;&lt;br /&gt;13: &lt;span style="color: rgb(0, 74, 67);"&gt;        return data_&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                        \&lt;/span&gt;&lt;br /&gt;14: &lt;span style="color: rgb(0, 74, 67);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                        \&lt;/span&gt;&lt;br /&gt;15: &lt;span style="color: rgb(0, 74, 67);"&gt;                                             \&lt;/span&gt;&lt;br /&gt;16: &lt;span style="color: rgb(0, 74, 67);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                                     \&lt;/span&gt;&lt;br /&gt;17: &lt;span style="color: rgb(0, 74, 67);"&gt;    TYPE data_&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;                              \&lt;/span&gt;&lt;br /&gt;18: &lt;span style="color: rgb(128, 128, 48);"&gt;}&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;struct&lt;/span&gt; TestStruct&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;22:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; n1&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;23:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;*&lt;/span&gt;str&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:&lt;br /&gt;26: DEFINE_TEST_CLASS&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;27: DEFINE_TEST_CLASS&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;char&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28: DEFINE_TEST_CLASS&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;double&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29: DEFINE_TEST_CLASS&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;TestStruct&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;30:&lt;br /&gt;31: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; &lt;span style="color: rgb(64, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;32: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;33:     MyTestTemplate_int a&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;       printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;int   : &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; a&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;34:     MyTestTemplate_char b&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;'A'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;     printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;char  : &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%c&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; b&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;35:     MyTestTemplate_double c&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;1.2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;   printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;double: &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%f&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; c&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;36:&lt;br /&gt;37:     TestStruct t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Adriano&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;38:     MyTestTemplate_TestStruct d&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;t&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; printf&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;struct: &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt; &lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\r&lt;/span&gt;&lt;span style="color: rgb(15, 105, 255);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; d&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;n1&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; d&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;str&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;39: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note que o processo de instanciação de templates não é simples assim (ou seja, não é apenas substituição de texto) mas para fins de análise de tamanho do código gerado podemos entender desta forma.&lt;br /&gt;&lt;br /&gt;Agora ficou claro! Estamos criando 4 cópias do mesmo trecho de código.&lt;br /&gt;&lt;br /&gt;Já com Generics este problema não existe quando utilizado com tipos &lt;span style="font-style: italic;"&gt;referência (reference types)&lt;/span&gt; e é minimizado em muito quando uitilzados com &lt;span style="font-style: italic;"&gt;tipos valores (value types)&lt;/span&gt;. Para ser mais preciso, o compilador gera uma versão especializada do tipo generic para cada &lt;span style="font-style: italic;"&gt;value type&lt;/span&gt; com o qual seja instanciado e apenas uma versão comum a todos os tipos referência utilizados. Assim, no exemplo abaixo (C#):&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T t&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;3:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:         data_ &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; t&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;6:&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; T GetIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;8:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;9:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; data_&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;11:&lt;br /&gt;12:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; T data_&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14:&lt;br /&gt;15: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; Test &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;16: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; Test_1 &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; MyTestTemplateDriver&lt;br /&gt;19: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Main&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;21:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;22:         MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; a &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;23:         MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;double&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; b &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;double&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;20.0&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24:         MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;Test&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; c &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;Test&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Test&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:         MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;Test_1&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; d &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; MyTestTemplate&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;Test_1&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Test_1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;27: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;o compilador irá gerar três versões da classe MyTestTemplate() (uma para &lt;span style="font-style: italic;"&gt;int&lt;/span&gt;, uma para &lt;span style="font-style: italic;"&gt;double&lt;/span&gt; e uma para tipos referência) ao invés de quatro. Quando aplicado a código de programas de verdade isto pode representar uma diminuição significativa no tamanho do mesmo.&lt;br /&gt;&lt;br /&gt;As demais diferenças entre os dois conceitos podem ser resumidas como:&lt;br /&gt;&lt;br /&gt;- Generics, proprositadamente, não apresentam o mesmo grau de flexibilidade/complexidade que templates em C++.&lt;br /&gt;&lt;br /&gt;Por exemplo, não é possível utilizar um &lt;span style="font-style: italic;"&gt;type parameter&lt;/span&gt; como uma classe base do tipo genérico, ou seja, o exemplo abaixo não é válido:&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TypeParameterAsBaseClass&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt; T&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Generics não suporta &lt;span style="font-style: italic;"&gt;type parameters&lt;/span&gt; que não sejam tipos&lt;br /&gt;&lt;br /&gt;Por exemplo a classe abaixo não é válida em C#:&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; NonType_TypeParameter&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Main&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;3:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:         NonType_TypeParameter&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;100&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; NonType_TypeParameter&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;100&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:         t&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;PrintIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;7:&lt;br /&gt;8:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; PrintIt&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;10:         System&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Console&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;WriteLine&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;{0}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;12: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Além destas diferenças, podemos citar também a falta de suporte a &lt;span style="font-style: italic;"&gt;especialização (total/parcial)&lt;/span&gt; do tipos genéricos. Basicamente estas são as principais diferenças entre templates em C++ e generics no .Net.&lt;br /&gt;&lt;br /&gt;Este post encerra nossa discussão sobre generics!&lt;br /&gt;&lt;br /&gt;Até a próxima :)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113164198245005891?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113164198245005891/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113164198245005891' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113164198245005891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113164198245005891'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/11/diferenas-entre-generics-x-templates-c.html' title='Diferenças entre Generics X Templates C++'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113077455291975232</id><published>2005-10-31T13:32:00.000-02:00</published><updated>2005-10-31T17:24:21.400-02:00</updated><title type='text'>Generics III - Constrains</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Como prometi hoje vou falar um pouco sobre como utilizar o esquema de generics de uma forma mais eficaz.&lt;br /&gt;&lt;br /&gt;Um dos problemas de templates em C++ é que, apesar do esforço do compilador, existem situações que o mesmo não detecta determinado tipo de erros, os quais, serão detectados apenas em tempo de execução.&lt;br /&gt;&lt;br /&gt;Bom, para não ficar muito abstrato vamos apresentar um exemplo em C# mesmo (assim deixamos claro que podemos escrever código "não ideal" em qualquer linguagem):&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T data&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;5:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;10:    &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:         Test&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;data&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:    &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Test&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T o&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; T other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;15:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;16:         IComparable comp &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;IComparable&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; o&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:         Console&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;WriteLine&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;comp&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;CompareTo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; T data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;22:&lt;br /&gt;23: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; B&lt;br /&gt;24: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;25:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; B&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;27:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;29:&lt;br /&gt;30:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;31: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;32:&lt;br /&gt;33: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestConstrainsDriver&lt;br /&gt;34: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;35:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Main&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;36:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;37:         TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; tc &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;38:         tc&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;39:&lt;br /&gt;40:         TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;B&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; tcb &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;B&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; B&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;41:         tcb&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; B&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;42:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;43: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Neste exemplo a classe TestConstrains recebe em seu construtor um objeto do tipo T. Depois, no método TakeSomeBadAction() o mesmo executa o método Test().&lt;br /&gt;&lt;br /&gt;Da forma como esta, o compilador ficará feliz em compilar este código, contudo em tempo de execução este programa gerará uma exceção do tipo &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsysteminvalidcastexceptionclasstopic.asp"&gt;InvalidCastException&lt;/a&gt; (você é capaz de dizer quais os pontos envolvidos neste problema sem compilar/executar o programa?).&lt;br /&gt;&lt;br /&gt;O problema todo ocorre porque os compiladores não realizam análide de fluxo de código tão extensivamente para determinar o tipo de uma variável em todos os pontos de um programa (isto envolveria muito overhead).&lt;br /&gt;&lt;br /&gt;Explico melhor: Neste programa ridiculamente pequeno o compilador poderia manter informações a respeito do tipo da variável utilizada para chamar o método TakeSomeBadAction() e assim verificar se este tipo suporta ou não a interface IComparable e emitir um erro em caso negativo.&lt;br /&gt;&lt;br /&gt;Simples assim, correto? Talvez em um programa como este sim, mas não para a maioria dos programas "sérios"; confie em mim, você não iria querer esperar 3 horas para seu código (não tão extenso assim) compilar (talvez com a melhoria na performance dos computadores e a evolução da tecnologia, um dia teremos compiladores que analisam o fluxo do código mais agressivamente).&lt;br /&gt;&lt;br /&gt;Para aliviar este problema, o framework permite que restrinjamos os possíveis tipos para um &lt;span style="font-style: italic;"&gt;type argument&lt;/span&gt;. Para tanto utilizamos a sintaxe:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;pre style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-style: italic; font-weight: bold;"&gt;C where (restrição aqui)&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Basicamente o framework suporta 5 tipo de restrições (constrains): &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;) o tipo dever ser uma classe, &lt;span style="font-style: italic;"&gt;ii&lt;/span&gt;) o tipo deve ser uma estrutura, &lt;span style="font-style: italic;"&gt;iii&lt;/span&gt;) o tipo deve implementar (direta ou indiretamente) uma interface, &lt;span style="font-style: italic;"&gt;iv&lt;/span&gt;) o tipo deve derivar (direta ou indiretamente) de uma classe, &lt;span style="font-style: italic;"&gt;v&lt;/span&gt;) o tipo deve possuir um construtor (público) sem parâmetros. Não vou repetir aqui a explicação de como cada restrição funciona (vou usar o princípio &lt;a href="http://c2.com/cgi/wiki?DontRepeatYourself"&gt;DRY&lt;/a&gt;; para maiores informações consulte a &lt;a href="http://msdn2.microsoft.com/en-us/library/d5x73970%28en-US,VS.80%29.aspx"&gt;documentação da Microsoft&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Para exemplificar melhor vamos utilizar o item &lt;span style="font-style: italic;"&gt;iii&lt;/span&gt; (tipo deve implementar uma interface) para restringir &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt; a tipos que implementem a interface &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemicomparableclasstopic.asp"&gt;IComparable&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; where T &lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt; IComparable&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T data&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;5:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;10:    &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:         Test&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;data&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:    &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Test&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;object&lt;/span&gt; o&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;object&lt;/span&gt; other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;15:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;16:         IComparable comp &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;IComparable&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; o&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:         Console&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;WriteLine&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;comp&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;CompareTo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;other&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; T data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;22:&lt;br /&gt;23: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; B&lt;br /&gt;24: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;25:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; B&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;26:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;27:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;29:&lt;br /&gt;30:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;31: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;32:&lt;br /&gt;33: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; C &lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt; IComparable&lt;br /&gt;34: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;35:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; C&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;36:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;37:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;38:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;39:&lt;br /&gt;40:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; CompareTo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;object&lt;/span&gt; o&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;41:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;42:         C other &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; o &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;as&lt;/span&gt; C&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;43:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;other &lt;span style="color: rgb(128, 128, 48);"&gt;!&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;44:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;45:             &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; data &lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt; other&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;46:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;47:    &lt;br /&gt;48:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;49:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;50:&lt;br /&gt;51:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;52: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;53:&lt;br /&gt;54: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestConstrainsDriver&lt;br /&gt;55: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;56:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Main&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;57:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;58:         TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; tc &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;59:         tc&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(105, 105, 105);"&gt;// Ok, Funciona corretamente...&lt;/span&gt;&lt;br /&gt;60:    &lt;br /&gt;61:         &lt;span style="color: rgb(105, 105, 105);"&gt;//TestConstrains&amp;lt;B&gt; tcb = new TestConstrains&amp;lt;B&gt;(new B(10));&lt;/span&gt;&lt;br /&gt;62:         &lt;span style="color: rgb(105, 105, 105);"&gt;//tcb.TakeSomeBadAction(new B(10));  //oopsss Classe 'B' não suporta a interface IComparable&lt;/span&gt;&lt;br /&gt;63:    &lt;br /&gt;64:         TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;C&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; tcc &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestConstrains&lt;span style="color: rgb(128, 128, 48);"&gt;&amp;lt;&lt;/span&gt;C&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; C&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;65:         tcc&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;TakeSomeBadAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; C&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;66:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;67: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Agora tente remover os comentários das linhas 61 e 62 e compilar! Perfeito, agora o compilador emite um erro nos avisando que o tipo B não implementa a interface IComparable!&lt;br /&gt;&lt;br /&gt;Além de tornar nosso código mais seguro a utilização de restrições também ajudam a documentar o código.&lt;br /&gt;&lt;br /&gt;Bom, espero ter acrescentado informações úteis a seu conhecimento :)&lt;br /&gt;&lt;br /&gt;Adriano&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113077455291975232?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113077455291975232/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113077455291975232' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113077455291975232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113077455291975232'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/10/generics-iii-constrains.html' title='Generics III - Constrains'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113049824958501298</id><published>2005-10-28T09:14:00.000-02:00</published><updated>2005-10-28T09:17:29.596-02:00</updated><title type='text'>Versão final do .Net Framework II liberada</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: verdana;"&gt;A microsoft acabou de liberar a versão &lt;a href="http://msdn.microsoft.com/netframework/downloads/updates/default.aspx"&gt;2.0 do .Net Framework (e o sdk)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mas esteja preparado para baixar aproximadamente 400 Mb entre o Framework e o SDK.&lt;br /&gt;&lt;br /&gt;Adriano&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113049824958501298?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113049824958501298/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113049824958501298' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113049824958501298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113049824958501298'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/10/verso-final-do-net-framework-ii.html' title='Versão final do .Net Framework II liberada'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113036882620849301</id><published>2005-10-26T21:07:00.000-02:00</published><updated>2005-10-26T21:20:26.216-02:00</updated><title type='text'>Formatando código fonte no Blogger!</title><content type='html'>&lt;span style="color: rgb(102, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:verdana;"&gt;Boa noite.&lt;br /&gt;&lt;br /&gt;Este post será bastante resumido (e esta relacionado indiretamente com os anteriores sobre C#/.Net Framework).&lt;br /&gt;&lt;br /&gt;Desde meus primeiros posts com código fonte eu me senti frustrado por não conseguir formatar o código de uma forma que me agradasse (bast olhar alguns dos referidos posts).&lt;br /&gt;&lt;br /&gt;Contudo eu estava decidido a encontrar alguma solução; já havia tentado utilizar algum formatador do tipo c#2html mas o resultado não era satisfatório; depois de procurar bastante encontrei em um blog uma referência a este assunto.&lt;br /&gt;&lt;br /&gt;O mesmo sugiria a utilização de um formatador chamado &lt;a href="http://colorer.sourceforge.net/"&gt;colorer&lt;/a&gt;; após alguns testes consegui o resultado esperado.&lt;br /&gt;&lt;br /&gt;Para postar código formatado:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:verdana;"&gt;baixe o &lt;a href="http://colorer.sourceforge.net/"&gt;colorer&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:verdana;"&gt;Execute o mesmo informando o programa fonte desejado&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(102, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:verdana;"&gt;adicione em seu post (editando em html) as seguintes linhas:&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;    seu código formatado aqui&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;    &lt;/ul&gt; &lt;span style="color: rgb(102, 0, 0);"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Pronto! Nem parece que é tão simples assim. Na realidade a única coisa que temos que fazer é acrescentar a tag &lt;span style="font-weight: bold;"&gt;pre&lt;/span&gt; ao resultado do colorer.&lt;br /&gt;&lt;br /&gt;Adriano&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113036882620849301?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113036882620849301/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113036882620849301' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113036882620849301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113036882620849301'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/10/formatando-cdigo-fonte-no-blogger.html' title='Formatando código fonte no Blogger!'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-113024004200984907</id><published>2005-10-25T09:34:00.000-02:00</published><updated>2005-10-26T00:54:21.993-02:00</updated><title type='text'>Generics II</title><content type='html'>&lt;span style=";font-family:Verdana,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;No &lt;a href="http://accessviolation.blogspot.com/2005/10/como-comentei-neste-post-pretendo.html"&gt;post anterior&lt;/a&gt; discuti um pouco sobre Generics; apresentei alguns problemas e como os mesmos são resolvidos/atenuados com a utilização deste conceito.&lt;br /&gt;&lt;br /&gt;De uma forma mais ampla, podemos usar o conceito de &lt;b&gt;generics&lt;/b&gt; quando uma classe/algoritmo pode ser aplicado a mais de um tipo de dados, ou seja, esta classe/algoritmo é independente do tipo de dado em questão; ao invés de criar várias versões da mesma classe (uma para cada tipo de dado desejado), criamos uma &lt;b&gt;classe genérica&lt;/b&gt; e deixamos o compilador (no caso do .Net o compilador/Framework) trabalhar por nós.&lt;br /&gt;&lt;br /&gt;O exemplo apresentado no post anterior é um caso clássico: em um programa podemos ter a necessidade de armazenar coleções de diversos tipos de dados diferentes; uma solução é implementar classes que armazenam tipos de dados específicos, contudo esta, geralmente, não é uma boa solução, visto que teremos duplicação de código, trabalho, etc. Uma segunda alternativa é a solução adotada até a versão 1.1 do .Net Framework, ou seja, escrever coleções de dados que manipulam o tipo de dado base (no .Net &lt;b&gt;Object&lt;/b&gt;); pelas razões discutidas no post anterior (entre outras) esta também não é uma solução muito atraente; uma terceita alternativa seria mesclar as duas primeiras, ou seja, ter uma implementação da coleção que aceita a classe &lt;b&gt;Object&lt;/b&gt; e escrever versões mais especializadas que utilizam esta implementação (melhorou bastante mas ainda temos que escrever e dar manutenção nas versões específicas). &lt;b&gt;Generics&lt;/b&gt; nos permite escrever classes/algorítmos sem nos preocuparmos com o tipo de dado manipulado; para ser mais preciso manipulamos um tipo de dado que sera especificado pelo usuário do nosso código.&lt;br /&gt;&lt;br /&gt;Assim, um tipo &lt;b&gt;genérico&lt;/b&gt; (por exemplo a classe List&amp;lt;T&amp;gt; do namespace &lt;b&gt;System.Collections.Generic&lt;/b&gt;) representa apenas um &lt;i&gt;modelo&lt;/i&gt;, ou seja, não podemos criar instâncias deste tipo. Por exemplo o seguinte código não compila:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div  style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0);font-family:Courier New,Courier,Monospace;"&gt;&lt;span style=";font-family:Verdana,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;IList list = new System.Collections.Generic.List();&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Se você tentar compilar este trecho de código em um programa C# o compilador emitirá um erro semelhante a:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=";font-family:'Courier New',Courier,monospace;font-size:85%;"  &gt;TestGenericCollections.cs(9,3): error CS0305: Using the generic type 'System.Collections.Generic.List&amp;lt;T&amp;gt;' requires '1' type arguments&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Este erro nos informa que o tipo &lt;b&gt;List&lt;/b&gt; requer um &lt;b&gt;type parameter&lt;/b&gt;, que nada mais é que um tipo de dados que será aplicado ao tipo genérico. Em outras palavras o compilador não tem como decidir se desejamos uma lista de bananas, nomes, idades, etc. Este dado (o tipo de lista que desejamos) deve ser informado ao compilador utilizando o &lt;b&gt;type parameter&lt;/b&gt; &lt;i&gt;T&lt;/i&gt;. Assim, para que o exemplo compile temos que dizer ao compilador qual é este tipo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;IList&amp;lt;string&amp;gt; list = new System.Collections.Generic.List&amp;lt;string&amp;gt;();&lt;/pre&gt; &lt;span style="font-size:85%;"&gt;&lt;string&gt;&lt;string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Neste exemplo dizemos que o tipo &lt;b&gt;String&lt;/b&gt; é um &lt;b&gt;type parameter&lt;/b&gt;, ou seja, especifica o tipo que o compilador deve utilizar toda vez que &lt;b&gt;T&lt;/b&gt; aparecer como um tipo na classe &lt;b&gt;List&lt;t&gt;&lt;/t&gt;&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;Um tipo &lt;b&gt;generic&lt;/b&gt; deve possuir um ou mais &lt;b&gt;type parameters&lt;/b&gt; que devem ser substuídos por tipos específicos no momento do uso do mesmo. Acho que aqui vale um exemplo:&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;using&lt;/span&gt; System&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;5:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:         data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; i&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; T Data&lt;br /&gt;10:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:         get&lt;br /&gt;12:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:             &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16:         set&lt;br /&gt;17:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;18:             data &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; value&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;21:&lt;br /&gt;22:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;string&lt;/span&gt; Name&lt;br /&gt;23:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;24:         get&lt;br /&gt;25:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;26:             &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; name&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;27:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;28:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;29:&lt;br /&gt;30:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; String name&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;31:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; T data&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;32: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;33:&lt;br /&gt;34: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestGenericDriver&lt;br /&gt;35: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;36:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;void&lt;/span&gt; Main&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;37:     &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;38:         TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Adriano&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;39:         Type tt &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; t&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetType&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;40:&lt;br /&gt;41:         Type&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt; defparams &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; tt&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;GetGenericArguments&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;42:         &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;Type tp &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;in&lt;/span&gt; defparams&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;43:         &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;44:             Console&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;WriteLine&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;\r\nType parameter: {0}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; tp&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;Name&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;45:         &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;46:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;47: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Neste exemplo definimos um tipo genérico (&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;TestGeneric&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;) que espera um &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;font-size:85%;"  &gt;Type Parameter&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;T&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;) (Linha 2). Este tipo declara uma variável de instância &lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;data&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; (Linha 31) do tipo &lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;T&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; e também uma propriedade &lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;Data&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; (Linha 9). Na linha 38 criamos uma instância da classe &lt;span style="font-weight: bold;"&gt;TestGeneric&lt;/span&gt; usando &lt;span style="font-weight: bold;"&gt;string&lt;/span&gt; como tipo para &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;, ou seja, tanto a variável de instância &lt;span style="font-style: italic;"&gt;data&lt;/span&gt; quanto a propriedade &lt;span style="font-style: italic;"&gt;Data&lt;/span&gt; assumem o tipo string para a variável &lt;span style="font-weight: bold;"&gt;t&lt;/span&gt; (linha 38).&lt;br /&gt;&lt;br /&gt;Quando associamos um tipo a um &lt;span style="font-style: italic;"&gt;type parameter&lt;/span&gt; dizemos que estamos criando uma instância do  tipo genérico. Assim na linha 38 o trecho de código:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;pre   style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;font-family:Courier New,Courier,Monospace;font-size:13px;"&gt;TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; t &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;Adriano&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;/pre&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;instancia o tipo &lt;span style="font-style: italic;"&gt;TestGeneric&lt;string&gt;&lt;/string&gt;&lt;/span&gt; (não confundir a instância de uma classe, ou seja, um objeto, com a instância de um tipo genérico) com o &lt;span style="font-style: italic;"&gt;type parameter&lt;/span&gt; como &lt;span style="font-style: italic;"&gt;string&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Da mesma forma ao escrevermos o seguinte código:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;pre face="Courier New,Courier,Monospace" size="13px" style="border: thin dashed rgb(0, 68, 68); background: rgb(255, 255, 217) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; padding-left: 10px; color: rgb(0, 0, 0); margin-right: -100px;"&gt;TestGeneric&lt;span style="color: rgb(128, 128, 48);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;&gt;&lt;/span&gt; ti;&lt;/pre&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;estamos instanciando o tipo &lt;span style="font-weight: bold;"&gt;TestGeneric&lt;/span&gt; com &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt; como &lt;span style="font-style: italic;"&gt;int&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Apesar de neste exemplo em particular o tipo genérico possuir apenas um &lt;span style="font-style: italic;"&gt;type parameter&lt;/span&gt; nada impede de definirmos tipos com dois ou mais &lt;span style="font-style: italic;"&gt;type parameters&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Nos próximos posts pretendo discutir um pouco mais sobre:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;constrains.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;diferenças entre &lt;span style="font-style: italic;"&gt;generics &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;templates &lt;/span&gt;C++.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Palavra reservada &lt;span style="font-style: italic;"&gt;default&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Representação em &lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Adriano.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-113024004200984907?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/113024004200984907/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=113024004200984907' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113024004200984907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/113024004200984907'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/10/generics-ii.html' title='Generics II'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-112870387170482701</id><published>2005-10-07T13:51:00.000-03:00</published><updated>2005-10-07T14:16:09.470-03:00</updated><title type='text'></title><content type='html'>&lt;P&gt;&lt;FONT color=#000040&gt;&lt;FONT size=2&gt;Como comentei &lt;A href="http://accessviolation.blogspot.com/2005/09/c-20-c-30-meu-que-loucura.html"&gt;neste post&lt;/A&gt;, pretendo falar um pouco mais sobre as &lt;/FONT&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/7cz8t42e"&gt;&lt;FONT size=2&gt;melhorias introduzidas na versão 2.0 do C#&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Na realidade, muitas destas melhorias só são suportadas pois foram introduzidas também no &lt;/FONT&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/t357fb32"&gt;&lt;FONT size=2&gt;.Net Framework&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Vou começar pelo assunto &lt;STRONG&gt;Generics&lt;/STRONG&gt;, uma vez que venho do "mundo C++"&amp;nbsp; e gosto muito do conceito de templates (que é semelhante)&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Em primeiro lugar, &lt;STRONG&gt;Generics&lt;/STRONG&gt; é uma tecnologia que nos permite tratar um tipo de forma genérica (ok, sem gozação). Um caso clássico é a implementação de&amp;nbsp;coleções (por exemplo listas encadeadas, filas, pilhas, etc). Até a versão 2.0 do .Net Framework coleções eram implementadas de forma a tratar os dados como &lt;STRONG&gt;Object&lt;/STRONG&gt;. Funciona, mas esta abordagem traz vários problemas:&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;&lt;LI&gt;&lt;FONT size=2&gt;Uma vez armazenado na coleção, o objeto perde sua &lt;EM&gt;identidade&lt;/EM&gt;, ou seja, tudo é tratado como &lt;STRONG&gt;object&lt;/STRONG&gt;.&lt;/FONT&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;FONT size=2&gt;Isto&amp;nbsp;obriga o desenvolvedor a fazer casts&lt;/FONT&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;FONT size=2&gt;Não é possível ao compilador verificar o correto uso da coleção quanto ao tipo de dado incluído na mesma.&lt;/FONT&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;FONT size=2&gt;Performance (basicamente boxing/unboxing)&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Vamos apresentar um exemplo:&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;STYLE type=text/css&gt;&lt;br /&gt;.csharpcode&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: Courier New , Courier, Monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TestCollection&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Main()&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        IList col = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        col.Add(&lt;SPAN class=str&gt;"Adriano"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        col.Add(&lt;SPAN class=str&gt;"Verona"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        String s = (String) col[0];&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; str &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; col)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            System.Console.WriteLine(str);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        col.Add(10);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; str &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; col)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            System.Console.WriteLine(str);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;   }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Os problemas começam na linha 13 (que ilustra o ponto 2). Porque o compilador não permite que eu atribua &lt;STRONG&gt;col[0]&lt;/STRONG&gt; para a variável &lt;STRONG&gt;s&lt;/STRONG&gt; sem um cast explícito? Bom, porque o indexador [] da interface &lt;STRONG&gt;IList&lt;/STRONG&gt; foi declarado como retornando um &lt;STRONG&gt;object&lt;/STRONG&gt; e não poderia ser diferente! O único tipo de dados &lt;EM&gt;genérico&lt;/EM&gt; disponível era o &lt;STRONG&gt;object&lt;/STRONG&gt;!&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Outro problema pode ser observado na linha 19. Como o método &lt;STRONG&gt;Add()&lt;/STRONG&gt; espera um &lt;STRONG&gt;object&lt;/STRONG&gt; o compilador não tem como verificar que esta operação não é válida. Provavelmente o desenvolvedor que escreveu este código ficará surpreso ao ser gerada uma exceção na linha 20.&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Agora observer o próximo exemplo:&lt;/FONT&gt;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;STYLE type=text/css&gt;&lt;br /&gt;.csharpcode&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: Courier New , Courier, Monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections.Generic;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TestGenericCollection&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Main()&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        IList&amp;lt;String&amp;gt; strCol = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; List&amp;lt;String&amp;gt;();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        strCol.Add(&lt;SPAN class=str&gt;"Str1"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        strCol.Add(&lt;SPAN class=str&gt;"Str1"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        String s = strCol[0]; &lt;SPAN class=rem&gt;// Agora sim!!&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        Console.WriteLine(s);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// Tentar compilar com o código abaixo descomentado gera um erro de compilação&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// strCol.Add(42); &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;   }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;A primeira diferença que observamos é quanto ao &lt;STRONG&gt;namespace&lt;/STRONG&gt; utilizado. Neste exemplo passamos a utilizar o namespace &lt;STRONG&gt;System.Collections.Generic&lt;/STRONG&gt; ao invés do tradicional &lt;STRONG&gt;System.Collections&lt;/STRONG&gt;.&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Na linha 8 declaramos uma lista para armazenar strings (denotado pela sintaxe &lt;EM&gt;&amp;lt;String&amp;gt;&lt;/EM&gt; que segue a interface &lt;EM&gt;IList&lt;/EM&gt; e a classe &lt;EM&gt;List&lt;/EM&gt;).&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Na linha 13 observamos que podemos&amp;nbsp;recuperar elementos da lista sem necessidade de &lt;EM&gt;casts&lt;/EM&gt;. Você pode estar pensando: "ummm, o compilador deu uma de esperto&amp;nbsp;e fez o cast implicito!! ou seja, sintaxe suggar"; você esta enganado... observe o código IL gerado no primeiro exemplo:&lt;/FONT&gt;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;STYLE type=text/css&gt;&lt;br /&gt;.csharpcode&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: Courier New , Courier, Monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;.method &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; hidebysig &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt;  Main() cil managed&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;  .entrypoint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;  &lt;SPAN class=rem&gt;// Code size       175 (0xaf)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;  .maxstack  2&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;  .locals init (&lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.IList V_0,&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; V_1,&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; V_2,&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.IList`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt; V_3,&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.IEnumerator V_4,&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; V_5,&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.IDisposable V_6)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;  IL_0000:  nop&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;  IL_0001:  newobj     instance &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; [mscorlib]System.Collections.ArrayList::.ctor()&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;  IL_0006:  stloc.0&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;  IL_0007:  ldloc.0&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;  IL_0008:  ldstr      &lt;SPAN class=str&gt;"Adriano"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;  IL_000d:  callvirt   instance int32 [mscorlib]System.Collections.IList::Add(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;  IL_0012:  pop&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;  IL_0013:  ldloc.0&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;  IL_0014:  ldstr      &lt;SPAN class=str&gt;"Verona"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;  IL_0019:  callvirt   instance int32 [mscorlib]System.Collections.IList::Add(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;  IL_001e:  pop&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;  IL_001f:  ldloc.0&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;  IL_0020:  ldc.i4.0&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;  IL_0021:  callvirt   instance &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; [mscorlib]System.Collections.IList::get_Item(int32)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;  IL_0026:  castclass  [mscorlib]System.String&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;  IL_002b:  stloc.1&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;  IL_002c:  nop&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;  IL_002d:  ldloc.0&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;FONT size=2&gt;Observe que na linha 27 existe uma instrunção &lt;STRONG&gt;castclass&lt;/STRONG&gt; (que realiza o cast)&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Agora veja o IL&amp;nbsp;gerado no segundo exemplo (usando generics) :&lt;/FONT&gt;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;STYLE type=text/css&gt;&lt;br /&gt;.csharpcode&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: Courier New , Courier, Monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;.method &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; hidebysig &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt;  Main() cil managed&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;  .entrypoint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;  &lt;SPAN class=rem&gt;// Code size       47 (0x2f)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;  .maxstack  2&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;  .locals init (&lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.IList`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt; V_0,&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;           &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; V_1)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;  IL_0000:  nop&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;  IL_0001:  newobj     instance &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.List`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt;::.ctor()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;  IL_0006:  stloc.0&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;  IL_0007:  ldloc.0&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;  IL_0008:  ldstr      &lt;SPAN class=str&gt;"Str1"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;  IL_000d:  callvirt   instance &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.ICollection`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt;::Add(!0)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;  IL_0012:  nop&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;  IL_0013:  ldloc.0&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;  IL_0014:  ldstr      &lt;SPAN class=str&gt;"Str1"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;  IL_0019:  callvirt   instance &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.ICollection`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt;::Add(!0)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;  IL_001e:  nop&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;  IL_001f:  ldloc.0&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;  IL_0020:  ldc.i4.0&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;  IL_0021:  callvirt   instance !0 &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; [mscorlib]System.Collections.Generic.IList`1&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;&amp;gt;::get_Item(int32)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;  IL_0026:  stloc.1&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;  IL_0027:  ldloc.1&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;  IL_0028:  call       &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; [mscorlib]System.Console::WriteLine(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;  IL_002d:  nop&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;  IL_002e:  ret&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;} &lt;SPAN class=rem&gt;// end of method TestGenericCollection::Main&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;FONT size=2&gt;Note (linhas 21, 22) que o compilador não usou a instrução &lt;STRONG&gt;castclass&lt;/STRONG&gt;, ou seja, nenhum cast foi realizado!&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;No próximo post pretendo falar um pouco mais sobre generics e apresentar um exemplo.&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;Até mais.&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-112870387170482701?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/112870387170482701/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=112870387170482701' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112870387170482701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112870387170482701'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/10/como-comentei-neste-post-pretendo.html' title=''/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-112779078613337033</id><published>2005-09-26T23:53:00.000-03:00</published><updated>2005-09-27T00:13:06.140-03:00</updated><title type='text'>Pinguins...</title><content type='html'>Independentemente da disputa sem sentido entre alguns defensores do Linux contra o Windows (e vice-versa) tenho certeza que estes dois S.Os possuem suas qualidades e defeitos... Quanto a minha opnião... sou um pouco suspeito  :). Trabalho a quase 10 anos com Windows; já com o Linux tive pouco contato.&lt;br /&gt;&lt;br /&gt;Dentre as distribuições que já tive oportunidade de instalar (RH, Slack, Mandrake, Suse, Ubuntu, Mandriva), me identifiquei mais com a Mandrake e Mandriva; aliás, em meu computador tenho instalado atualmente o Mandriva 2005 LE. Particularmente uma das dificuldades que encontrei foi o processo de instalação de novos softwares; na boa, é um parto. Problemas de dependências entre bibliotecas são um pesadelo para se resolver! Sem contar as inúmeras vezes que tento iniciar um programa (clicando duas vezes sobre o mesmo) e nada acontece; meu, é frustante (e olha que não sou um usuário sem conhecimento)&lt;br /&gt;&lt;br /&gt;De qualquer forma acredito que a facilidade de uso do Linux vem melhorando (mas pelo que pude perceber os requisitos de hardware também :).&lt;br /&gt;&lt;br /&gt;Fica registrado aqui que estou gostando do Mandriva :). Quem sabe eu instalo o Mono qualquer dia destes e passo a desenvolver mais neste ambiente? Talvez Java; C++? Nem pensar... tenho coisa melhor para fazer em minha vida :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-112779078613337033?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/112779078613337033/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=112779078613337033' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112779078613337033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112779078613337033'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/09/pinguins.html' title='Pinguins...'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-112774191054503571</id><published>2005-09-26T10:30:00.000-03:00</published><updated>2005-09-27T08:26:45.956-03:00</updated><title type='text'>C# 2.0 ? C# 3.0? Meu que loucura.</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Estou ficando louco ou a MS nem lançou a &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://msdn.microsoft.com/vcsharp/programming/language/"&gt;versão 2.0 do C#&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; (e as respectivas mudanças na CLR)  e já esta apresentando o que será a &lt;a href="http://msdn.microsoft.com/vcsharp/future/"&gt;versão 3.0&lt;/a&gt;!!!&lt;br /&gt;&lt;br /&gt;Não deixe de ver o documento de &lt;a href="http://download.microsoft.com/download/9/5/0/9503e33e-fde6-4aed-b5d0-ffe749822f1b/csharp%203.0%20specification.doc"&gt;especificação&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Um ótimo blog que costumo ler todos os dias é o &lt;a href="http://blogs.msdn.com/cyrusn/default.aspx"&gt;Cyru's Blather&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Para aqueles que ainda não tiveram a oportunidade de conheçer as novas funcionalidades da versão 2.0 do C# aqui vai uma lista:&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;Generics: Semelhanta a templates em C++ porém com uma série de melhorias, inclusive (segundo a MS), sem os problemas de "code bloat" inerentes aos templates em C++.&lt;br /&gt; &lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Anonymous Methods: Uma forma para simplificar o uso de delegates&lt;br /&gt; &lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Iterators: Melhoria no mecanismos de iterators já existentes.&lt;br /&gt; &lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Partial Types: Possibilidade de se implementar classes/estruturas/interfaces em dois ou mais arquivos separados&lt;br /&gt; &lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Nullable Types:  Suporte a "value type" com valor nulo (veja este &lt;a href="http://blogs.msdn.com/cyrusn/archive/2005/08/13/451206.aspx"&gt;post&lt;/a&gt;)&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;Bom, espero poder discutir cada um dos tópicos com mais detalhes nos próximos posts.&lt;br /&gt;&lt;br /&gt;That's all for now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-112774191054503571?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/112774191054503571/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=112774191054503571' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112774191054503571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/112774191054503571'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/09/c-20-c-30-meu-que-loucura.html' title='C# 2.0 ? C# 3.0? Meu que loucura.'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-111019705691145269</id><published>2005-03-07T08:59:00.000-03:00</published><updated>2005-03-07T09:04:16.913-03:00</updated><title type='text'></title><content type='html'>&lt;span style="font-family: verdana;"&gt;Como podem ver faz algum tempo que não posto nada.... o velho problema da falta de tempo...&lt;br /&gt;&lt;br /&gt;Enquanto não tenho tempo para continuar o assunto "metadados" vou incluir dois links para o site do Joel falando sobre &lt;a href="http://www.joelonsoftware.com/articles/fog0000000073.html"&gt;Entrevistas de trabalho&lt;/a&gt; e &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;Práticas de Programação&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-111019705691145269?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/111019705691145269/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=111019705691145269' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/111019705691145269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/111019705691145269'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/03/como-podem-ver-faz-algum-tempo-que-no.html' title=''/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-110627079859437193</id><published>2005-01-20T22:40:00.000-02:00</published><updated>2005-01-20T23:26:38.593-02:00</updated><title type='text'>Metadados II</title><content type='html'>&lt;style&gt;&lt;br /&gt;/* Java2HTML - Colour Definitions*/&lt;br /&gt;&lt;br /&gt;/* Define colors, fonts and other style attributes here to override the defaults  */&lt;br /&gt;&lt;br /&gt;/* Page background Colour */&lt;br /&gt;body { background-color: #FFFFFF; }&lt;br /&gt;&lt;br /&gt;/* Default Text Colour */&lt;br /&gt;body {  color: #000000}&lt;br /&gt;&lt;br /&gt;/* Header/Footer Colours */&lt;br /&gt;#Header  { font-family: Arial, Helvetica, sans-serif; color: #000000;  background-color:#EEEEFF }&lt;br /&gt;&lt;br /&gt;/* Line Number */&lt;br /&gt;#LN     { color: #BBBBBB;  background-color:#FFFFFF }&lt;br /&gt;&lt;br /&gt;/* Link Colours */&lt;br /&gt;#Classes A:link		{ color: #000000; }&lt;br /&gt;#Classes A:visited	{ color: #000000; }&lt;br /&gt;#Classes PRE 		{ color: #000000; }&lt;br /&gt;&lt;br /&gt;/* Token Colours */&lt;br /&gt;#CharacerLiteral	{ color: #FF00FF; }&lt;br /&gt;#StringLiteral		{ color: #FF00FF; }&lt;br /&gt;#SingleLineComment	{ color: #008000; }&lt;br /&gt;#FormalComment		{ color: #008000; }&lt;br /&gt;#MultiLineComment	{ color: #008000; }&lt;br /&gt;#Abstract		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Boolean		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Break			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Byte			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Case			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Catch			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Char			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Class			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Const			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Continue		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Default		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Do			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Double		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Else			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Extends		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#False			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Final			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Finally		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Float			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#For			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Goto			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#If			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Implements		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Import		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#InstanceOf		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Int			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Interface		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Long			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Native		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#New			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Package		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Private		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Protected		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Public		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Return		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Short			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Static		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Super			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Switch		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Synchronized		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#This			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Throw			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Throws		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Transient		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#True			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Try			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Void			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#Volatile		{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#While			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#StrictFP			{ color: #0000FF ; font-weight: bold }&lt;br /&gt;#IntegerLiteral	{ color: #000000 }&lt;br /&gt;#DecimalLiteral	{ color: #000000 }&lt;br /&gt;#HexLiteral		{ color: #000000 }&lt;br /&gt;#OctalLiteral		{ color: #000000 }&lt;br /&gt;#FloatPointLiteral	{ color: #000000 }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;No último post apresentei brevemente o conceito de "metadados" que, quando aplicados à programas, acrescentam informações, que normalmente não são incluídas, ao binário gerado pelo compilador, tais como lista de tipos contidos no módulo, métodos, eventos, etc.&lt;br /&gt;&lt;br /&gt;Este post contém um exemplo de como podemos explorar estes metadados em um programa em java.&lt;br /&gt;&lt;br /&gt;&lt;table id="Header" border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td colspan="2" width="33%"&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td align="center" colspan="2" width="33%"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;TestReflection.java&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td align="right" colspan="2" width="33%"&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;pre id="Classes"&gt;&lt;br /&gt;&lt;span id="LN"&gt;1    &lt;/span&gt;&lt;a name="1"&gt;&lt;/a&gt;&lt;span id="Import"&gt;import&lt;/span&gt; java.lang.reflect.*;&lt;br /&gt;&lt;span id="LN"&gt;2    &lt;/span&gt;&lt;a name="2"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;3    &lt;/span&gt;&lt;a name="3"&gt;&lt;/a&gt;&lt;span id="Public"&gt;public&lt;/span&gt; &lt;span id="Class"&gt;class&lt;/span&gt; TestReflection&lt;br /&gt;&lt;span id="LN"&gt;4    &lt;/span&gt;&lt;a name="4"&gt;&lt;/a&gt;{&lt;br /&gt;&lt;span id="LN"&gt;5    &lt;/span&gt;&lt;a name="5"&gt;&lt;/a&gt;   &lt;span id="Public"&gt;public&lt;/span&gt; &lt;span id="Static"&gt;static&lt;/span&gt; &lt;span id="Void"&gt;void&lt;/span&gt; main(String []args)&lt;br /&gt;&lt;span id="LN"&gt;6    &lt;/span&gt;&lt;a name="6"&gt;&lt;/a&gt;   {&lt;br /&gt;&lt;span id="LN"&gt;7    &lt;/span&gt;&lt;a name="7"&gt;&lt;/a&gt;    &lt;span id="If"&gt;if&lt;/span&gt; (args.length == &lt;span id="IntegerLiteral"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;span id="LN"&gt;8    &lt;/span&gt;&lt;a name="8"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;9    &lt;/span&gt;&lt;a name="9"&gt;&lt;/a&gt;        &lt;a href="http://www.blogger.com/app/TestReflection.java.html"&gt;TestReflection&lt;/a&gt; tr = &lt;span id="New"&gt;new&lt;/span&gt; &lt;a href="http://www.blogger.com/app/TestReflection.java.html"&gt;TestReflection&lt;/a&gt;();&lt;br /&gt;&lt;span id="LN"&gt;10   &lt;/span&gt;&lt;a name="10"&gt;&lt;/a&gt;        tr.DumpMethods(args[&lt;span id="IntegerLiteral"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;span id="LN"&gt;11   &lt;/span&gt;&lt;a name="11"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;12   &lt;/span&gt;&lt;a name="12"&gt;&lt;/a&gt;    &lt;span id="Else"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span id="LN"&gt;13   &lt;/span&gt;&lt;a name="13"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;14   &lt;/span&gt;&lt;a name="14"&gt;&lt;/a&gt;        System.out.println(&lt;span id="StringLiteral"&gt;"Numero invalido de parametros"&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;15   &lt;/span&gt;&lt;a name="15"&gt;&lt;/a&gt;        System.out.println(&lt;span id="StringLiteral"&gt;"Uso: java TestReflection 'classe'\r\n"&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;16   &lt;/span&gt;&lt;a name="16"&gt;&lt;/a&gt;        System.out.println(&lt;span id="StringLiteral"&gt;"Ex: java TestReflection java.lang.String"&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;17   &lt;/span&gt;&lt;a name="17"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;18   &lt;/span&gt;&lt;a name="18"&gt;&lt;/a&gt;   }&lt;br /&gt;&lt;span id="LN"&gt;19   &lt;/span&gt;&lt;a name="19"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;20   &lt;/span&gt;&lt;a name="20"&gt;&lt;/a&gt;   &lt;span id="Private"&gt;private&lt;/span&gt; &lt;span id="Void"&gt;void&lt;/span&gt; DumpMethods(String className)&lt;br /&gt;&lt;span id="LN"&gt;21   &lt;/span&gt;&lt;a name="21"&gt;&lt;/a&gt;   {&lt;br /&gt;&lt;span id="LN"&gt;22   &lt;/span&gt;&lt;a name="22"&gt;&lt;/a&gt;    &lt;span id="Try"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span id="LN"&gt;23   &lt;/span&gt;&lt;a name="23"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;24   &lt;/span&gt;&lt;a name="24"&gt;&lt;/a&gt;        Class cls = Class.forName(className);&lt;br /&gt;&lt;span id="LN"&gt;25   &lt;/span&gt;&lt;a name="25"&gt;&lt;/a&gt;        Method m[] = cls.getDeclaredMethods();&lt;br /&gt;&lt;span id="LN"&gt;26   &lt;/span&gt;&lt;a name="26"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;27   &lt;/span&gt;&lt;a name="27"&gt;&lt;/a&gt;        &lt;span id="For"&gt;for&lt;/span&gt; (&lt;span id="Int"&gt;int&lt;/span&gt; i=&lt;span id="IntegerLiteral"&gt;0&lt;/span&gt;; i &amp;lt; m.length; i++)&lt;br /&gt;&lt;span id="LN"&gt;28   &lt;/span&gt;&lt;a name="28"&gt;&lt;/a&gt;        {&lt;br /&gt;&lt;span id="LN"&gt;29   &lt;/span&gt;&lt;a name="29"&gt;&lt;/a&gt;            DumpMethod(m[i]);&lt;br /&gt;&lt;span id="LN"&gt;30   &lt;/span&gt;&lt;a name="30"&gt;&lt;/a&gt;        }&lt;br /&gt;&lt;span id="LN"&gt;31   &lt;/span&gt;&lt;a name="31"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;32   &lt;/span&gt;&lt;a name="32"&gt;&lt;/a&gt;    &lt;span id="Catch"&gt;catch&lt;/span&gt;(ClassNotFoundException cnfe)&lt;br /&gt;&lt;span id="LN"&gt;33   &lt;/span&gt;&lt;a name="33"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;34   &lt;/span&gt;&lt;a name="34"&gt;&lt;/a&gt;        System.out.println(&lt;span id="StringLiteral"&gt;"Classe '"&lt;/span&gt; + className + &lt;span id="StringLiteral"&gt;"' nao foi encontrada!"&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;35   &lt;/span&gt;&lt;a name="35"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;36   &lt;/span&gt;&lt;a name="36"&gt;&lt;/a&gt;   }&lt;br /&gt;&lt;span id="LN"&gt;37   &lt;/span&gt;&lt;a name="37"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;38   &lt;/span&gt;&lt;a name="38"&gt;&lt;/a&gt;   &lt;span id="Private"&gt;private&lt;/span&gt; &lt;span id="Void"&gt;void&lt;/span&gt; DumpMethod(Method m)&lt;br /&gt;&lt;span id="LN"&gt;39   &lt;/span&gt;&lt;a name="39"&gt;&lt;/a&gt;   {&lt;br /&gt;&lt;span id="LN"&gt;40   &lt;/span&gt;&lt;a name="40"&gt;&lt;/a&gt;    System.out.print(Modifier.toString(m.getModifiers()) + &lt;span id="StringLiteral"&gt;" "&lt;/span&gt; + m.getReturnType().getName() + &lt;span id="StringLiteral"&gt;" "&lt;/span&gt; + m.getName() + &lt;span id="StringLiteral"&gt;"("&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;41   &lt;/span&gt;&lt;a name="41"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;42   &lt;/span&gt;&lt;a name="42"&gt;&lt;/a&gt;    Class paramTypes[] = m.getParameterTypes();&lt;br /&gt;&lt;span id="LN"&gt;43   &lt;/span&gt;&lt;a name="43"&gt;&lt;/a&gt;    &lt;span id="For"&gt;for&lt;/span&gt; (&lt;span id="Int"&gt;int&lt;/span&gt; i=&lt;span id="IntegerLiteral"&gt;0&lt;/span&gt;; i &amp;lt; paramTypes.length - &lt;span id="IntegerLiteral"&gt;1&lt;/span&gt;; i++)&lt;br /&gt;&lt;span id="LN"&gt;44   &lt;/span&gt;&lt;a name="44"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;45   &lt;/span&gt;&lt;a name="45"&gt;&lt;/a&gt;        System.out.print(paramTypes[i].getName() + &lt;span id="StringLiteral"&gt;", "&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;46   &lt;/span&gt;&lt;a name="46"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;47   &lt;/span&gt;&lt;a name="47"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;48   &lt;/span&gt;&lt;a name="48"&gt;&lt;/a&gt;    &lt;span id="If"&gt;if&lt;/span&gt; (paramTypes.length &amp;gt; &lt;span id="IntegerLiteral"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span id="LN"&gt;49   &lt;/span&gt;&lt;a name="49"&gt;&lt;/a&gt;    {&lt;br /&gt;&lt;span id="LN"&gt;50   &lt;/span&gt;&lt;a name="50"&gt;&lt;/a&gt;        System.out.print(paramTypes[paramTypes.length - &lt;span id="IntegerLiteral"&gt;1&lt;/span&gt;].getName());&lt;br /&gt;&lt;span id="LN"&gt;51   &lt;/span&gt;&lt;a name="51"&gt;&lt;/a&gt;    }&lt;br /&gt;&lt;span id="LN"&gt;52   &lt;/span&gt;&lt;a name="52"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="LN"&gt;53   &lt;/span&gt;&lt;a name="53"&gt;&lt;/a&gt;    System.out.println(&lt;span id="StringLiteral"&gt;")"&lt;/span&gt;);&lt;br /&gt;&lt;span id="LN"&gt;54   &lt;/span&gt;&lt;a name="54"&gt;&lt;/a&gt;   }&lt;br /&gt;&lt;span id="LN"&gt;55   &lt;/span&gt;&lt;a name="55"&gt;&lt;/a&gt;}&lt;br /&gt;&lt;span id="LN"&gt;56   &lt;/span&gt;&lt;a name="56"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Toda a &lt;span style="font-family:verdana;"&gt;mágica &lt;/span&gt;é ocorre nos métodos &lt;span style="font-family:verdana;"&gt;DumpMethods()&lt;/span&gt; (linhas 20 - 36) e DumpMethod() (linhas 38 - 54).&lt;br /&gt;&lt;br /&gt;Na linha 24, o método estático &lt;span style="font-family:lucida grande;"&gt;forName() &lt;/span&gt;da classe Class é utilizado para recuperar uma referência para o objeto Class que representa a classe passada como parâmetro. A seguir (linha 25) o método &lt;span style="font-family: verdana;"&gt;getDeclaredMethods()&lt;/span&gt; deste objeto é utilizado para recuperar a lista de métodos implementados pela classe. O próximo passo é chamar o método &lt;span style="font-family: verdana;"&gt;DumpMethod() (linhas 27 - 29) &lt;/span&gt;para cara objeto da lista obtida no passo anterior. Este método por sua vez utiliza os métodos da classe &lt;span style="font-family: verdana;"&gt;Method&lt;/span&gt; (que modela um método de um objeto) para obter informações sobre o nome do método, lista de parâmetros, modificadores, etc.&lt;br /&gt;&lt;br /&gt;Nos próximos posts apresentarei um exemplo em .Net e também como "estender" o mecanismo de metadados adicionando seus próprios "atributos" mas isto é assunto para os próximos posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-110627079859437193?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/110627079859437193/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=110627079859437193' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110627079859437193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110627079859437193'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/01/metadados-ii.html' title='Metadados II'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-110549040738970476</id><published>2005-01-11T22:28:00.000-02:00</published><updated>2005-01-11T22:44:47.530-02:00</updated><title type='text'>Metadados</title><content type='html'>&lt;ol&gt;&lt;li&gt;O que é?&lt;br /&gt;&lt;br /&gt;Do ingles,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;strong&gt;metadata&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;n&lt;/span&gt;. data about data, information known that makes it easy to access and use the data (e.g.: library catalog card, which includes information about the nature and location of a book); (Computers) descriptive information about data and documents (such as origin, size, formatting or different characteristics of a data)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Até pouco tempo, ao compilar um programa fonte obtínhamos como resultado o programa final (binário), pronto para ser executado, a partir do qual, pouco podia-se inferir a respeito do programa fonte original (por exemplo, não havia como descobrir os tipos definidos, informações sobre segurança, documentação, etc).&lt;br /&gt;&lt;br /&gt;Apesar destas ?limitações? acredito que este modelo seja satisfatório para programas monolíticos, contudo, com a evolução do processo de desenvolvimento e conseqüente componentização do software, estas deficiências ficaram evidentes e as novas tecnologias passaram a incorporar mais informações (metadados) a respeito do programa fonte.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;li&gt;Utilidade&lt;br /&gt;&lt;br /&gt;Até recentemente, a utilização de metadados podia ser observada principalmente na área de Gerenciadores de Banco de Dados; por exemplo, os servidores SQL disponibilizam informações a respeito do banco de dados através da própria linguagem SQL (por exemplo no SQL Server pode-se obter informações a respeito de uma tabela tais como lista de campos, índices, etc. utilizando o comando SQL: &lt;strong&gt;sp_help &lt;em&gt;nome_tabela&lt;/em&gt;&lt;/strong&gt;).&lt;br /&gt;&lt;br /&gt;Contudo os desenvolvedores notaram que esta técnica poderia simplificar o desenvolvimento e/ou permitir a criação de programas mais flexíveis, assim passaram a adotá-la. Por exemplo, C++ possui o conceito de RTTI (ou run time type information) que podemos entender como uma forma primária de metadados. A tecnologia COM (Component Object Model) da Microsoft utiliza &lt;em&gt;typelibraries&lt;/em&gt;, ou bibliotecas de tipos, para descrever as classes (ou melhor, &lt;em&gt;CoClasses&lt;/em&gt;), &lt;em&gt;interfaces&lt;/em&gt;, etc. implementadas em um determinado componente.&lt;br /&gt;&lt;br /&gt;Um dos exemplos mais utilizados sobre a utilização de metadados é a criação de &lt;em&gt;&lt;span style="color:#660000;"&gt;Object Browsers&lt;/span&gt;&lt;/em&gt;; implementar tal tipo de programa para linguagens que não suportam metadados representa um processo intrinsecamente complexo, exigindo, na maior parte dos casos parses para a linguagem em questão. Por outro lado, a implementação para linguagens que suportam este conceito, como Java, C#, VB.Net, etc. é bastante simplificada.&lt;br /&gt;&lt;br /&gt;Outro tipo de ferramenta que se beneficia da existência de metadados para um programa são os geradores automáticos de documentação, testes unitários, etc.&lt;br /&gt;&lt;br /&gt;Também, ao incluir um componente em uma aplicação COM+ este procura na typelib do componente por uma propriedade específica que defina o comportamento transacional do componente; se esta propriedade existir o administrador do sistema não terá que configurar o componente manualmente, diminuindo a chance de erros.&lt;br /&gt;&lt;br /&gt;Todas estas aplicações se tornaram viáveis e/ou de implementação mais simples através da utilização de metadados, contudo as possibilidades de utilização são inúmeras. No próximo post descreverei a o processo, conhecido como &lt;em&gt;&lt;span style="color:#660000;"&gt;reflection&lt;/span&gt;&lt;/em&gt;, de navegação pelos metadados, gerados pelo compilador da linguagem Java.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-110549040738970476?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/110549040738970476/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=110549040738970476' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110549040738970476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110549040738970476'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/01/metadados.html' title='Metadados'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-110498370874510969</id><published>2005-01-06T01:55:00.000-02:00</published><updated>2005-01-06T01:55:08.746-02:00</updated><title type='text'></title><content type='html'>&lt;a href='http://photos1.blogger.com/img/249/2875/640/DSC00647.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/249/2875/320/DSC00647.jpg'&gt;&lt;/a&gt;&lt;br /&gt;eu...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-110498370874510969?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/110498370874510969/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=110498370874510969' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110498370874510969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110498370874510969'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/01/eu.html' title=''/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9975448.post-110498039298080015</id><published>2005-01-06T01:18:00.000-02:00</published><updated>2005-01-06T00:59:52.980-02:00</updated><title type='text'>apresentação ....</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000066;"&gt;Bom&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;Meu nome é Adriano, trabalho com desenvolvimento de programas a mais ou menos 10 anos, basicamente software para Windows em C/C++. Na medida do possível (tempo disponível) pretendo enviar dicas, compartilhar experiências, links, etc. relacionados ao assunto de programação em geral (Estruturas de dados, Componentes COM+, Win DNA, Win32, C++, .Net, Unit Test, Documentação, etc.); contudo devo incluir posts de assuntos variados (principalmente sobre minha filha, Carolina :-).&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000066;"&gt;Sou apaixonado por computação, e meus amigos sabem que não gosto de ver código mal escrito (mesmo que seja meu mesmo :-(.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000066;"&gt;Além deste blog participo dos &lt;a href="http://www.msdn.com.br/forum/Default.aspx"&gt;foruns da Microsoft&lt;/a&gt; &lt;/span&gt;&lt;span style="font-family:georgia;color:#000066;"&gt;(principalmente os de C++ e COM+). &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;Então, vamos parar de enrolação e vamos lá; neste primeiro post compartilho alguns blogs que leio diariamente (ou quase)...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;a href="http://blogs.msdn.com"&gt;http://blogs.msdn.com&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000066;"&gt;&lt;a href="http://blogs.msdn.com/ericgu"&gt;&lt;span style="font-size:85%;"&gt;http://blogs.msdn.com/ericgu&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (C#)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000066;"&gt;&lt;a href="http://weblogs.asp.net/oldnewthing/"&gt;&lt;span style="font-size:85%;"&gt;http://weblogs.asp.net/oldnewthing/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (você  já se perguntou porque algo no Windows foi implementado - funciona - da forma como foi?)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thedailywtf.com/"&gt;&lt;span style="font-size:85%;"&gt;http://thedailywtf.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (coooooxaaa... :-)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/EricLippert"&gt;&lt;span style="font-size:85%;"&gt;http://blogs.msdn.com/EricLippert&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/larryosterman/"&gt;&lt;span style="font-size:85%;"&gt;http://blogs.msdn.com/larryosterman/&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:85%;color:#000066;"&gt;Certamente existem outros (bons) blogs sobre o assunto. Você conhece algum? Compartilhe conosco.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;Um abraço,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;Adriano&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9975448-110498039298080015?l=accessviolation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://accessviolation.blogspot.com/feeds/110498039298080015/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9975448&amp;postID=110498039298080015' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110498039298080015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9975448/posts/default/110498039298080015'/><link rel='alternate' type='text/html' href='http://accessviolation.blogspot.com/2005/01/apresentao.html' title='apresentação ....'/><author><name>Adriano Verona</name><uri>https://profiles.google.com/107247741624256287339</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-Ze6-vhrDIkw/AAAAAAAAAAI/AAAAAAAAAAA/x7bSEw6xL8s/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
