<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Caloni.com.br &#187; C++</title>
	<link>http://www.caloni.com.br/blog</link>
	<description>C++, Windows, Programação, Depuração e Transpiração</description>
	<pubDate>Thu, 25 Feb 2010 17:39:41 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>Name mangling</title>
		<link>http://www.caloni.com.br/blog/archives/name-mangling</link>
		<comments>http://www.caloni.com.br/blog/archives/name-mangling#comments</comments>
		<pubDate>Mon, 13 Jul 2009 09:00:32 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/name-mangling</guid>
		<description><![CDATA[A sobrecarga estática possui algumas desvantagens em relação ao sistema de nomes da boa e velha linguagem C: ela não foi padronizada entre compiladores. O que isso quer dizer na prática é que funções exportadas de bibliotecas dinâmicas (DLLs) vão possuir nomes diferentes dependendo do compilador utilizado (e sua versão). Isso é o que chamamos [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://www.caloni.com.br/blog/archives/polimorfismo-estatico">sobrecarga estática</a> possui algumas desvantagens em relação ao sistema de nomes da boa e velha linguagem C: ela <strong>não foi padronizada</strong> entre compiladores. O que isso quer dizer na prática é que funções exportadas de bibliotecas dinâmicas (DLLs) vão possuir nomes diferentes dependendo do compilador utilizado (e sua versão). Isso é o que chamamos <a href="http://en.wikipedia.org/wiki/Name_mangling" title="Name mangling na Wikipedia.">name mangling</a>.</p>
<p>Em dois projetos usando Visual C++ 2008 e Borland C++ Builder 5 (última versão que funciona direito) eu fiz uma exportação da função soma em linguagem C (o fonte é um .c). Veja o resultado:</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-borland-c.png" alt="name-mangling-borland-c.png" /></p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-vcpp-c.png" alt="name-mangling-vcpp-c.png" /></p>
<p>Já usando a linguagem C++ (o fonte é um .cpp) temos outro resultado totalmente diferente para nossas duas funções soma descritas <a href="http://www.caloni.com.br/blog/archives/polimorfismo-estatico">no artigo anterior</a>:</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-borland-cpp.png" alt="name-mangling-borland-cpp.png" /></p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-vcpp-cpp.png" alt="name-mangling-vcpp-cpp.png" /></p>
<p>Se quiser tentar entender essas letrinhas bizarras, recomendo baixar <a href="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling.7z" title="name-mangling.7z">projetos de exemplo</a>. Se apenas entender que você não conseguirá juntar classes VC++ e Builder usando <strong><a href="http://msdn.microsoft.com/en-us/library/a90k134d(VS.80).aspx">dllexport</a></strong> para tudo quanto é lado, então terminamos por aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/name-mangling/feed</wfw:commentRss>
		</item>
		<item>
		<title>Polimorfismo estático</title>
		<link>http://www.caloni.com.br/blog/archives/polimorfismo-estatico</link>
		<comments>http://www.caloni.com.br/blog/archives/polimorfismo-estatico#comments</comments>
		<pubDate>Fri, 10 Jul 2009 17:44:34 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/polimorfismo-estatico</guid>
		<description><![CDATA[

Para explicar polimorfismo, nada como ver as coisas como elas eram. Se você fosse um programador C de vinte anos atrás e criasse as seguintes funções:
int soma&#40;int x, int y&#41;;
double soma&#40;double x, double y&#41;;
&#160;
int main&#40;&#41;
&#123;
    int zi = soma&#40;2, 3&#41;;
    double zd = soma&#40;2.5, 3.4&#41;;
    return [...]]]></description>
			<content:encoded><![CDATA[

<p>Para explicar polimorfismo, nada como ver as coisas como elas eram. Se você fosse um programador C de vinte anos atrás e criasse as seguintes funções:</p>
<p><pre><span style="color: #0000ff;">int</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #0000ff;">double</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> zi = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>, <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #0000ff;">double</span> zd = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>.<span style="color: #000000;">5</span>, <span style="color: #000000;">3</span>.<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<p>Imediatamente o compilador iria acusar os seguintes erros:</p>
<pre>overload.c</pre>
<pre>overload.c(2) : warning C4028: formal parameter 1 different from declaration
overload.c(2) : warning C4028: formal parameter 2 different from declaration
overload.c(2) : error C2371: 'soma' : redefinition; different basic types
        overload.c(1) : see declaration of 'soma'</pre>
<p>Isso acontece porque em C <strong>os identificadores são únicos por escopo</strong>. Esse é o motivo por que o seguinte código também está errado:</p>
<p><pre><span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> x = <span style="color: #000000;">0</span>;
    <span style="color: #0000ff;">int</span> x = <span style="color: #000000;">1</span>;
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;</pre></p>
<pre>overload.c
overload.c(5) : error C2374: 'x' : redefinition; multiple initialization
        overload.c(4) : see declaration of 'x'</pre>
<p>De volta aos anos 90, isso também está errado em C++. Até por uma questão de lógica: como o compilador pode saber a qual variável estamos nos referindo se usarmos o mesmo nome para duas delas?</p>
<p>Só que existe um truquezinho para impedir essa ambiguidade quando falamos de funções: os parâmetros que ela recebe.</p>
<p><pre><span style="color: #0000ff;">int</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #0000ff;">double</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> zi = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>, <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">&#41;</span>; <span style="color: #006600;">// dois tipos int: chamar soma(int, int)</span>
    <span style="color: #0000ff;">double</span> zd = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>.<span style="color: #000000;">5</span>, <span style="color: #000000;">3</span>.<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>; <span style="color: #006600;">// dois tipos double: s&oacute; pode ser soma(double, double)</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<pre>C:\Tests&gt;cl /c overload.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

overload.cpp

C:\Tests&gt;</pre>
<p>Isso permitiu que em C++ fosse criada a sobrecarga estática, que é exatamente isso: chamar a função não apenas de acordo com seu nome, mas também de acordo com sua assinatura, ou seja, o número e o tipo dos parâmetros recebidos. Chamamos de sobrecarga estática porque isso é feito apenas pelo compilador, não pesando em nada durante a execução do programa.</p>
<p>Entre seus usos mais comuns estão os seguintes:</p>
<ul>
<li>Ter funções com o mesmo nome mas que tratam de diferentes parâmetros;
<ul>
<li>soma(int, int);</li>
<li>soma(double, double);</li>
<li>Obs.: Isso ignora, é claro, as facilidades dos templates.</li>
</ul>
</li>
<li>Versões novas da mesma função que recebem parâmetros adicionais;
<ul>
<li>export_data(void* buffer, int size);</li>
<li>export_data(void* buffer, int size, unsigned long options);</li>
</ul>
</li>
<li>Mesmo nome de método para setar e obter o valor de uma propriedade;
<ul>
<li>Class::Property(int x); // setter</li>
<li>int x Class::Property() const; // getter</li>
</ul>
</li>
<li>Bom, o que mais sua imaginação mandar =)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/polimorfismo-estatico/feed</wfw:commentRss>
		</item>
		<item>
		<title>Strings</title>
		<link>http://www.caloni.com.br/blog/archives/strings</link>
		<comments>http://www.caloni.com.br/blog/archives/strings#comments</comments>
		<pubDate>Tue, 07 Jul 2009 12:46:08 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/strings</guid>
		<description><![CDATA[Como já vimos centenas e centenas de vezes, memória é apenas memória até que alguém diga que isso vale alguma coisa. Em seu estado latente é o que chamamos formalmente de dados. E dados são bytes armazenados na memória.
No entanto, quando esses dados viram algo de útil em um determinado contexto, não necessariamente alterando-se seu [...]]]></description>
			<content:encoded><![CDATA[<p>Como já vimos <a href="http://www.caloni.com.br/blog/archives/basico-do-basico-tipos">centenas</a> e <a href="http://www.caloni.com.br/blog/archives/guia-basico-para-programadores-de-primeiro-int-main">centenas</a> de vezes, memória é apenas memória até que alguém diga que isso vale alguma coisa. Em seu estado latente é o que chamamos formalmente de <strong>dados</strong>. E dados são bytes armazenados na memória.</p>
<p>No entanto, quando esses dados viram algo de útil em um determinado contexto, não necessariamente alterando-se seu conteúdo na memória, passamos a lidar com informação. Ou seja, é um dado com <strong>significado</strong>. E informação é a interpretação desses mesmos dados.</p>
<p>A conclusão óbvia para isso, falando de strings, é: uma série de bytes enfileirados na memória pode ser uma string.</p>
<p>Para tanto precisamos apenas de dados (os bytes enfileirados) e significado (uma tabela de símbolos que traduza esses bytes para caracteres e a definição de como a string se organiza).</p>
<p>Por exemplo, uma série de bytes diferentes de zero com valores que representam índices de uma tabela de tradução de caracteres e que termina sua sequência em um byte com o valor zero nele é considerada uma string C, ou string terminada em nulo.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/stringc.png" title="String C"><img src="http://www.caloni.com.br/blog/wp-content/uploads/stringc.png" alt="String C" width="628" height="429" /></a></p>
<p>Já uma mesma sequência de bytes no mesmo molde só que sem o byte final com o valor zero, mas com um byte inicial que tem como valor não um índice de caractere, mas o número de bytes subsequentes, isso é uma string Pascal, ou uma string com contador de tamanho.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/stringpascal.png" title="String Pascal"><img src="http://www.caloni.com.br/blog/wp-content/uploads/stringpascal.png" alt="String Pascal" width="631" height="405" /></a></p>
<p>Agora note por que tanto uma string vazia em Pascal e em C possuem os mesmos dados, mas informação diferente.</p>
<p>Outras strings que não necessariamente possuem terminador nulo: <a href="http://www.cplusplus.com/reference/string/string/">std::string</a>, <a href="http://msdn.microsoft.com/en-us/library/aa380518(VS.85).aspx">UNICODE_STRING</a>, <a href="http://www.driverentry.com.br/blog/2009/07/strings-no-kernel.html">strings no kernel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/strings/feed</wfw:commentRss>
		</item>
		<item>
		<title>Últimas pesquisas na blogosfera nacional</title>
		<link>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional</link>
		<comments>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional#comments</comments>
		<pubDate>Fri, 08 May 2009 10:50:40 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[Devaneando]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional</guid>
		<description><![CDATA[ É um imenso prazer constatar que hoje, mais de dez anos depois de eu ter iniciado minha caminhada pelo mundo da programação C/C++, temos uma reação de blogues e saites prontos para elucidar questões simples e avançadas dessas duas linguagens que ainda não morreram e, se depender de como as coisas andam, ainda vão [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/brasil-matrix.png" title="Mapa do Brasil com o código do filme Matrix" alt="Mapa do Brasil com o código do filme Matrix" align="left" /> É um imenso prazer constatar que hoje, mais de dez anos depois de eu ter iniciado minha caminhada pelo mundo da programação C/C++, temos uma reação de blogues e saites prontos para elucidar questões simples e avançadas dessas duas linguagens que ainda não morreram e, se depender de como as coisas andam, ainda vão durar pelo menos mais uns dez anos (sim, não sou tão otimista assim).</p>
<p>Esse artigo é só para constar em minha lista de referência para o aprendizado de C, C++ e todas as outras coisas que vem depois. Se eu tivesse que escrever isso lá no início, provavelmente recomendaria mais linques de livros e saites em inglês. Hoje, felizmente, temos um conteúdo em pleno desenvolvimento em nossa blogosfera tupiniquim. E espero que continue assim!</p>
<h4>C/C++</h4>
<ul>
<li><a href="http://bcsanches.wordpress.com/2008/12/11/strings-em-c/">Strings</a></li>
<li><a href="http://bcsanches.wordpress.com/2009/01/23/strings-e-numeros/">Strings e Números</a></li>
<li>Os <a href="http://bcsanches.wordpress.com/2008/08/27/c-type-casting-1%c2%aa-parte/">diversos</a> <a href="http://bcsanches.wordpress.com/2008/09/18/c-type-casting-2%c2%aa-parte/">tipos</a> de <a href="http://bcsanches.wordpress.com/2008/11/05/c-type-casting-3%c2%aa-e-ultima-parte/">casting</a></li>
<li><a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Pointeiros</a> e <a href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/">Referências</a></li>
<li><a href="http://www.thradams.com/codeblog/templates.pdf">Templates</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/05/29/smart-pointers-introducao/">Smart Pointer - Introdução</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/06/10/auto-pointers/">Auto Pointer (auto_ptr)</a></li>
<li>Boost <a href="http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/">Shared Pointer</a>, <a href="http://bcsanches.wordpress.com/2008/07/17/boost-weak-pointer-weak_ptr/">Weak Pointer</a> e <a href="http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/">Scoped Pointer</a></li>
<li>Boost <a href="http://bcsanches.wordpress.com/2008/07/30/boost-shared-array-e-scoped-array-shared_array-e-scoped_array/">Shared Array e Scoped Array </a></li>
<li><a href="http://devhints.blogspot.com/2008/12/c-quando-usar-cada-smart-pointer.html">Quando usar cada um dos smart pointers</a></li>
<li><a href="http://groups.google.com/group/ccppbrasil/topics">As infinitas e riquíssimas discussões na lista C/C++</a></li>
</ul>
<h4>Visual Studio</h4>
<ul>
<li><a href="http://bcsanches.wordpress.com/2009/03/06/como-utilizar-o-visual-studio-c-parte-1/">Como usar</a> o <a href="http://bcsanches.wordpress.com/2009/04/01/como-utilizar-o-visual-studio-c-parte-2/">Visual</a> <a href="http://bcsanches.wordpress.com/2009/04/22/como-utilizar-o-visual-studio-parte-3/">Studio</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/05/14/compilando-a-boost-no-windows-usando-visual-studio/">Compilando o Boost no Windows (usando Visual Studio)</a></li>
</ul>
<h4>Mais assuntos?</h4>
<p>A internet brasileira cresceu como um todo. Mesmo que você deseje saber mais sobre <a href="http://dqsoft.blogspot.com/search/label/Processadores">microprocessadores</a> ou <a href="http://www.driverentry.com.br">drivers para Windows</a>, em português, hoje isso é possível. É claro que o que não é possível é você se dedicar profissionalmente a essas áreas <a href="http://www.caloni.com.br/blog/archives/developer-you-need-to-know-english" title="Developer you need to know English">sem saber inglês</a>. Mas é uma muito bem-vinda manifestação das pessoas que fazem acontecer todas essas coisas em nosso país.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional/feed</wfw:commentRss>
		</item>
		<item>
		<title>Básico do básico: tipos</title>
		<link>http://www.caloni.com.br/blog/archives/basico-do-basico-tipos</link>
		<comments>http://www.caloni.com.br/blog/archives/basico-do-basico-tipos#comments</comments>
		<pubDate>Fri, 12 Dec 2008 17:26:01 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/basico-do-basico-tipos</guid>
		<description><![CDATA[Um tipo nada mais é que do que uma forma (ô) de bolo, que molda a memória como acharmos melhor moldá-la. Bom, para isso fazer sentido é necessário explicar memória, que é um conceito mais básico ainda.
A memória é qualquer lugar onde eu possa guardar alguma coisa. No artigo anterior era um punhado de gavetas. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/forma-de-bolo.jpg" title="Forma de bolo." alt="Forma de bolo." />Um tipo nada mais é que do que uma forma (ô) de bolo, que <strong>molda a memória</strong> como acharmos melhor moldá-la. Bom, para isso fazer sentido é necessário explicar memória, que é um conceito <strong>mais básico ainda</strong>.</p>
<p>A memória é <strong>qualquer lugar</strong> onde eu possa <strong>guardar alguma coisa</strong>. No <a href="http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros" title="Básico do básico: ponteiros">artigo anterior</a> era um punhado de <a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif" title="Imagem explicando que gavetas podem ser pedaços de memória">gavetas</a>. Mas poderiam muito bem ser caixas de presente. Ou um caderno. Ou até uma placa de memória RAM. O que sua criatividade quiser.</p>
<p>O importante no conceito de memória, computacionalmente falando, é saber que ela pode guardar qualquer tipo de informação, mas ela <strong>não sabe o que você está guardando</strong>. E eis que surge o segredo do <strong>tipo</strong>: ele conta para você, e seu programa, o que de fato está guardado na memória.</p>
<p>Vamos exemplificar.</p>
<h4>Este artigo é um punhado de números na memória</h4>
<p>Computadores trabalham muito bem com números. A própria memória só guarda valores numéricos. Porém, se é dessa forma, como conseguimos abrir o Bloco de Notas e digitar algum texto?</p>
<p>Para entender essa "mágica" é necessário vir à tona o conceito de <strong>representação</strong>, um tema que ainda pode dar muito pano pra manga quando estudarmos base numérica. Por enquanto, basta saber que uma representação é um <strong>faz-de-conta</strong> em que todos concordam com o que for dito. Por exemplo: Faz de conta que a letra 'A' é o número 65. Dessa forma, sempre que for visto o número 65, de agora em diante, será vista a letra 'A' no lugar.</p>
<p>Existem alguns faz-de-conta que são muito difundidos entre e humanidade informática. Um deles é chamado <strong>tabela ASCII</strong> (se pronuncia "ásqui"). É uma forma de todos conseguirem entender os textos de todo mundo. Abaixo podemos ver a representação de todas as letras maiúsculas na codificação ASCII:</p>
<pre>Número  Letra
======  =====
65      A
66      B
67      C
68      D
69      E
70      F
71      G
72      H
73      I
74      J
75      K
76      L
77      M
78      N
79      O
80      P
81      Q
82      R
83      S
84      T
85      U
86      V
87      W
88      X
89      Y
90      Z</pre>
<p>Agora, imagine que você digitou o seguinte texto no bloco de notas:</p>
<pre>CASA</pre>
<p>Como esse texto é guardado na memória de um computador, se ele só entende números?</p>
<p>Através da nossa já conhecida tabela ASCII! Na verdade, números são armazenados na memória, mas por representarem as letras 'C', 'A', 'S' e 'A', são traduzidos de volta para o formato texto pelo Bloco de Notas, que conhece o que guardou na memória.</p>
<p style="text-align: center"><img src="http://www.caloni.com.br/blog/wp-content/uploads/bloco-de-notas-acesando-memoria-ram.gif" alt="Bloco de Notas acessando memória RAM." /></p>
<h4>A memória pode guardar qualquer coisa com números</h4>
<p>A técnica de representação pode guardar qualquer coisa na memória como números que serão traduzidos por algum programa que consiga abrir aqueles dados. Dessa forma podemos não só armazenar texto, como imagens, vídeos, páginas web e até mesmo os próprios programas que os abrem!</p>
<p>Na programação do dia-a-dia, as coisas funcionam da mesma forma. As tão faladas variáveis reservam um espaço de memória para guardar alguma coisa, mas só sabemos o que essa alguma coisa é através do tipo da variável:</p>
<pre><font color="#339966">// a variável idade (espaço de memória)
// pode guardar um número (tipo)</font>
int idade; 

<font color="#339966">// a variável nome (espaço de memória) pode
// guardar o nome de alguém de até 99 letras (tipo)
</font>char nome[100]; 

<font color="#339966">// a variável cad (espaço de memória) pode
// guardar o cadastro de uma pessoa (tipo)
</font>Cadastro cad;</pre>
<p>Esses elementos, na memória, são um bando de número que, sem os tipos, não possuem significado algum, como podemos ver na depuração do programa abaixo:</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/interpretacao-de-memoria-texto-e-numeros.png" title="Interpretação de memória de texto e números em um programa C."><img src="http://www.caloni.com.br/blog/wp-content/uploads/interpretacao-de-memoria-texto-e-numeros.png" alt="Interpretação de memória de texto e números em um programa C." /></a></p>
<blockquote><p><em>Note que os números não estão aqui representados em decimal, onde se esperaria 35 e 42, pois a representação formal da memória geralmente está no formato hexadecimal, transformando esses números em 0x23 e 0x2a, respectivamente. Para entender essa diferença cabe estudar um pouco sobre base numérica, outro tema básico do programador sólido.</em></p></blockquote>
<h4>Practice makes perfect</h4>
<p>Nada é bem aprendido se não for apreendido. Algumas tarefas programáticas que podem fixar o conceito de tipo estão listadas abaixo:</p>
<ul>
<li>Usar <strong>printf </strong>especificando tipos diversos (%d, %s, %f, %p, ...) para a mesma variável, inclusive correndo o risco de gerar algumas exceções.</li>
<li>Usar <strong>scanf</strong> especificando diversas variáveis para o mesmo tipo (%d, %s, %f, %p, ...), vendo o resultado da leitura da entrada do usuário na memória.</li>
<li>Tentar copiar o conteúdo de uma variável para outra variável de <strong>tipo diferente</strong>. Sempre analise a memória para ver o resultado.</li>
</ul>
<h4>Outros faz-de-conta bem famosos</h4>
<ul>
<li><a href="http://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)" title="Extremidades na Wikipédia.">Ordenação de extremidades</a>: O problema Little Endian e Big Endian.</li>
<li><a href="http://pt.wikipedia.org/wiki/UNICODE" title="UNICODE na Wikipédia.">UNICODE</a>: Por um conjunto de letras universal.</li>
<li><a href="http://pt.wikipedia.org/wiki/Convers%C3%A3o_de_base_num%C3%A9rica" title="Base numérica na Wikipédia.">Base numérica</a>: O que são binário e hexadecimal e como eles afetam nossa vida.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/basico-do-basico-tipos/feed</wfw:commentRss>
		</item>
		<item>
		<title>Básico do básico: ponteiros</title>
		<link>http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros</link>
		<comments>http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros#comments</comments>
		<pubDate>Sat, 06 Dec 2008 04:42:22 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros</guid>
		<description><![CDATA[Nessas últimas semanas tenho gastado meu tempo junto da mais nova pupila da SCUA, aspirante a programadora em C e Install Shield Script. Minha tarefa? Explicar tudo, desde o mais simples, como variáveis, até as coisas não tão triviais, como símbolos de depuração.
Posso afirmar que tem sido muito compensador ativar algumas partes do meu cérebro [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/alicerces.png" title="Alicerces de uma casa." alt="Alicerces de uma casa." align="left" />Nessas últimas semanas tenho gastado meu tempo junto da mais nova pupila da <a href="http://www.scua.com.br" title="SCUA Segurança da Informação S/A">SCUA</a>, aspirante a programadora em C e Install Shield Script. Minha tarefa? Explicar tudo, desde o mais simples, como <strong>variáveis</strong>, até as coisas não tão triviais, como <strong>símbolos de depuração</strong>.</p>
<p>Posso afirmar que tem sido muito compensador ativar algumas partes do meu cérebro que acreditava nem mais existirem. Rever velhos conceitos, apesar de manjados, nos dá a oportunidade de lembrar que as coisas mais complexas que construímos no dia-a-dia se baseiam em um punhado de preceitos básicos que é essencial ter na cabeça. E nunca esquecê-los.</p>
<p>Meu amigo costuma chamar esses preceitos básicos de <strong>fundamentais</strong>. Isso por um bom motivo lógico e semântico: tudo que aprendemos de básico sobre qualquer área de conhecimento serve-nos de <strong>base</strong> para suportar as outras coisas que virão a ser entendidas na mesma área de conhecimento. Ou seja: é <strong>a parte mais importante a ser aprendida</strong>. Sem ela, a base, não nos é possível construir nada <strong>sólido</strong> e <strong>duradouro</strong>. Sem ela, toda a estrutura construída <em>a posteriori</em> se rompe e vai abaixo.</p>
<p>Foi partindo desse princípio que me preocupei com esmero para explicar as peças mais fundamentais do conhecimento em jogo, formadoras da cabeça de um programador para sempre, seja em C como em qualquer outra linguagem. E como nada é bem explicado sem formar imagens na cabeça, aproveitei para desenhar alguns esboços no papel. Aqui vão algumas explicações que estive artisticamente "documentando" para minha nova colega.</p>
<p align="center"><a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose01.jpg" title="Primeira tentativa de explicar ponteiros por desenhos da memória."><img src="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose01.thumbnail.jpg" alt="Primeira tentativa de explicar ponteiros por desenhos da memória." /></a><a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose02.jpg" title="Segunda tentativa de explicar ponteiros por desenhos da memória."><img src="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose02.thumbnail.jpg" alt="Segunda tentativa de explicar ponteiros por desenhos da memória." /></a><a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.jpg" title="Terceira tentativa de explicar ponteiros por desenhos da memória."><img src="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.thumbnail.jpg" alt="Terceira tentativa de explicar ponteiros por desenhos da memória." /></a></p>
<h4>Ponteiro: o eterno vilão da história</h4>
<p>Não tenho a presunção de conseguir explicar 100% para alguém iniciante o que são ponteiros em C, como usá-los e como se proteger deles. Definitivamente ponteiro não é um conceito simples, apesar de básico, e posso dizer sem vergonha que demorei cerca de seis meses no meu aprendizado em C pra entender completamente tudo relacionado com ponteiros. Demorou, quebrei a cabeça, mas depois nunca mais esqueci.</p>
<p>De acordo com o meu amigo <a href="http://www.sk5.com.br" title="Saite do meu amigo Rafael.">Rafael</a>, a melhor definição que usei até hoje para explicar esse conceito envolvia um armário repleto de gavetas, todas numeradas em ordem de posição (1, 2, 3...). Cada gaveta podia guardar qualquer coisa, inclusive o número de outra gaveta em um pedaço de papel. Com isso, eu poderia guardar em uma gaveta aleatória o que eu precisava guardar e escrever o "endereço" dessa gaveta em um pedaço de papel e guardá-lo na gaveta número 1, por exemplo. Com isso poderia até esquecer a posição onde está o que eu guardei, pois bastava abrir a gaveta número 1 e ler a posição em que estava essa gaveta.</p>
<p>Deve ter ficado óbvio, mas se não ficou: o armário é a memória RAM, as gavetas são váriáveis e as gavetas onde guardamos pedaços de papel são ponteiros, que não deixam de ser variáveis, e apontam para outras gavetas que são... adivinha? Outras variáveis!</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif" title="Gavetas representando posições na memória."><img src="http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif" alt="Gavetas representando posições na memória." /></a></p>
<p style="text-align: center"><a href="http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.jpg" title="Terceira tentativa de explicar ponteiros por desenhos da memória."><br />
</a></p>
<p>Outros conceitos que costumo utilizar é relacionar a memória RAM com a memória do programa e contar a memória como se contam carneirinhos. Dessa forma fica fácil pelo menos entender dois conceitos fundamentais na arte dos ponteiros: memória e endereço.</p>
<h4>Practice makes perfect</h4>
<p>O segundo passo, acredito eu, é entender como a memória é dimensionada através do programa, e como o tipo molda a representação dos bits e bytes através das ligações de silício, mas isso fica pra mais tarde. Temos que programar, e é isso que vai de fato fazer a diferença no aprendizado de uma linguagem como C. Nada como uma boa mistura de teoria e prática para gerar um concreto armado que irá suportar um <a href="http://pt.wikipedia.org/wiki/Empire_State_Building" title="Edifício Empire State">Empire State</a> de conhecimento.</p>
<p>Por isso, segue uma lista de tarefas interessantes para exercitar o conceito de ponteiros:</p>
<ul>
<li>Criar funções que modificam números passados como parâmetro.</li>
<li>Criar funções que modificam texto passado como parâmetro.</li>
<li>Alocar e desalocar memória dinamicamente.</li>
</ul>
<p>Tarefas mais específicas da minha área e que uso o tempo todo:</p>
<ul>
<li>Escrever e ler texto em arquivos.</li>
<li>Escrever e ler no registro do Windows.</li>
<li>Obter o endereço de uma função do Windows dinamicamente. E chamá-la.</li>
</ul>
<blockquote><p><em>Nota: Não use as classes superiores de C++ nem referências. Estou falando de estudar ponteiros nua e cruamente. Não seja preguiçoso. Algumas coisas devem ser feitas da maneira mais "primitiva" até se entender com o que se está lidando. Lembre-se que os melhores programadores possuem os alicerces mais fortes.</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros/feed</wfw:commentRss>
		</item>
		<item>
		<title>V</title>
		<link>http://www.caloni.com.br/blog/archives/v</link>
		<comments>http://www.caloni.com.br/blog/archives/v#comments</comments>
		<pubDate>Tue, 23 Sep 2008 03:12:21 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/v</guid>
		<description><![CDATA[Parabéns a todos que participaram e ajudaram para que todos nós chegássemos ao quinto encontro de programadores/aficionados C/C++. Parece mentira, mas hoje temos capacidade para lotar um auditório razoável, e temos a ousadia de sempre poder contar com uma grade de palestras pra lá de avançadas. Vejamos o que foi visto até hoje nesses últimos [...]]]></description>
			<content:encoded><![CDATA[<p>Parabéns a todos que participaram e ajudaram para que todos nós chegássemos ao quinto encontro de programadores/aficionados C/C++. Parece mentira, mas hoje temos capacidade para lotar um auditório razoável, e temos a ousadia de sempre poder contar com uma grade de palestras pra lá de avançadas. Vejamos o que foi visto até hoje nesses últimos três encontros (<a href="http://www.caloni.com.br/blog/archives/cppcon-iii">III</a>, <a href="http://www.caloni.com.br/blog/archives/quarto-encontro-c">IV</a> e o <a href="http://www.caloni.com.br/blog/archives/seminario-ccpp-portabilidade-e-performance">seminário</a>):</p>
<ul>
<li>C++ com WxWidgets</li>
<li>O novo padrão C++0x</li>
<li>Threads no C++ ISO</li>
<li>C e microcontroladores</li>
<li>Drivers para Windows</li>
<li>TCP/IP via Boost.Asio</li>
<li>C++ com Qt</li>
<li>Dicas de portabilidade</li>
<li>Programação concorrente</li>
<li>C++ com STL/Boost</li>
<li>Otimização de código</li>
</ul>
<p>E esse é só o começo.</p>
<h4><a href="http://www.ccppbrasil.org/wiki/Grupo:Encontro_V" title="C++ Brasil">Grade para o Quinto Encontro CCPP</a></h4>
<p><font color="#ff0000">04 de outubro de 2008, São Paulo, Brasil</font></p>
<ul>
<li>Ferramentas para programação C++ para Windows por Rodrigo Strauss</li>
<li>Programando com Conceitos no novo C++ por Leandro Melo</li>
<li>Arquivos de memória mapeada no Windows com C++ por Basílio Miranda</li>
<li>Explorando o Windows (Vista &amp; Server 2008) com C++ por Fábio Galuppo</li>
<li>Criando Linguagens Embutidas para Otimização por Felipe Almeida</li>
</ul>
<h4><a href="http://www.temporealeventos.com.br/?area=118&amp;tipo=1&amp;id=2295" title="Tempo Real">Grade para o Evento C &amp; C++ Para Sistemas Embarcados</a></h4>
<p><font color="#ff0000">08 de novembro de 2008, São Paulo, Brasil</font></p>
<ul>
<li>Técnicas de Programação em C para Sistemas Embarcados por Daniel Quadros</li>
<li>Utilização de C++ em Microcontroladores por Luiz Barros</li>
<li>Explorando os 16 bits da Microchip e as ferramentas de trabalho por Daniel Rodrigues</li>
<li>Otimização de código C para sistemas embarcados por Fábio Pereira</li>
<li>Desenvolvimento Embedded no Mundo da eLua por Dado Sutter</li>
</ul>
<p>Se repararam, o número de palestras foi acrescido de um (palestras++) e o tempo para cada uma delas foi ligeiramente encolhido. Espero que esse não seja um empecilho para o desenvolver dos assuntos, pois existem alguns bem delicados acima (como a linguagem embutida e memória mapeada) para serem explicados em cerca de uma hora.</p>
<p>É isso aí. Vida longa ao C++! (e ao C! e ao COBOL! e ao FORTRAN!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/v/feed</wfw:commentRss>
		</item>
		<item>
		<title>Reflexão em C++</title>
		<link>http://www.caloni.com.br/blog/archives/reflexao-em-c</link>
		<comments>http://www.caloni.com.br/blog/archives/reflexao-em-c#comments</comments>
		<pubDate>Mon, 30 Jun 2008 04:02:38 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/reflexao-em-c</guid>
		<description><![CDATA[





O termo e conceito de "reflection" (reflexão), muito usado em linguagens modernas, é a capacidade de um programa de observar e até de alterar sua própria estrutura. Bom, isso você pode ler na Wikipédia. O interessante é o que podemos usar desse conceito na linguagem C++.
Infelizmente não muito.
O sistema de RTTI (Run Time Type Identification), [...]]]></description>
			<content:encoded><![CDATA[





<p>O termo e conceito de "<a href="http://en.wikipedia.org/wiki/Reflection_(computer_science)"><em>reflection</em></a>" (<a href="http://pt.wikipedia.org/wiki/Reflex%C3%A3o_%28programa%C3%A7%C3%A3o%29">reflexão</a>), muito usado em linguagens modernas, é a capacidade de um programa de observar e até de alterar sua própria estrutura. Bom, isso você pode ler na Wikipédia. O interessante é o que podemos usar desse conceito na linguagem C++.</p>
<p>Infelizmente não muito.</p>
<p>O sistema de <strong>RTTI</strong> (<em>Run Time Type Identification</em>), a identificação de tipos em tempo de execução, seria o começo do <em>reflection </em>em C++. Foi um começo que não teve meio nem fim, mas existe na linguagem. Dessa forma podemos tirar algum proveito disso.</p>
<p>Um leitor pediu para que eu falasse um pouco sobre essas coisas, especificamente como se faz para obter o nome da classe de onde estamos executando um determinado método. Para esse tipo de construção podemos usar o operado <strong>typeid</strong>, que retorna informações básicas sobre um tipo de acordo com um tipo, instância ou expressão:</p>
<p><pre><span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span> <span style="color: #0000ff;">int</span> <span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
&nbsp;
	<span style="color: #0000ff;">int</span> x;
	<span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span> x <span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
&nbsp;
	<span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span> <span style="color: #000000;">2</span> + <span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<pre>C:\Tests&gt;cl typeid.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid.exe
typeid.obj

C:\Tests&gt;typeid.exe
int
int
int</pre>
<p>Dessa forma, podemos nos aproveitar do fato que todo método não-estático possui a variável implícita <strong>this</strong>, do tipo "ponteiro constante para T", onde T é o tipo da classe que contém o método sendo chamado.</p>
<p><pre><span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
class MyClass
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">public</span>:
		<span style="color: #0000ff;">void</span> MyMethod<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">&#123;</span>
			<span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span>*<span style="color: #0000ff;">this</span><span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; <span style="color: #666666;">"::MyMethod"</span> &lt;&lt; endl;
		<span style="color: #000000; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	MyClass myc;
&nbsp;
	myc.<span style="color: #000000;">MyMethod</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<pre>C:\Tests&gt;cl typeid-class.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid-class.exe
typeid-class.obj

C:\Tests&gt;typeid-class.exe
<font color="#ff0000">class MyClass::MyMethod</font></pre>
<p>Com classes não-polimórficas a coisa parece não ter muita utilidade. No entanto, essa mesma técnica pode ser aplicada em classes derivadas, uma vez que o operador typeid pode trabalhar em tempo de execução:</p>
<p><pre><span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
class MyClass
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">public</span>:
		<span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> MyMethod<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">&#123;</span>
			<span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span>*<span style="color: #0000ff;">this</span><span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; <span style="color: #666666;">"::MyMethod"</span> &lt;&lt; endl;
		<span style="color: #000000; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
class MyDerivatedClass1 : <span style="color: #0000ff;">public</span> MyClass <span style="color: #000000; font-weight: bold;">&#123;</span> <span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
class MyDerivatedClass2 : <span style="color: #0000ff;">public</span> MyClass <span style="color: #000000; font-weight: bold;">&#123;</span> <span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	MyClass* myc1 = <span style="color: #0000ff;">new</span> MyDerivatedClass1;
	MyClass* myc2 = <span style="color: #0000ff;">new</span> MyDerivatedClass2;
&nbsp;
	myc1-&gt;MyMethod<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
	myc2-&gt;MyMethod<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<pre>C:\Tests&gt;cl typeid-class2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid-class2.exe
typeid-class2.obj

C:\Tests&gt;typeid-class2.exe
<font color="#ff0000">class MyDerivatedClass1::MyMethod
class MyDerivatedClass2::MyMethod</font></pre>
<p>Apenas se lembre de ter de fato uma classe polimórfica (eu consegui isso tornando MyMethod uma função virtual). Do contrário você pode <a href="http://www.caloni.com.br/blog/archives/typeid-e-os-perigos-do-nao-polimorfismo">ter problemas</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/reflexao-em-c/feed</wfw:commentRss>
		</item>
		<item>
		<title>Declaração x definição</title>
		<link>http://www.caloni.com.br/blog/archives/declaracao-x-definicao</link>
		<comments>http://www.caloni.com.br/blog/archives/declaracao-x-definicao#comments</comments>
		<pubDate>Fri, 06 Jun 2008 12:27:33 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/declaracao-x-definicao</guid>
		<description><![CDATA[Uma diferença que eu considero crucial na linguagem C/C++ é a questão da declaração/definição (em inglês, declaration/definition). É a diferença entre esses dois conceitos que permite, por exemplo, que sejam criadas estruturas prontas para serem conectadas a listas ligadas:
struct Element
{
   int x;
   int y;
   Element* next; /* olha eu [...]]]></description>
			<content:encoded><![CDATA[<p>Uma diferença que eu considero crucial na linguagem C/C++ é a questão da declaração/definição (em inglês, <em>declaration/definition</em>). É a diferença entre esses dois conceitos que permite, por exemplo, que sejam criadas estruturas prontas para serem conectadas a listas ligadas:</p>
<pre>struct Element
{
   int x;
   int y;
   <font color="#ff0000">Element* next;</font> /* olha eu mesmo aqui! */
};</pre>
<p>Por outro lado, e mais importante ainda, é ela que permite que as funções sejam organizadas em <strong>unidades de tradução</strong> (cpps) distintas para depois se unirem durante o <em>link</em>, mesmo que entre elas exista uma relação de dependência indissociável:</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/cdepends.gif" title="cdepends.gif"><img src="http://www.caloni.com.br/blog/wp-content/uploads/cdepends.gif" alt="cdepends.gif" /></a></p>
<p>Existem diversas formas de entender esses dois conceitos. Eu prefiro explicar pela mesma experiência que temos quando descobrimos a divisão <em>hardware/software</em>:</p>
<ul>
<li><em>Hardware</em> é o que você chuta</li>
<li><em>Software</em> é o que você xinga</li>
</ul>
<p>Exatamente. <em>Hardware </em>é algo paupável, que você pode até chutar se quiser. Por exemplo, a sua memória RAM! No entanto, <em>software </em>é algo mais abstrato, que nós, seres humanos, não temos a capacidade de dar umas boas pauladas. Portanto, nos abstemos a somente xingar o maldito que fez o programa "<em>buggento</em>".</p>
<p>Da mesma forma, uma declaração em C/C++ nos permite moldar como será alguma coisa na memória, sem no entanto ocupar nem um mísero <em>byte</em> no seu programa:</p>
<pre>int func(int x, int y, int z); /* tamanho em memória: zero bytes */</pre>
<pre>struct Teste
{
	char bufao[0x100000]; /* tamanho em memória: zero bytes */
	int intao[0xffffff];  /* tamanho em memória: zero bytes */
};</pre>
<pre>extern int x; /* tamanho em memória: adivinha! */</pre>
<p>Por outro lado, a definição, o <em>hardware </em>da história, sempre ocupará alguma coisa na memória RAM, o que, de certa forma, permite que você chute uma variável (embora muitas outras também irão para o saco).</p>
<pre>int func(int x, int y, int z) /* tamanho em memória:
{
	int ret = x + y + z; /* alguns _asm add + */
	return ret;          /* um _asm ret */
}</pre>
<pre>Teste tst; /* tamanho em memória: 0x100000 + 0xffffff * 4 = 1048576 bytes */</pre>
<pre>int x; /* tamanho em memória: sizeof(int) bytes */</pre>
<p>Dessa comparação só existe uma pegadinha: uma definição também é uma declaração. Por exemplo, nos exemplos acima, além de definir func, tst e x, o código também informa ao compilador que existe uma função chamada func, que existe uma variável tst do tipo Teste e uma variável x do tipo int.</p>
<p>Informa ao compilador? Essa é uma outra ótima maneira de pensar a respeito de declarações: elas sempre estão conversando diretamente com o compilador. Por outro lado, nunca conversam diretamente com o <em>hardware, </em>pois ao executar seu código compilado, as declarações não mais existem. Foi apenas um interlúdio para que o compilador conseguisse alocar memória da maneira correta.</p>
<p>Complicado? Talvez seja, mesmo. Mas é algo que vale a pena fixar na mente. Isso, é claro, se você quiser ser um programador C/C++ mais esperto que os outros e resolver pequenos problemas de compilação que muitos perdem horas se perdendo.</p>
<h4>Corolário</h4>
<p>Então por que diabos a separação declaração/definição consegue definir coisas como listas ligadas, como no código acima? A resposta é um pouco ambígua, mas representa regra essencial na sintaxe da linguagem: após a definição do nome e do tipo de declaração envolvida podemos referenciá-la como declaração, ou seja, não ferindo a limitação de que não sabemos o tamanho de uma variável do tipo declarado. Dessa forma, é perfeitamente legal definirmos um ponteiro para uma estrutura que ainda não se sabe muita coisa, além de que é uma estrutura:</p>
<pre>struct Estrutura; /* atenção: declaração apenas! */</pre>
<pre>Estrutura* st; /* ponteiro para declaração: não sabemos o tamanho ainda */</pre>
<p>Dessa forma, o começo de uma definição de estrutura já declara o nome da estrutura antes de terminar a declaração do tipo inteiro. Bizarro, não? De qualquer forma, isso permite a construção clássica de lista ligada:</p>
<pre><font color="#ff0000">struct Estrutura</font> /* a partir daqui Estrutura já está visível */
{
	<font color="#ff0000">Estrutura* st;</font> /* recursividade? é apenas um ponteiro! */
};</pre>
<p>Se vermos pelo lado prático, de qualquer forma seria impossível definir uma variável dentro dela mesma, pois isso geraria uma recursão infinita de definições, e, como sabemos, os recurso da máquina são finitos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/declaracao-x-definicao/feed</wfw:commentRss>
		</item>
		<item>
		<title>Resultado do Seminário CCPP</title>
		<link>http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp</link>
		<comments>http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp#comments</comments>
		<pubDate>Tue, 03 Jun 2008 00:17:05 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp</guid>
		<description><![CDATA[Aconteceu nesse fim-de-semana, como era previsto, o nosso primeiro Seminário CCPP Brasil, com direito a pessoas de todas as idades e origens, mas todas com algo em comum: a paixão e o interesse pelas linguagens-mestre do mundo da programação.
Começo esse artigo agradecendo a todos os que direta e indiretamente participaram para o sucesso do evento, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminario.jpg" title="seminario.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminario.thumbnail.jpg" title="seminario.jpg" alt="seminario.jpg" align="left" /></a>Aconteceu nesse fim-de-semana, como era previsto, o nosso primeiro <a href="http://www.temporealeventos.com.br/?area=101">Seminário CCPP Brasil</a>, com direito a pessoas de todas as idades e origens, mas todas com algo em comum: a paixão e o interesse pelas linguagens-mestre do mundo da programação.</p>
<p>Começo esse artigo agradecendo a todos os que direta e indiretamente participaram para o sucesso do evento, entre eles <a href="http://www.temporealeventos.com.br/">os organizadores</a>, o <a href="http://techberto.wordpress.com/">carro-chefe</a> responsável por acordar o espírito C++ da galera no início do ano, os palestrantes e, claro, <strong>óbvio</strong>, toda a <a href="http://www.ccppbrasil.org">comunidade C++</a> que participou em corpo (vulgo <em>hardware</em>) e alma (vulgo <em>software</em>).</p>
<p>Termino a introdução fazendo uma minicrítica ao preço pago pelos participantes. Não que eu ache que seja muito, pelo contrário: dado o alto nível técnico das palestras, parece até mentira termos acesso a um evento com essa estrutura por tão pouco. Porém, o muito e o pouco são relativos, e ainda acredito que existam pessoas que não vão aos encontros por falta de recursos. Por isso mesmo vai um apelo para que nos futuros encontros tenhamos alguma forma de permitir às pessoas menos favorecidas de participar democraticamente dessa que é a expressão viva das linguagens C e C++ em nosso país.</p>
<p>Vamos às palestras!</p>
<p><strong>Dicas e Truques de Portabilidade</strong><br />
Wanderley Caloni</p>
<p>Apresentação para baixar em <a href="http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.pdf">PDF</a>, <a href="http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.ppt">PPT </a>e <a href="http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.odp">ODP</a>.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminario-caloni.jpg" title="seminario-caloni.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminario-caloni.thumbnail.jpg" title="seminario-caloni.jpg" alt="seminario-caloni.jpg" align="left" /></a>É muito difícil analisar uma palestra feita por você mesmo. É mais difícil ainda quando essa palestra é a primeira de uma batelada de argumentações de alto nível técnico que seguiram o dia. Posso dizer, no entanto, que consegui o que queria quando fui para o evento: demonstrar as dificuldades e as facilidades de tornar um código portável, independente se entre sistemas operacionais, ambientes ou compiladores.</p>
<p>Foi visto primeiramente o que faz da portabilidade uma coisa difícil. Detalhes como sintaxe e gramática fazem toda a diferença quando o que se almeja é um código limpo de imperfeições trazidas pelo ambiente de desenvolvimento. Também foi dada especial atenção às famigeradas extensões de compiladores, que fazem a linguagem parecer uma coisa que não é.</p>
<p>Por fim, foram apresentadas algumas sugestões movidas pela experiência e estudo dessas mesmas dificuldades. Para ilustrar, dois exemplos bem vivos de como um código portável deve se comportar, tanto no código-fonte quanto em sua documentação.</p>
<p><strong>Programação Concorrente com C++</strong><br />
Fábio Galuppo</p>
<p><a href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry">Artigo sobre apresentação</a></p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminario-galuppo.jpg" title="seminario-galuppo.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminario-galuppo.thumbnail.jpg" title="seminario-galuppo.jpg" alt="seminario-galuppo.jpg" align="left" /></a>Para quem está acostumado com os temas geralmente "gerenciados" de Fábio Galuppo com certeza deve ter se surpreendido com a descrição teórica dos inúmeros problemas que cercam a vida do programador <em>multithreading</em>. O palestrante partiu do mais simples, o conceito de <em>threads</em>, conceito que, segundo ele mesmo, pode ser explicado em 15 minutos, para algo mais sutil e que gera muitos erros escondidos: o conceito de <em>locks </em>(semáforos, <em>mutexes</em>, etc).</p>
<p>Os programadores em nível de sistema devem ter adorado o contexto histórico dos problemas (você sabia que o primeiro <em>lock </em>inventado foi o semáforo?) tanto quanto o contexto teórico (explicação sobre modelo de memória).</p>
<p>Um destaque especial foram os experimentos com código rodando de verdade no Visual Studio, como o exemplo que tenta criar o maior número de <em>threads </em>possível na arquitetura 64. Simplesmente assustador!</p>
<p>Se por um lado faltou tempo para explicar os usos e princípios das bibliotecas de programação paralela disponíveis e mais usadas do mercado, por outro a palestra preencheu uma lacuna importante na <a href="http://www.caloni.com.br/blog/archives/terceiro-encontro-c">minha primeira palestra</a> sobre <em>threads </em>em C++, demonstrando os erros mais comuns e o que não se deve fazer em programas que rodam mais de uma <em>thread</em>.</p>
<p>Mais uma vez voltando à teoria, a palestra foca mais uma vez em bons princípios de <em>design</em>, como o padrão de projeto monitor e a descrição dos modelos onde é justificado o uso de mais de uma <em>thread </em>no programa.</p>
<p><strong>Programação Multiplataforma Usando STL e Boost</strong><br />
Rodrigo Strauss</p>
<p><a href="http://www.1bit.com.br/content.1bit/weblog/de_volta">Artigo sobre apresentação</a></p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminari-strauss.jpg" title="seminari-strauss.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminari-strauss.thumbnail.jpg" title="seminari-strauss.jpg" alt="seminari-strauss.jpg" align="left" /></a>Como sempre, Strauss está apaixonado pelo <a href="http://www.boost.org/">Boost</a> (e a <a href="http://www.dinkumware.com/cpp.aspx">STL</a>). Descrevendo as partes mais importantes que todo programador C++ moderno deve saber sobre essas bibliotecas, ambas modernas, a palestra focou principalmente no uso do dia-a-dia, e as vantagens produtivas que o C++ atual pode ter sobre o velho e tradicional programa em C com listas encadeadas artesanais.</p>
<p>Entre as coisas mais importantes citadas, que todo programador do novo século deveria saber, estão:</p>
<ul>
<li>A total falta da necessidade de desalocarmos objetos manualmente em nossos programas, visto que o <a href="http://www.aoc.nrao.edu/~tjuerges/ALMA/STL/html/classstd_1_1auto__ptr.html">auto_ptr</a> (STL) e <a href="http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/shared_ptr.htm">shared_ptr</a> (Boost) dão conta do recado de maneira impecável.</li>
<li>A total falta da necessidade de usarmos aqueles velhos <em>arrays </em>em C que quase nunca sabemos o tamanho exato para guardar nossos valores (e que continuamente colocávamos com o tamanho 100, MAX_PATH, ou UM_OUTRO_DEFINE_COMUM_EM_LINUX). A classe <a href="http://www.boost.org/doc/libs/1_35_0/doc/html/array.html">boost::array</a> provê todas as funcionalidades básicas, além das avançadas, do uso de <em>arrays </em>tradicionais, sem qualquer <em>overhead</em> adicional de um <em>array </em>em C.</li>
<li>A total falta de necessidade de ficar convertendo <em>strings </em>e inteiros. Com a ajuda da classe <strong>std::string</strong> e de construções geniais como <a href="http://www.boost.org/doc/libs/1_35_0/libs/conversion/lexical_cast.htm">lexical_cast</a> (Boost), felizmente podemos deixar nossas velhas funções que precisavam de um <em>buffer</em>, como _itoa (embora não-padrão).</li>
</ul>
<p>Enfim, para quem pôde ver, a palestra focou nos princípios que farão hoje em dia um programador C++ completo, profissional e que, como seus colegas de outras linguagens, se preocupa igualmente com a produtividade de seu código. Ah, sim, e não gosta nem um pouco de reinventar a roda.<br />
<strong>Técnicas de Otimização de Código</strong><br />
Rodrigo Kumpera &amp; André Tupinambá</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao1.jpg" title="seminario-otimizacao1.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao1.thumbnail.jpg" title="seminario-otimizacao1.jpg" alt="seminario-otimizacao1.jpg" align="left" /></a>Aparentemente o que pensei que seria, em minha sincera opinião, um desastre (dois palestrantes falando sobre a mesma coisa) se transformou em uma combinação estupenda de teoria e prática aplicadas à arte de otimização de código. Rodrigo e André conseguiram destrinchar o tema harmoniosamente, sempre dividido entre técnicas avançadas (algumas demonstradas pela experiência dos palestrantes) e teoria disciplinar, que visa alertar o <em>wannabe</em> que otimizar pode ser uma coisa boa; porém, preste atenção aos que já fizeram isso têm a dizer.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao2.jpg" title="seminario-otimizacao2.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao2.thumbnail.jpg" title="seminario-otimizacao2.jpg" alt="seminario-otimizacao2.jpg" align="right" /></a>Com uma didática impecável, o novato nesse tema (como eu) pôde ver as dificuldades de conseguir determinar o objetivo de todo otimizador de código que, segundo eles, deve estar sempre atento na máxima de que "toda otimização é na verdade uma troca". Ou seja, se o programador quer melhor processamento, pagará com memória, se quiser otimizar espaço na RAM, irá gastar mais com processamento e/ou disco, e assim por diante.</p>
<p>Foram apresentados exemplos reais de otimização, além de dicas muito importantes sobre o comportamento das compilaçõe de cada dia.  Você sabia, por exemplo, que ao declarar em escopos mais locais suas variáveis usadas apenas em pequenos trechos de código, estará dando uma poderosa dica ao compilador para que ele consiga usar os registradores no máximo de sua capacidade?</p>
<h4>Conclusão: estamos indo de bem a melhor!</h4>
<p>Ao final, como é de praxe, tivemos um sorteio de ótimos livros sobre programação e C++ em geral, com destaque aos livros do Herb Sutter. Rodrigo Strauss, conhecido fundador dos encontros, recebeu sua mais que merecida homenagem ao receber um de seus livros autografados. É o mais novo MVP da comunidade!</p>
<p>E por falar em comunidade, e agora podemos ver claramente, estamos com uma força bem maior do que no início do ano. A seqüência de ótimos eventos, além de nossos mestres do <a href="http://groups.google.com/group/ccppbrasil">conselho Jedi</a> de programadores C++, prova finalmente que, se depender da qualidade dos desenvolvedores, o Brasil pode sim ser uma poderosa fonte de programas de qualidade que façam coisas bem mais interessantes do que acessar um banco SQL. Nós já temos a matéria-prima.</p>
<h4>Mais linques sobre o evento</h4>
<ul>
<li><a href="http://groups.google.com/group/ccppbrasil/t/ff237f0166f84115">Discussão</a> sobre o evento na nossa lista</li>
</ul>
<p align="right"><em>Imagens do evento cedidas por <a href="http://www.driverentry.com.br">Fernando Roberto</a> (valeu, Ferdinando!).</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
