<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Blabos de Blebe &#187; Tecnologia</title>
	<atom:link href="http://blog.blabos.org/category/tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.blabos.org</link>
	<description>Perl, tecnologia e algum blá blá blá</description>
	<lastBuildDate>Thu, 18 Aug 2011 03:28:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Perl cada vez mais fácil</title>
		<link>http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/</link>
		<comments>http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 00:50:28 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=751</guid>
		<description><![CDATA[A minha diversão remunerada favorita é programar em Modern::Perl, algo que a cada dia fica ainda mais divertido e simples. Uma das facilidades das quais estou tirando proveito hoje é o App::cpanminus do Miyagawa. Esse aplicativo foi criado para facilitar a instalação de módulos em ambientes com restrições de recursos, portanto ele não possui muitas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">A minha diversão remunerada favorita é programar em <a href="http://www.modernperlbooks.com/">Modern::Perl</a>, algo que a cada dia fica ainda mais divertido e simples.</p>
<p style="text-align: justify">Uma das facilidades das quais estou tirando proveito hoje é o <a href="http://search.cpan.org/perldoc?App::cpanminus">App::cpanminus</a> do Miyagawa. Esse aplicativo foi criado para facilitar a instalação de módulos em ambientes com restrições de recursos, portanto ele não possui muitas dependências e tem um baixo footprint.</p>
<p style="text-align: justify">Em <a href="https://github.com/blabos/Docs/wiki/Instalando-Catalyst-com-local::lib">alguns</a> <a href="http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/">posts</a> <a href="http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/">antigos</a> eu mostrei como configurar o aplicativo cpan, instalar módulos no home do usuário e criar um mini mirror local com CPAN::mini, então como aquecimento para o Equinócio que se aproxima eu vou atualizar esses tutoriais tornando os posts anteriores obsoletos.</p>
<p><span id="more-751"></span></p>
<p style="text-align: justify">Para contextualizar os novos leitores vamos a um rápido overview das ferramentas abordadas:</p>
<ul>
<li><strong><a href="http://search.cpan.org/perldoc?cpan">cpanm</a></strong> e <strong><a href="http://search.cpan.org/perldoc?cpanm">cpanm</a></strong>: são aplicativos que automatizam a instalação de módulos Perl publicados no repositório www.cpan.org.</li>
<li><strong><a href="http://www.cpan.org">www.cpan.org</a></strong>: É o repositório de módulos Perl onde podemos encontrar (hoje) cerca de 89768 módulos escritos por cerca de 8734 autores, para as mais diversas finalidades. Frequentemente alternamos o significado da palavra cpan entre &#8220;o repositório da web&#8221; e o &#8220;aplicativo de instalação de módulos&#8221;.</li>
<li><strong><a href="http://search.cpan.org/perldoc?local::lib">local::lib</a></strong>: é um módulo (ou biblioteca) que facilita a instalação de outros módulos em diretórios que não os da instalação padrão, o que é útil quando você não possui privilégios administrativos e precisa de alguns módulos extras.</li>
<li><strong><a href="http://search.cpan.org/perldoc?CPAN::Mini">CPAN::Mini</a></strong>: é outro módulo que permite a criação de um mini repositório local com a última versão de cada módulo do cpan. Isso é muito útil quando você precisa instalar módulos em um ambiente que não possui acesso à internet.</li>
</ul>
<h3>Mão na massa</h3>
<p style="text-align: justify">Bom o primeiro passo agora, ao invés de configurar o aplicativo cpan é baixar e instalar o cpanm. Quando essa etapa é feita em conjunto com o sudo, o cpanm é instalando na árvore padrão de instalação do Perl. Para instalar no seu home basta executar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">curl <span style="color: #660033;">-L</span> http:<span style="color: #000000; font-weight: bold;">//</span>cpanmin.us <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> - App::cpanminus</pre></div></div>

<p style="text-align: justify">Entretanto isso ainda não configurou o seu ambiente. O cpanm foi instalado em <code>$HOME/perl5/bin</code>, mas seu <code>$PATH</code>, as variáveis de ambiente e o local::lib ainda não estão prontas.</p>
<p style="text-align: justify">Para instalar o módulo local::lib faça:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>cpanm <span style="color: #7a0874; font-weight: bold;">local</span>::lib</pre></div></div>

<p style="text-align: justify">Especificar o caminho completo é necessário porque ainda não adicionamos o diretório de instalação local na variável de ambiente <code>$PATH</code>. Para fazer isso executamos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify"><strong>Nota</strong>: No Mac o arquivo é o .profile ao invés do .bashrc.</p>
<p style="text-align: justify">Isso faz com que a cada login, o ambiente pergunte ao módulo local::lib onde estão os outros módulos. Note que desta vez não precisamos exportar a variável <code>PERL_MM_USE_DEFAULT</code> porque o cpanm resolve as dependências de uma forma um pouco mais esperta que o seu irmão mais velho.</p>
<p style="text-align: justify">Para finalizar esta etapa, feche o terminal e abra novamente para carregar as variáveis ou execute:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">. ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify">Agora, se você quiser configurar o mini repositório, os passos são os mesmos:</p>
<ol>
<li>Instalar o módulo CPAN::Mini;</li>
<li>Criar o arquivo de configuração para ele;</li>
<li>Executar o comando minicpan;</li>
</ol>
<p style="text-align: justify">A instalação pode ser feita com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">cpanm CPAN::Mini</pre></div></div>

<p style="text-align: justify">O arquivo de configuração (~/.minicpanrc) pode ser criado com o conteúdo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">local</span>: ~<span style="color: #000000; font-weight: bold;">/</span>minicpan
remote: http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org</pre></div></div>

<p style="text-align: justify">Daí é só executar o comando minicpan e esperar o repositório ser baixado (aproximadamente 1.5 GB).</p>
<p style="text-align: justify">Para que o <code><strong>cpanm</strong></code> aponte para o repositório local você deve invocá-lo passando com o seguinte parâmetro extra:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">cpanm <span style="color: #660033;">--mirror</span> ~<span style="color: #000000; font-weight: bold;">/</span>minicpan <span style="color: #660033;">--mirror-only</span></pre></div></div>

<p style="text-align: justify">Ou para maior conveniência criar um alias:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;alias cpanmm='cpanm --mirror ~/minicpan --mirror-only'&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify">Após recarregar o .bashrc você terá disponíveis os comandos <code><strong>cpanm</strong></code> que baixa os módulos diretamente da internet e o <code><strong>cpanmm</strong></code> que instala os módulos a partir do seu repositório local.</p>
<p style="text-align: justify">Não se esqueça de executar o comando <code><strong>minicpan</strong></code> pelo menos uma vez por semana para manter o seu repositório local atualizado.</p>
<h3>Referências:</h3>
<ul>
<li><a href="http://edencardim.com/">Eden Cardim</a></li>
<li><a href="http://search.cpan.org/perldoc?App::cpanminus">App::cpanminus</a></li>
<li><a href="http://www.cpan.org">cpan.org</a></li>
<li><a href="http://search.cpan.org/perldoc?local::lib">local::lib</a></li>
<li><a href="http://search.cpan.org/perldoc?CPAN::Mini">CPAN::Mini</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>O Caos, a Moda e o Hacker</title>
		<link>http://blog.blabos.org/2010/07/o-caos-a-moda-e-o-hacker/</link>
		<comments>http://blog.blabos.org/2010/07/o-caos-a-moda-e-o-hacker/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 20:57:45 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=725</guid>
		<description><![CDATA[O Caos Nesta sexta feira aconteceu a última aula do curso de férias de 20hs que eu e alguns amigos ministramos na FEI sobre introdução ao Linux. Gostaria de registrar mais uma vez nosso agradecimento por todo o apoio que recebemos da instituição, representada pelo Professor Plínio. O curso foi carinhosamente redefinido durante a semana [...]]]></description>
			<content:encoded><![CDATA[<h3>O Caos</h3>
<p style="text-align: justify;">Nesta sexta feira aconteceu a última aula do curso de férias de 20hs que eu e alguns amigos ministramos na <a href="http://www.fei.edu.br">FEI</a> sobre introdução ao Linux. Gostaria de registrar mais uma vez nosso agradecimento por todo o apoio que recebemos da instituição, representada pelo <a href="http://www.fei.edu.br/~plinio.aquino/">Professor Plínio</a>.</p>
<p style="text-align: justify;">O curso foi carinhosamente redefinido durante a semana como &#8220;Uma caótica e divertida introdução ao mundo Linux&#8221;, pois ao invés de nos focarmos em memorização de comandinhos, tentamos mostrar aos alunos como se virar sozinhos, habituando-os a usar o manual e deixando-os confortáveis o suficiente para experimentar.</p>
<p><span id="more-725"></span></p>
<p style="text-align: justify;">A temática foi mais ou menos no estilo de &#8220;O que acontece se eu apertar esse botão vermelho?&#8221;, onde até mesmo os instrutores faziam coisas erradas para utilizar isso como gancho para o tópico seguinte.</p>
<p style="text-align: justify;">No primeiro dia falamos para os alunos que eles não precisavam de um curso com especialistas para que pudessem explorar o sistema, então a frase mais usada foi &#8220;Não sei. Vamos procurar no man?&#8221;, seguida de uma ajudinha sobre como localizar e entender o manual corretamente.</p>
<p style="text-align: justify;">Nesse formato, interagimos sobre manuais, comandos básicos, organização do sistema de arquivos, permissões, pipes, descritores de arquivos, redirecionamento de E/S, particioamento entre outros tópicos, sempre focando nas dúvidas dos alunos, ao invés de no programa do curso, mostrando que eles poderiam destrinchar um determinado assunto tão profundamente quanto quisessem.</p>
<p style="text-align: justify;">Naturalmente, acabamos não tendo tempo de entrar em vários assuntos, mas os tópicos que não abordamos, ou os termos mais específicos eram deixados no quadro para que eles anotassem e pesquisassem por conta própria, sempre tomando o cuidado de dar uma direção, de forma que eles não ficassem perdidos ou com tudo mastigado.</p>
<p style="text-align: justify;">Na quata feira, abordamos a instalação do Linux, tomando como exemplo o Ubuntu. Até mesmo um pendrive que corrompeu algumas ISOs serviu de gancho para falarmos de checksum. Em pouco tempo eles já estavam configurando o sistema sozinhos, atualizando e instalando pacotes sem que precisássemos interferir muito.</p>
<p style="text-align: justify;">A quinta feira foi o dia mais audacioso para um curso introdutório. Focando nas necessidades dos alunos, abordamos ferramentas de desenvolvimento e debug. Demos uma visão geral das etapas de compilação, mostramos como as macros são pre-processadas, como é gerado código objeto e como os objetos são linkados. Falamos brevemente sobre cpp, gcc, ld, gdb, nm, objdump, e sobre como as bibliotecas são criadas, sem assustar com os comandos, focando nos conceitos por trás de tudo.</p>
<p style="text-align: justify;">Embora esse seja um tópico razoavelmente avançado, mostramos para os alunos que eles tinham plenas condições de entender o que estava acontecendo e se aprofundarem no assunto caso quisessem. Mostramos que existe e deixamos por conta da curiosidade de cada um.</p>
<h3>A moda</h3>
<p style="text-align: justify;">Na sexta feira trouxemos um questionamento sobre a humanidade das pessoas que operam as máquinas e sobre como a tecnologia pode ser prejudicial para elas. Tentamos fazer os alunos questionarem-se sobre o porquê de terem escolhido essa carreira.</p>
<p style="text-align: justify;">A esse bate papo seguiu-se uma sessão de perguntas sobre mercado onde foi perguntado quais tecnologias deveriam ser aprendidas para se destacar no mercado. Foi levantada a questão do conhecimento motivado pelo produto, sendo que a visão do mercado é que devemos buscar o conhecimento somente se motivados por um problema ou criação de produtos.</p>
<p style="text-align: justify;">Infelizmente, não tivemos tempo suficiente para uma discussão mais abrangente, mas neste ponto, a opinião dos instrutores diverge da opinião do mercado.</p>
<p style="text-align: justify;">Todos sabemos que a necessidade motiva. Não discordamos disto. O que não aceitamos é que a busca pelo conhecimento seja podada pela existência ou não de uma determinada necessidade.</p>
<p style="text-align: justify;">Quando estamos sujeitos às modas do mercado estamos sempre um passo atrás do que está acontecendo. Alguém determinou que a tecnologia X é o estado da arte da computação e só nos resta correr feito loucos para continuar fazendo parte do rebanho. Nós nos tornamos escravos. Seres passivos, reativos.</p>
<p style="text-align: justify;">E sem liberdade de pensamento, sem sentimentos, sem criatividade, nós perdemos aquilo que nos faz humanos. Nós nos tornamos máquinas.</p>
<p style="text-align: justify;">Querem um exemplo?</p>
<p style="text-align: justify;">Na década de 90, a moda do mercado era Delphi. Toda vez que um aluno perguntava o que deveria aprender para entrar no mercado, a resposta era: Delphi. Porque Delphi era utilizado em muitas empresas, porque a maioria das vagas em aberto eram para programadores Delphi, etc. Assim, uma massa enorme de pessoas foi estimulada a aprender uma ferramenta, sem se preocupar com base algorítmica, lógica, estrutura ou estilo. Grande parte tornou-se mão de obra barata e dispensável.</p>
<p style="text-align: justify;">Quando os ventos do mercado sopraram em uma outra direção, quem não estava realmente preparado foi varrido do mapa.</p>
<p style="text-align: justify;">Depois vieram o Java, o .NET, o Ruby, entre outros.</p>
<p style="text-align: justify;">Então você está dizendo que essas linguagens são ruins? Definitivamente não, e esse nem é o foco. A sacada é que mesmo nessas linguagens da moda, poucas pessoas estão realmente preparadas e bem posicionadas, enquanto a maioria é só mão de obra substituível e barata.</p>
<p style="text-align: justify;">O que faz um profissional ser bem sucedido é sua capacidade de resolver problemas, e não quantas ferramentas ele sabe manipular.</p>
<p style="text-align: justify;">É claro que quanto mais ferramentas à sua disposição, mais fácil tende a ser o seu trabalho, mas isso só é verdade se você possuir base o suficiente para escolher qual ferramenta se aplica e qual não se aplica. Essa talvez seja a melhor medida de competência.</p>
<p style="text-align: justify;">Voltando ao questionamento anterior, se você só buscar o conhecimento quando houver uma necessidade, você provavelmente não terá à sua disposição conteúdo suficiente para fazer uma boa escolha quando precisar. Na verdade a escolha já terá sido feita por outra pessoa e só te restará a opção de acatar e seguir, depois é claro de correr atrás para aprender o que outra pessoa decidiu que é melhor para você.</p>
<h3>Non Dvcor Dvco</h3>
<p style="text-align: justify;">Quando alguém me pergunta o que deve aprender para entrar no mercado de trabalho, em sempre me lembro da frase que está na bandeira da cidade de São Paulo: Não sou conduzido, conduzo.</p>
<p style="text-align: justify;">Então eu digo que a pergunta está invertida. Está tudo errado e essa falácia é vendida com pompa e circunstância. Você não tem que aprender nada para agradar ao mercado, na verdade o que você tem que fazer é deixar o mercado querendo ter você, te desejando.</p>
<p style="text-align: justify;">Se você fica sempre preocupado com o que os outros querem que você faça, você estará sempre um passo atrás, buscando algo que não é o que você deseja, e que assim que o vento mudar pode se tornar inútil.</p>
<p style="text-align: justify;">Pergunte ao invés disso <strong>quais as características que você precisa desenvolver para se tornar um profissional desejado</strong>. A resposta é simples. Seja excelente. Escolha aquilo que mais lhe dá prazer e dedique-se com afinco. Prepare-se, busque embasamento, não se prenda a ferramentas e comandos, procure conhecer o que está em torno do que você está fazendo. Seja curioso, <a href="http://www.istf.com.br/?page=perguntas">pergunte</a>. Aprenda a ser um <a href="http://www.linux.ime.usp.br/~rcaetano/docs/hacker-howto-pt.html">hacker</a> no verdadeiro sentido da palavra.</p>
<p style="text-align: justify;">Quando você parar de se preocupar com o que está na moda você vai perceber que há vagas que não conseguem ser preenchidas por empurradores de rato.</p>
<p style="text-align: justify;">Busque sempre o conhecimento, mesmo que sem uma aplicação óbvia, pois as grandes invenções da humanidade só foram possíveis depois de integrar idéias muitas vezes não relacionadas. Há sempre mais de uma ciência por trás de tudo que você toca.</p>
<p style="text-align: justify;">Explore com paixão o máximo de suas habilidades, que o sucesso será uma mera cosequência.</p>
<h3>Apêndice</h3>
<p style="text-align: justify;">Especialmente mas não exclusivamente para os alunos do curso, deixo alguns links interessantes:</p>
<ul>
<li><a href="http://catb.org/esr/faqs/hacker-howto.html">How To Become A Hacker</a></li>
<li><a href="http://catb.org/esr/faqs/smart-questions.html">How To Ask Questions The Smart Way</a></li>
<li><a href="http://www.unix.org/">The UNIX System</a></li>
<li><a href="http://www.gnu.org/">GNU Operating System</a></li>
<li><a href="http://www.minix3.org/">The MINIX 3 Operating System</a></li>
<li><a href="http://www.freebsd.org/">Free BSD</a></li>
<li><a href="http://kernel.org/">Linux Kernel</a></li>
<li><a href="http://www.gnu.org/software/bash/">Bash</a></li>
<li><a href="http://kornshell.com/">KornShell</a></li>
<li><a href="http://tldp.org/">The Linux Documentation Project</a></li>
<li><a href="http://tldp.org/LDP/abs/html/">Advanced Bash-Scripting Guide</a></li>
<li><a href="http://tldp.org/HOWTO/Program-Library-HOWTO/">Program Library HOWTO</a></li>
<li><a href="http://focalinux.cipsga.org.br/">Guia Foca GNU/Linux</a></li>
<li><a href="http://www.projetofedora.org/">Fedora Brasil</a></li>
<li><a href="http://www.ubuntu-br.org/">Ubuntu-BR</a></li>
<li><a href="http://www.slackware.com/">Slackware</a></li>
<li><a href="http://gcc.gnu.org/">GCC</a></li>
<li><a href="http://www.perl.org/">Perl</a></li>
<li><a href="http://www.xfree86.org/">XFree86</a></li>
<li><a href="http://www.x.org/">Xorg</a></li>
<li><a href="http://www.compiz.org/">Compiz</a></li>
<li><a href="http://git-scm.com/">Git</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2010/07/o-caos-a-moda-e-o-hacker/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando um mini-mirror do cpan com o CPAN::Mini</title>
		<link>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/</link>
		<comments>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 08:35:54 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=708</guid>
		<description><![CDATA[DEPRECATED: Este texto foi tornado obsoleto pelo texto Perl cada vez mais f&#225;cil. Online desde 26/10/1995, com 17365 módulos escritos por 7930 autores (até o momento da escrita deste post), o CPAN é o repositório oficial de módulos Perl. Nele podemos encontrar muitas vezes, centenas de módulos prontos para várias tarefas. Essa é uma das [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>DEPRECATED:</strong> Este texto foi tornado obsoleto pelo texto <a href="http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/">Perl cada vez mais f&aacute;cil</a>.</p>
<p style="text-align: justify;">Online desde 26/10/1995, com 17365 módulos escritos por 7930 autores (até o momento da escrita deste post), o <a href="http://www.cpan.org">CPAN</a> é o repositório oficial de módulos Perl. Nele podemos encontrar muitas vezes, centenas de módulos prontos para várias tarefas. Essa é uma das facilidades que fazem os programadores Perl serem tão eficientes.</p>
<p style="text-align: justify;">No entanto, a dependência de uma conexão à internet para a instalação de novos módulos, é por vezes um empecilho para a utilização desta poderosa ferramenta. Mas como em Perl sempre há mais de uma forma de se fazer, neste post mostraremos como criar um mini-mirror do cpan para ser utilizado em ambientes onde uma conexão com a internet nem sempre é possível.</p>
<p><span id="more-708"></span></p>
<p style="text-align: justify;">Depois de configurar o aplicativo cpan para instalar <a href="http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/">módulos localmente com a local::lib</a>, o primeiro passo para configurar o mirror é instalar e configurar o módulo CPAN::Mini e seus aplicativos.</p>
<p style="text-align: justify;">Existem várias formas de se configurar o minicpan. A que eu mais uso é a que é feita através de um arquivo de configuração chamado .minicpanrc que deve ser criado no diretório home do usuário. Ele possui somente duas linhas conforme abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">local: ~/minicpan
remote: http://www.cpan.org</pre></td></tr></table></div>

<p style="text-align: justify;">A primeira linha indica em qual diretório ficarão os arquivos do mirror, enquanto a segunda indica de onde as informações sobre os pacotes serão baixadas.</p>
<p style="text-align: justify;">Feito isso, podemos instalar o módulo CPAN::Mini com o comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">user@host:~$ cpan CPAN::Mini</pre></td></tr></table></div>

<p style="text-align: justify;">Depois de instalar o módulo, executamos o comando minicpan que vai sincronizar o repositório indicado no &#8216;remote&#8217; do .minicpanrc com o repositório na internet. Esta parte pode demorar entre alguns minutos e várias horas, dependendo da velocidade do seu link.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">user@host-perl:~$ minicpan
authors/01mailrc.txt.gz ... updated
modules/02packages.details.txt.gz ... updated
modules/03modlist.data.gz ... updated
authors/id/A/AA/AAYARS/Devel-Ladybug-0.406.tar.gz ... updated
authors/id/A/AA/AAYARS/CHECKSUMS ... updated
...</pre></td></tr></table></div>

<p style="text-align: justify;">A última etapa é configurar o aplicativo cpan para utilizar o nosso mirror local como primeira opção de download. Isso é feito pelo próprio prompt do cpan:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">cpan&gt; o conf urllist unshift file:///home/blabos/minicpan</pre></td></tr></table></div>

<p style="text-align: justify;">Onde /home/blabos é o diretório home do usuário, no meu caso, blabos; e minicpan é o diretório que configuramos na opção &#8216;local&#8217; do .minicpanrc.</p>
<p style="text-align: justify;">Com esses passo simples, conseguimos construir um mini-mirror do cpan para ser utilizado em ambientes com pouco ou nenhum acesso à internet. Adicionalmente, para replicar o mirror em outras máquinas, basta copiar o diretório minicpan e adicioná-lo como opção de download para o comando cpan (última etapa descrita anteriormente).</p>
<p style="text-align: justify;">Meus sinceros agradecimentos ao edenc que primeiro me falou a respeito do minicpan, ao Randal Schwartz que escreveu o script original do minicpan e ao Ricardo SIGNES que transformou o script do Randal em um módulo.</p>
<p style="text-align: justify;">Se quiser saber mais a respeito, dê uma olhada no <a href="http://www.stonehenge.com/merlyn/LinuxMag/col42.html">artigo original</a> do Randal ou na <a href="http://search.cpan.org/~rjbs/CPAN-Mini-0.576/lib/CPAN/Mini.pm">documentação online do módulo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Git e github no windows</title>
		<link>http://blog.blabos.org/2009/12/git-e-github-no-windows/</link>
		<comments>http://blog.blabos.org/2009/12/git-e-github-no-windows/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 17:33:07 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=673</guid>
		<description><![CDATA[O git é uma ferramenta open source para controle de versão de arquivos. Sua arquitetura distribuída permite que você seja mais produtivo pois não necessita de um servidor central para receber commits. O CVS foi o primeiro sistema de controle de versão com o qual trabalhei. Não sei se era pela minha inexperiência, mas ele [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O git é uma ferramenta open source para controle de versão de arquivos. Sua arquitetura distribuída permite que você seja mais produtivo pois não necessita de um servidor central para receber commits.</p>
<p style="text-align: justify;">O <a href="http://savannah.nongnu.org/projects/cvs">CVS</a> foi o primeiro sistema de controle de versão com o qual trabalhei. Não sei se era pela minha inexperiência, mas ele sempre foi mais uma pedra no sapato que uma ferramenta de trabalho.</p>
<p><span id="more-673"></span></p>
<p style="text-align: justify;">Quando conheci o <a href="http://subversion.tigris.org">Subversion</a> fiquei espantado:</p>
<p><cite>&#8220;Nossa! É possível tirar um snapshot do repositório inteiro. Uau!&#8221;</cite></p>
<p style="text-align: justify;">A parte chata era que ainda como o CVS, precisava de um servidor para onde mandar os meus commits. Assim quando eu estava sem conexão ou sem servidor, simplesmente não era possível fazer os commits, a menos é claro que eu mantivesse uma cópia do reositório na sua máquina e gerenciasse toda essa bagunça.</p>
<p style="text-align: justify;">Quando ouvi falar do git, não fiquei muito entusiasmado, mas depois do primeiro uso:</p>
<p><cite>&#8220;Caceta, eu não preciso de um servidor pra enviar commits!&#8221;</cite></p>
<p style="text-align: justify;">Eu não vou entrar das funcionalidades do git aqui, até porque esse não é o objetivo do post. Para quem quiser estudar o git há farta documentação na internet e no <a href="http://git-scm.com">site do git</a> e há um livro bem legal disponível sob Creative Commons chamado <a href="http://progit.org">Pro Git</a>.</p>
<p style="text-align: justify;">Há alguns meses eu também conheci o <a href="http://github.com">github</a>, um site source-forge-like onde você pode hospedar seus projetos versionados com git, interagir com outros desenvolvedores e muito mais.</p>
<p style="text-align: justify;">Para quem vive no mundo unix, trabalhar com o github é trivial. É so cadastrar um usuário, gerar uma chave SSH e começar a postar código.</p>
<p style="text-align: justify;">Agora se você compartilha da triste sina dos pouco afortunados que ainda não se libertaram do windows, utilizar o github é &#8230; trivial também!</p>
<p style="text-align: justify;">Para tanto é necessário que se instale o Cygwin. O Cygwin é uma ferramenta bem bacana que automatiza a instalação de aplicativos tipicamente unix no windows.</p>
<p style="text-align: justify;">O processo de instalação é bem simples. Baixe o Cygwin direto do <a href="http://www.cygwin.com/setup.exe">seu site</a>  e execute com um duplo clique (duh!!!).</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-1.png"><img title="Instalação do Cygwin - Tela inicial" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-1.png" alt="Instalação do Cygwin - Tela inicial" width="300" /></a>
</p>
<p style="text-align: justify;">Há várias opções de personalização. Eu utilizei as opções default, até chegar na tela onde se configura qual o repositório de onde o instalador vai baixar os pacotes. Aqui uma ressalva: alguns repositórios são mais rápidos que outros. Faça seus testes. Eu utilizei o http://cygwin.cibermirror.org.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-2.png"><img title="Instalação do Cygwin - Mirrors" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-2.png" alt="Instalação do Cygwin - Mirrors" width="300" /></a>
</p>
<p style="text-align: justify;">Depois na tela de seleção de pacotes, vá na aba Devel e selecione os pacotes do git.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-3.png"><img title="Instalação do Cygwin - Git" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-3.png" alt="Instalação do Cygwin - Git" width="300" /></a>
</p>
<p style="text-align: justify;">Na aba Net, selecione os pacotes do openssh.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-4.png"><img title="Instalação do Cygwin - Open SSH" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-4.png" alt="Instalação do Cygwin - Open SSH" width="300" /></a>
</p>
<p style="text-align: justify;">Next, next, finish.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-5.png"><img title="Instalação do Cygwin - Finish Him!" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-5.png" alt="Instalação do Cygwin - Finish Him!" width="300" /></a>
</p>
<p style="text-align: justify;">A partir daqui, supondo que você já tenha um usuário cadastrado no github, falta configurar as chaves de acesso. As chaves são mecanismos de segurança utilizadas pelo servidor para que ele tenha certeza que você é você mesmo. Se você ainda não tem um usuário cadastrado no github, cadastre-se <a href="https://github.com/signup/free">for free</a>.</p>
<p style="text-align: justify;">Para criar a chave basta seguir os passos do tutorial que tem no próprio github e gerar a chave. Vá em Account Settings e depois em SSH Public Keys. Há um link pequeno <strong>Need help with public keys?</strong>. O tutorial está um pouco desatualizado em relação às telas que ele mostra, mas ainda está completamente funcional.</p>
<p style="text-align: justify;">Resumindo, abra o terminal do Cygwin que você acabou de instalar, digite <strong>ssh-keygen -t rsa -C &#8220;seu_email@vai_aqui.com&#8221;</strong>, conforme mostra a figura, substituindo <strong>seu_email@vai_aqui.com</strong> pelo seu email, naturalmente, responda às perguntas e digite uma senha. Essa senha pode ser uma frase longa (recomendado) ou pode ser vazia. Ela será requisitada toda vez que você for sincronizar dados com o github.</p>
<p style="text-align: justify;">Você precisa agora enviar para o github a chave pública. Para isso abra o arquivo da chave pública &#8211; normalmente .ssh/id_rsa.pub &#8211; com o notepad, copie o texto e cole no formulário do github. Mas preste atenção, você precisa envia a chave pública. Há um .pub no final do arquivo. A chave privada &#8211; sem o .pub no final &#8211; não deve nunca se posta em público.</p>
<p style="text-align: justify;">Pronto agora você é capaz de enviar código para a sua conta no github.</p>
<p style="text-align: justify;">Atente para o detalhe que nos seus projetos há uma url pública e uma url somente sua.</p>
<p style="text-align: justify;">E bom social coding para você também.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/12/git-e-github-no-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalando módulos do CPAN via local::lib</title>
		<link>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/</link>
		<comments>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 00:52:57 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=647</guid>
		<description><![CDATA[DEPRECATED: Este texto foi tornado obsoleto pelo texto Perl cada vez mais f&#225;cil. Instalar módulos do CPAN em máquinas onde você não tem permissão de root é muito simples. Utilizando o módulo local::lib do próprio CPAN, você pode criar uma instalação local na qual os módulos são instalados no seu próprio home. Configurando o cpan [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>DEPRECATED:</strong> Este texto foi tornado obsoleto pelo texto <a href="http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/">Perl cada vez mais f&aacute;cil</a>.</p>
<p style="text-align: justify;">Instalar módulos do CPAN em máquinas onde você não tem permissão de root é muito simples. Utilizando o módulo local::lib do próprio CPAN, você pode criar uma instalação local na qual os módulos são instalados no seu próprio home.</p>
<p><span id="more-647"></span></p>
<h2>Configurando o cpan</h2>
<p style="text-align: justify;">Para isso, basta chamar um terminal e digitar o comando cpan. Ele vai mostrar uma pequena mensagem de apresentação e perguntar se você gostaria de deixá-lo configurar tudo automaticamente. Para a maioria dos casos a configuração automática é suficiente, no entanto eu vou configurar algumas opções por mim mesmo, então vou responder &#8216;no&#8217;.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">Would you like me to configure as much as possible automatically? [yes] no</pre></div></div>

<p style="text-align: justify;">A primeira opção que eu vou responder diferente da default é a que define a política de pré-requisitos (<strong>&lt;prerequisites_policy&gt;</strong>). Ela define o que o cpan deve fazer ao se deparar com um módulo que possui um dependência. O default é &#8216;ask&#8217; (perguntar).</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">Policy on building prerequisites (follow, ask or ignore)? [ask] follow</pre></div></div>

<p style="text-align: justify;">Eu vou modificar para &#8216;follow&#8217; (seguir). Assim, quando o cpan encontrar um módulo que possui alguma dependência, ao invés de me perguntar, ele vai tentar instalá-la automaticamente. Isso é extremamente útil durante instalações longas com uma árvore de dependências grande como a do Catalyst.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">Policy on installing 'build_requires' modules (yes, no, ask/yes,
ask/no)? [ask/yes] yes</pre></div></div>

<p style="text-align: justify;">Na sequência vem a pergunta sobre a instalação de dependências de build dos módulos. Eu vou alterar de &#8216;ask/yes&#8217; para &#8216;yes&#8217; para que as dependências de build também sejam instaladas. O default era perguntar e sugerir sim como resposta.</p>
<p style="text-align: justify;">A seguir vem uma sequência de perguntas sobre ferramentas que o cpan normalmente usa. Eu aproveito esse momento para checar se alguma está faltando e então instalá-la.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">Where is your bzip2 program? [/bin/bzip2]
&nbsp;
Where is your gzip program? [/bin/gzip]</pre></div></div>

<p style="text-align: justify;">Várias opções depois, a próxima que eu modifico é o charset default de ISO-8859-1 para UTF-8.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">The next option deals with the charset (aka character set) your
terminal supports. In general, CPAN is English speaking territory, so
the charset does not matter much but some CPAN have names that are
outside the ASCII range. If your terminal supports UTF-8, you should
say no to the next question. If it expects ISO-8859-1 (also known as
LATIN1) then you should say yes. If it supports neither, your answer
does not matter because you will not be able to read the names of some
authors anyway. If you answer no, names will be output in UTF-8.
&nbsp;
Your terminal expects ISO-8859-1 (yes/no)? [yes] no</pre></div></div>

<p style="text-align: justify;">O cpan vai te perguntar se ele pode se conectar à internet para baixar a lista de repositórios. Ele é bem educado quanto às coisas que ele precisa fazer, por isso estamos configurando opções que o deixem mais independente. Responda yes e aguarde ele baixar a lista de servidores.</p>
<p style="text-align: justify;">Depois de se comunicar com os servidores default, ele te pergunta sobre quais repositórios você quer configurar em três etapas. Primeiro pergunta o continente, depois o país e por último o próprio repositório. É possível escolher mais de uma opção simultaneamente. Eu escolhi para continentes América do Sul e América do Norte, para países Brasil, Chile e Estados Unidos e por último alguns repositórios em cada país. Fique à vontade para escolher quantos e quais quiser.</p>
<p style="text-align: justify;">Pronto. Agora você está no shell do cpan.</p>
<h2>Instalando o módulo local::lib</h2>
<p style="text-align: justify;">O próximo passo é instalar e configurar o módulo local::lib. Para isso digite no shell do cpan o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">cpan[1]&amp;gt; look local::lib</pre></div></div>

<p style="text-align: justify;">Isso vai fazer com o que o cpan baixe o módulo mas não instale-o automaticamente. Ao invés disso ele vai abrir um novo shell no diretório local onde ele desempacotou o módulo local::lib.</p>
<p style="text-align: justify;">Neste shell, faça o bootstrap com os seguintes comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~/.cpan/build/local-lib-1.004003-UyX2wf$ perl Makefile.PL \
--bootstrap &amp;amp;&amp;amp; make test &amp;amp;&amp;amp; make install</pre></div></div>

<p style="text-align: justify;">Por último mas não menos importante é preciso exportar algumas variáveis de ambiente. Para isso saia do shell atual (Ctrl+D), saia do shell do cpan (bye ou quit) e execute no bash o seguinte comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)'</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt;~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify;">Isso vai adicionar os comandos que exportam as variáveis de ambiente ao final do seu arquivo .bashrc, e então a cada login elas serão automaticamente exportadas.</p>
<p style="text-align: justify;">Force a re-execução do seu bashrc ou faça logout e login novamente</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$ . ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify;">Certifique-se que as variáveis de ambiente foram configuradas ou coisas estranhas podem acontecer. Entenda por &#8220;coisas estranhas&#8221; qualquer coisa diferente do funcionamento correto. Algumas podem ser realmente bizarras. <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$ <span style="color: #c20cb9; font-weight: bold;">env</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #c20cb9; font-weight: bold;">perl</span>
<span style="color: #007800;">PERL5LIB</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>perl5:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>perl5...
<span style="color: #007800;">MODULEBUILDRC</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>.modulebuildrc
<span style="color: #007800;">PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>games
<span style="color: #007800;">PERL_MM_OPT</span>=<span style="color: #007800;">INSTALL_BASE</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5
catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$</pre></div></div>

<h2>Retocando a maquiagem</h2>
<p style="text-align: justify;">Agora, antes de começar a instalar módulos, é uma boa atualizar o próprio módulo CPAN.pm. Atente para as maiúsculas e minúsculas.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ cpan CPAN
...
Installing /home/catalyst/perl5/bin/cpan
Writing /home/catalyst/perl5/lib/perl5/i486-linux-gnu-thread-multi/auto...
Appending installation info to /home/catalyst/perl5/lib/perl5/i486-linux...
  ANDK/CPAN-1.9402.tar.gz
  /usr/bin/make install  -- OK
Warning (usually harmless): 'YAML' not installed, will not store persist...
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Depois da instalação da nova versão do CPAN.pm, note que ele está avisando que o módulo YAML não está instalado. Para deixar tudo redondinho vamos intalá-lo também.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ cpan YAML
...
Writing /home/catalyst/perl5/lib/perl5/i486-linux-gnu-thread-multi/auto/Y...
Appending installation info to /home/catalyst/perl5/lib/perl5/i486-linux...
  INGY/YAML-0.68.tar.gz
  /usr/bin/make install  -- OK
CPAN: YAML loaded ok (v0.68)
Going to read 1 yaml file from /home/catalyst/.cpan/build/
DONE
Restored the state of none (in 0.0265 secs)
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Agora sim. Vamos dar uma conferida onde foi parar o módulo YAML recém instalado:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ ls ~/perl5/lib/perl5
CPAN  CPAN.pm  i486-linux-gnu-thread-multi  local  Test  YAML  YAML.pm
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Ele foi instalado dentro de uma árvore de diretórios criada no home do usuário corrente. Tudo isso sem pedir a senha de root uma única vez.</p>
<h2>Conclusão</h2>
<p style="text-align: justify;">Instalar módulos do CPAN localmente sem precisar de senha de root é muito fácil. Isso é extremamente útil em máquinas onde você tem apenas permissão de usuário comum, como em servidores de hospedagem.</p>
<p style="text-align: justify;">Uma outra vantagem é que para levar os mesmos módulos para outra máquina (com a mesma arquitetura) basta copiar o diretório perl5 que você acabou de criar, já que todos os módulos estão instalados dentro dele, bem como adicionar o comando que exporta as variáveis de ambiente na máquina destino. Isso também é bastante útil quando você tem um servidor de hospedagem que não te dá acesso a um shell.</p>
<h2>Links (in)úteis</h2>
<p style="text-align: justify;">
<ul><a href="http://github.com/blabos/Catalyst-Installation-local-lib/blob/master/lib/Catalyst/Installation/local/lib.pod"> </a></p>
<li><a href="http://search.cpan.org/~apeiron/local-lib-1.004006/lib/local/lib.pm">Módulo local::lib</a></li>
<li><a href="http://search.cpan.org/~andk/CPAN-1.9402/lib/CPAN.pm">Módulo CPAN.pm</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ponteiros e Arrays</title>
		<link>http://blog.blabos.org/2009/05/ponteiros-e-arrays/</link>
		<comments>http://blog.blabos.org/2009/05/ponteiros-e-arrays/#comments</comments>
		<pubDate>Mon, 18 May 2009 09:08:06 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=624</guid>
		<description><![CDATA[No primeiro post desta série, falamos um pouco sobre Ponteiros. No segundo, falamos de Referências. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes). Relembrando Arrays Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No primeiro post desta série, falamos um pouco sobre <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1">Ponteiros</a>. No segundo, falamos de <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-2">Referências</a>. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).</p>
<p><span id="more-624"></span></p>
<h2>Relembrando Arrays</h2>
<p style="text-align: justify;">Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). Essa abstração é organizada em formato de tabela, com linhas e colunas. Cada elemento na matriz possui coordenadas únicas (linha e coluna), de forma que um dado elemento E(i,j) representa o único elemento na posição &#8220;linha i&#8221;, &#8220;coluna j&#8221;.</p>
<p style="text-align: justify;">A sintaxe de declaração de matrizes segue abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Matrizes unidimensionais ou vetores</span>
<span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 10 elementos, do 0 ao 9</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">23</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 23 elementos, do 0 ao 22</span>
&nbsp;
<span style="color: #666666;">// Matrizes bidimensionais</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>             <span style="color: #666666;">// 2 linhas (0 a 1) e 3 colunas (0 a 2)</span>
<span style="color: #0000ff;">double</span>  dmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>            <span style="color: #666666;">// 10 linhas (0 a 9) e 2 colunas (0 a 1)</span></pre></div></div>

<p style="text-align: justify;">Cada elemento da matriz é independente dos demais e pode ser acessado conforme a sintaxe abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o quarto elemento do vetor ivet.</span>
<span style="color: #666666;">// Lembre-se que começa-se a contar a partir do elemento zero</span>
ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o segundo elemento do vetor ivet</span>
<span style="color: #0000ff;">int</span> num <span style="color: #000080;">=</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o elemento da primeira linha, segunda coluna de imat</span>
imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o elemento na terceira linha, quarta coluna de imat</span>
<span style="color: #0000ff;">int</span> foo <span style="color: #000080;">=</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Neste post não vamos discutir a fundo matrizes, vamos apenas investigar a relação entre matrizes e ponteiros de uma forma bastante intuitiva.</p>
<h2>Tamanhos de matrizes</h2>
<p style="text-align: justify;">Dado que uma matriz é uma abstração que comporta vários valores de um mesmo tipo, qual o tamanho dela? Quanto espaço ele ocupa na memória?</p>
<p style="text-align: justify;">Considere o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  dvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span>    cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(int)     = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(char)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(double)  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(ivet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>ivet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(dvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cmat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cmat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(imat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>imat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">O resultado é bastante razoável. O Espaço ocupado por uma matriz é igual ao número de elementos multiplicado pelo tamanho do tipo do elemento (linhas x colunas x sizeof(tipo)). Ora, se cada elemento é independente, supõe-se que cada um ocupe um lugar separado na memória, caso contrário um elemento sobrescreveria outro. Sendo assim, será que cada elemento possui seu próprio endereço de memória?</p>
<h2>Matrizes e endereços de memória</h2>
<p style="text-align: justify;">Para facilitar, vamos então analisar os possíveis endereços de uma matriz de caracteres, cujo tamanho de um dado único é 1 byte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'C'</span>, <span style="color: #FF0000;">'D'</span>, <span style="color: #FF0000;">'E'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o índices, valores e endereços dos dados.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Índice<span style="color: #000099; font-weight: bold;">\t</span>Valor<span style="color: #000099; font-weight: bold;">\t</span>Endereço do elemento<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>%c<span style="color: #000099; font-weight: bold;">\t</span>%p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, i, cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz denovo</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Os endereços dos elementos são sequenciais, ou seja, cada elemento é armazenado ao lado do anterior. Adicionalmente existem dois fatos ainda mais interessantes:</p>
<p style="text-align: justify;">
<ol>
<li>O endereço do array (&#038;cvet), mostrado na linha 25, é o mesmo do primeiro elemento do array;</li>
<li>A própria variável cvet pode ser interpretada como um ponteiro, como é mostrado na linha 28;</li>
</ol>
<p style="text-align: justify;">Em C++, um array comum é um bloco contíguo de memória cujo nome pode ser interpretado (cast) como um ponteiro que aponta para o seu primeiro elemento. Adicionalmente é válido fazer um ponteiro apontar para um array desde que o ponteiro destino seja para o mesmo tipo que o tipo dos elementos do array. Durante a atrubuição de um array a um ponteiro, o compilador faz uma conversão implícita de tipos. O ponteiro destino passa a ser interpretado como um ponteiro para a área de memória ocupada pelo array.</p>
<p style="text-align: justify;">Uma das consequências não tão óbvias é que durante o cast implícito, é perdida a informação de que aquela área de memória era um array. Portanto é perdida a informação do tamanho do array. Do ponto de vista do ponteiro, ele está apontando para o começo de um bloco arbitrário de memória, de um tamanho também arbitrário. Sair de um array e ir para um ponteiro significa ir de uma abstração mais restritiva e mais alto nível, para um abstração menos restritiva e mais baixo nível.</p>
<p style="text-align: justify;">Por outro lado tentar atribuir um ponteiro a um array gera um erro de compilação por tipos incompatíveis. Um array é um bloco de memória de n dados (bytes), já um ponteiro possui apenas um dado, um endereço. O compilador não tem como saber de antemão se um ponteiro aponta para uma área de 1, 2 ou 200 bytes.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Antes da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Depois da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Note que antes da atribuição (linha 25) o ponteiro <strong>pc</strong>. está nulo, pois foi inicializado assim. Já os tamanhos indicam que o array possui 300 bytes e o ponteiro apenas 8 (minha máquina é um amd 64). Após a atribuição ambos passam a &#8220;apontar&#8221; para a mesma área de memória, porém os tamanhos não mudam. Houve um cast implicito de char[300] para char*, e nessa brincadeira o ponteiro <strong>pc</strong> não tem como saber o tamanho da área de memória para o qual ele aponta. Já o array <strong>cvet</strong> continua sabendo direitinho o que ele é, sem nenhuma crise existencial.</p>
<h2>Aritmética de ponteiros &#8211; Vulgo, e daí?</h2>
<p style="text-align: justify;">Ora, mas se eu sei que os dados numa matriz estão dispostos lado a lado, eu posso utilizar um ponteiro que vai pulando para o endereço ao lado e acessando o elemento seguinte. O nome disso é aritimética de ponteiros.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>pc <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span>pc<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666;">// Agora com inteiros</span>
<span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">3</span>, <span style="color: #0000dd;">4</span>, <span style="color: #0000dd;">5</span>, <span style="color: #0000dd;">6</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pi <span style="color: #000080;">=</span> ivet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%p = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pi, <span style="color: #000040;">*</span>pi<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Em duas dimensões</span>
<span style="color: #0000ff;">char</span> cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span><span style="color: #008000;">&#125;</span>,<span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> ppc<span style="color: #008080;">;</span>
&nbsp;
ppc <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>cmat<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>ppc <span style="color: #000040;">+</span> <span style="color: #0000dd;">3</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span>j<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Na linha 18 o ponteiro <strong>pc</strong> passa a pontar para o array <strong>cvet</strong>, e consequentemente para o seu primeiro elemento, o caracter &#8216;B&#8217;. Na linha 21 o conteúdo de pc, que é o endereço onde foi armazenado o caracter &#8216;B&#8217;, é incrementado de i e em seguida de-referenciado. Na primeira passada o valor de i é zero, portanto é dereferenciado para o valor &#8216;B&#8217;. Nos passos seguintes, o endereço seguinte vai sendo de-referenciado para os outros caracteres armazenados no array original. É mais ou menos isso que internamente o compilador faz quando você utiliza a sintaxe cvet[i]. A abstração de array te dá uma forma mais amigável de tratar áreas contíguas de memória do que <strong>*(pc + i)</strong>.</p>
<p style="text-align: justify;">Mas se a abstração de array é mais simples, pra que utilizar aritmética de ponteiros?</p>
<p style="text-align: justify;">Uma das respostas está a linha 26. Ela faz a mesma coisa que a linha 21, porém um pouco mais rápido. Na sintaxe da linha 21, ou de forma semelhante, na sintaxe de array, o acesso a um dado qualquer pode ser resumido de forma bem grosseira nos comandos:</p>
<p style="text-align: justify;">
<ol>
<li>Tome o endereço base do array;</li>
<li>Adicione ao endereço o valor do índice;</li>
<li>De-referencie este novo endereço;</li>
</ol>
<p style="text-align: justify;">Já com aritmética de ponteiro ficaria assim:</p>
<p style="text-align: justify;">
<ol>
<li>De-referencie este endereço;</li>
</ol>
<p style="text-align: justify;">O comando incremento (ou a conta feita com endereços) não vou contar porque é parte do loop, embora <strong>i++;</strong> seja mais rápido que <strong>a = b + c;</strong>. Agora imagine esse pequeno ganho de 66% aplicado em uma área de dados de 1 MB. Serão mais de 2 milhões de comandos a menos!</p>
<p style="text-align: justify;">A técnica de utilizar um ponteiro para manipular uma área arbitrária de memória é utilizada geralmente em programação de baixo nível (mais próximo da máquina), manipulação de <a href="http://en.wikipedia.org/wiki/Data_buffer">buffers</a> e strings, entre outros truques sujos. Nas entranhas dos computadores, operações que varrem extensas áreas de memória, frequentemente são realizadas com aritimética de ponteiros. Nesse nível, <a href="http://en.wikipedia.org/wiki/Natural_selection">Darwin</a> reina supremo e só os mais preparados sobrevivem. A partir daqui a linguagem começa a dar um poder que só os puros de coração conseguem compreender.</p>
<p style="text-align: justify;">Uma observação importante é que entre as linhas 31 e 38 a experiência é repetida com inteiros. Note que como os inteiros possuem 4 bytes, os incrementos são automaticamente feitos de 4 em 4 bytes, e não de 1 em 1, ou seja o incremento é automaticamente calculado para sizeof(tipo). Incrementar um ponteiro significa acessar a próxima área de memória semelhante ao dado atual, e não apenas o próximo endereço. Como o tamanho de um char é um byte, quando incremetamos um ponteiro para char, avançamos apenas 1 byte. Se incrementarmos um ponteiro para double, avançaremos 8 bytes, e assim por diante.</p>
<p style="text-align: justify;">Outra observação é que uma matriz bidimensional pode ser &#8220;linearizada&#8221; conforme é mostrado nas linhas 40 a 52. Isso é útil, quando aplicável, para aproveitar melhor o cache do processador, por exemplo.</p>
<h2>void*, o <a href="http://en.wikipedia.org/wiki/Pansexuality">Pansexual</a> dos ponteiros</h2>
<p style="text-align: justify;">Anteriormente eu disse que só era possível atribuir um array a um ponteiro que fosse para o mesmo tipo que os dados do array. Eu menti descaramente! O motivo, é que para alguém que desistiu do post antes deste tópico, é mais seguro acreditar que não pode <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
<p style="text-align: justify;">Existem duas exceções à regra. A primeira é quando há uma conversão explícita de tipos e o ponteiro destino &#8220;acha&#8221; que está apontando para o tipo certo. Um exemplo está na linha 44 do código anterior.</p>
<p style="text-align: justify;">A segunda é o caso dos ponteiros para void. Um ponteiro para void é um ponteiro que não faz exigências quanto ao tipo de dados que está na área de memória para o qual ele aponta. Ele é um ponteiro pra uma área genérica de memória, algo bem baixo nível.</p>
<p style="text-align: justify;">Para utilizar um dado apontado por um ponteiro para void, antes de de-referenciá-lo, é preciso fazer um cast explícito para algum tipo válido, pois se um int* é de-referenciado para int e um char* é de-referenciado para char, adivinhe para que é de-referenciado um void*?</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span><span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Erro de compilação.</span>
<span style="color: #666666;">//*pv</span>
<span style="color: #666666;">// Quanto vale sizeof(void)?</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pv<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ponteiro para void são utilizados quando precisa-se apontar para uma área genérica de memória sem ter controle/conhecimento do tipo de dados que essa área contém, ou em funções que não podem fazer suposições sobre os tipos de seus parâmetros, como é o caso da API da lib <a href="https://computing.llnl.gov/tutorials/pthreads/">pthreads</a> (link arbitrário).</p>
<h2>Encerrando</h2>
<p style="text-align: justify;">Quanto mais nos aprofundamos nos tópicos sobre ponteiros, mais próximos da máquina ficamos. Boa parte do poder das linguagens C e C++ provém daí, e boa parte dos problemas também. A complexidade vai aumentando e os riscos também. Para muitos é aí que mora a diversão!</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/05/18/arrays.zip">arrays.zip</a> (todos os fontes do post);</li>
<li><a href="http://www.cplusplus.com/doc/tutorial/pointers/">Ponteiros no cplusplus.com</a></li>
<li><a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Ponteiros no blabos.org</a></li>
<li><a href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/">Referências no blabos.org</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/ponteiros-e-arrays/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TPM &#8211; Telepatia, Premonição e Milagre</title>
		<link>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/</link>
		<comments>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/#comments</comments>
		<pubDate>Thu, 07 May 2009 05:02:26 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Open Office]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=618</guid>
		<description><![CDATA[Certa vez trabalhei com uma equipe que cunhou a seguinte pérola: &#8220;Pra trabalhar aqui é preciso ter TPM &#8211; Telepatia, Premonição e Milagre&#8221;. Isso porque a equipe quase sempre trabalhava em duas cidades, tinha que prever as especificações de projeto que ainda não tivessem sido especificadas e por último fazer o Milagre acontecer. Os caras [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Certa vez trabalhei com uma equipe que cunhou a seguinte pérola: &#8220;Pra trabalhar aqui é preciso ter TPM &#8211; Telepatia, Premonição e Milagre&#8221;. Isso porque a equipe quase sempre trabalhava em duas cidades, tinha que prever as especificações de projeto que ainda não tivessem sido especificadas e por último fazer o Milagre acontecer. Os caras eram bons MESMO. Depois de alguns anos, hoje tive pistas de que posso ter encontrado outra equipe assim, ainda que em fase embrionária&#8230;</p>
<p><span id="more-618"></span></p>
<p style="text-align: justify;">Guardadas as devidas proporções, vamos aos fatos. Faculdade técnica, aula de humanas. Não poderia haver combinação mais explosiva. 60% da nota do semestre viria de um seminário sobre parte do livro <a href="http://www.submarino.com.br/produto/1/282969/gestao+a+brasileira?franq=275017">Gestão à Brasileira</a>. Trabalho em grupo. Grupo de 8 pessoas. Además, já que a gestão é à brasileira, o prazo para confecção do trabalho também o é. Ok, tá certo que tivemos um adiamento de uma semana por motivos de força maior, mas uma semana a mais em um prazo irrisório, continua irrisório. Mas somos brasileiros e não desistimos nunca!</p>
<p style="text-align: justify;">Eu sou um cara relativamente sortudo, de forma que pude escolher trabalhar com mais 7 pessoas de extrema competência. Tanto é que em todas as fases do <del>projeto</del> trabalho, <strong>todos</strong> estavam efetivamente envolvidos e produzindo, o que é mais incrível.</p>
<p style="text-align: justify;">Nesta fase apareceram os primeiros telepatas. Seres superiores capazes de fazer o trabalho sem terem lido o texto base, apenas pegando as idéias telepaticamente dos que leram. Os telepatas restantes surgiram na hora de fazer os slides da apresentação, pois fizemos em pedaços meticulosamente encaixáveis, telepaticamente, óbvio!</p>
<p style="text-align: justify;">Mas pessoas diferentes tem necessidades diferentes. Com 8 pessoas trabalhando em partes separadas, cada um utilizou sua suite Office&reg; preferida (2000, 2003, 2007&#8230;). Só mesmo um trouxa inventou de usar aquela porcaria do <a href="http://www.openoffice.org">Open Office</a>, aquela merda.</p>
<p style="text-align: justify;">Eis que para a surpresa de todos (inclusive do trouxa que vos fala), certa suite de escritório proprietária mostrou-se incompatível consigo mesma. Como assim Bial? Calma que o tio explica. Primeiramente a versão da SOP (suite office proprietária) onde faríamos a apresentação, especulava-se ser a 2000 (eu não fui conferir). Segundamente, eu não sei por que, eu não sei como e eu não me importo, quando tentávamos salvar na SOP 2007 um conjunto de slides no formato SOP 2003 dava uma merda federal. Era fonte preta que ficava branca, era tamanho de fonte que mudava e não me pergunte, eu não entendo do assunto, os slides com imagens e textos eram transformados em imagens.</p>
<p style="text-align: justify;">Até aí tudo bem (pelo menos pra mim que não tive que refazer slide). Montaram uma operação de guerra com pacotes instaláveis via pendrive, cds e tudo mais.</p>
<p style="text-align: justify;">Quarta feira tensa. Organicamente muito ruim pra mim. Meu dia foi começar a ficar suportável depois das 13:00hs. O que sobrou de mim, repassava o texto, fazia resumos e torcia para chegar inteiro até o momento da apresentação. Meu dia de vidente. Levo note, não levo note? Vou levar o Eee. Maldito peso extra! Outro vidente levou seu note com software proprietário. Os outros confiaram na operação de guerra com tripla redundância: CD, pendrive com SOP instalável e MP4.</p>
<p style="text-align: justify;">Eis que aos 45 do segundo tempo descobrimos que a besta que vos fala replicou 3 textos em um slide. Vamos alterar, moleza! Infelizmente a vesão da SOP do outro vidente era mais recente que versão dos arquivos. Putz, o que é mesmo interoperabilidade? E INTRAoperabilidade? E Retrocompatibilidade? Que pena, pelo visto as SOPs em questão desconhecem todos esses conceitos. Resultado: Fodeu. Não me pergunte como, texto foi salvo como imagem, fonte trocou de cor e o escambau.</p>
<p style="text-align: justify;">Já quase conformados com a idéia de ter que reformatar todo o trabalho em 15 min, resolvi abrir o arquivo em formato proprietário com aquela bosta de <a href="http://www.openoffice.org">Open Office</a>. Resultado: Milagre! O <a href="http://www.openoffice.org">Open Office</a> conseguiu recuperar boa parte do trabalho. Daí, 3 ou 4 ajustes e os slides estavam corrigidos. Só tinha um pequeno problema. A máquina onde faríamos a apresentação não entendia ODF, e salvar no formato da SOP destruía a formatação. Ah Eee, você tem saída VGA! Despluga, pluga, nada. Reboot plugado e tã-dãm! Simplesmente funciona. Eee plugado no projetor e funcionando.</p>
<p style="text-align: justify;">Moral da história: <a href="http://www.openoffice.org">Open Office</a> + Eee = Trabalho apresentado, nota garantida. Até o próximo semestre (nesta matéria).</p>
<p style="text-align: justify;">Não me pergunte porque foi tão difícil dominar uma suite office. Não me interessa. Eu não quero ler um manual de 6000 páginas pra poder fazer um conjunto de slides simples, somente com texto e imagens, sem efeitos. Não é isso que os defensores do software proprietário bradam? Que simplesmente funciona? Que o <a href="http://www.openoffice.org">Open Office</a> é uma merda? Ok, pode até ser, mas pelo menos é uma merda que fede, que faz  que se propõe a fazer. Não me interessa qual versão roda na faculdade ou na sua casa. Eu quero poder compartilhar arquivos sem surpresas com meus 7 colegas de grupo, cada um com o software que melhor lhe servir. Eu quero interoperabilidade. Não me interessa se o <a href="http://www.openoffice.org">Open Office</a> não é a borboleta coloria faiscante sueca que você quer. Eu quero que simplesmente funcione. Que seja simples. Que seja intuitivo. Que eu não precise perder tempo refatorando slide. Tempo esse que eu poderia estar estudando Cálculo, Grafos ou o que mais fosse.</p>
<p style="text-align: justify;">Não me interessa se você me chamar de burro por não conseguir fazer slide em suite sofisticada. Eu não quero ter que reservar uma área do meu cérebro para descobrir como usar um software de fazer slide, pra aula de humanas (com o devido respeito). Eu quero gastar meu cérebro entendendo como se comporta uma derivada parcial com n variáveis num espaço de m dimensões, pra entender e argumentar quando um livro de cálculo trás curvas de níveis desenhadas ao contrário. Eu quero gastar meu cérebro entendendo que apesar de uma referência existir e ocupar memória, um operador nunca opera sobre ela.</p>
<p style="text-align: justify;">Não faço Ciência da Computação pra aprender a ser operador de planilha ou arrastador de caixinha colorida.</p>
<p style="text-align: justify;">Creio que devemos umas cervejas ao pessoal do <a href="http://www.openoffice.org">Open Office</a> pelo excelente trabalho de engenharia reversa sobre formatos proprietários. Você poderiam dar umas aulas para o pessoal de certa empresa de software, pra que eles aprendam a ser mais compatíveis com eles mesmos. A partir de hoje vocês ganharam por tempo indeterminado um banner (feio que dói) no blog, na faixa.</p>
<p style="text-align: justify;">Ao pessoal do grupo meus sinceros agradecimentos por um trabalho bem feito e bem apresentado. É sempre uma honra poder trabalhar com os melhores.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ponteiros e referências em C++ parte 2</title>
		<link>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/</link>
		<comments>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/#comments</comments>
		<pubDate>Sat, 02 May 2009 06:32:51 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=578</guid>
		<description><![CDATA[Continuando com essa tentativa de série de posts sobre ponteiros e referências, que começou falando sobre Ponteiros, hoje abordaremos Referências. Uma referência é um nome alternativo para um objeto, um alias. Aliás, quem diz isso não sou eu, mas o próprio Bjarne Stroustrup, lá pelo tópico 5.5 do seu livro, cujo conteúdo é tão bom [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Continuando com essa tentativa de série de posts sobre ponteiros e referências, que começou falando sobre <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Ponteiros</a>, hoje abordaremos Referências.</p>
<p><span id="more-578"></span></p>
<p style="text-align: justify;">Uma referência é um nome alternativo para um objeto, um alias. Aliás, quem diz isso não sou eu, mas o próprio <a href="http://www.research.att.com/~bs/">Bjarne Stroustrup</a>, lá pelo tópico 5.5 do seu <a href="http://www.research.att.com/~bs/3rd.html">livro</a>, cujo conteúdo é tão bom que só fui reparar hoje que na capa tem uma onda quebrando em forma de C. Gostei dessa capa!</p>
<h2>Declarando Referências</h2>
<p style="text-align: justify;">Uma referência para um determinado tipo é declarada acrescentando-se o <strong>caracter</strong> &amp; (ê comercial ou <a href="http://en.wikipedia.org/wiki/&#038;">ampersand</a>) após o nome do tipo da referência. Note que da mesma forma que na declaração de ponteiros, estamos tratando o <strong>&amp;</strong> como um caracter de notação e não um operador. Não há um <strong>operador</strong> de declaração de ponteiros ou referências. É apenas uma notação da linguagem. Dado um tipo T, a expressão <strong>T&amp;</strong> significa <strong>Referência para T</strong>. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Declara uma variável inteira original.</span>
<span style="color: #666666;">// Também poderia ser char, float, etc.</span>
<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Declaram referências para a variável i.</span>
<span style="color: #666666;">// Todas as formas são equivalentes, mas preferimos a primeira.</span>
<span style="color: #666666;">// Note que os tipos das referências tem que ser os mesmos</span>
<span style="color: #666666;">// que os das variáveis referenciadas.</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ra     <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>rb     <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span> rc    <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Diferentemente de ponteiros, a linha abaixo gera um</span>
<span style="color: #666666;">// erro de compilação. Você saberia dizer por quê?</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>r1, <span style="color: #000040;">&amp;</span>r2<span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Embora em C++ as referências lembrem um pouco os ponteiros, eles são bem diferentes. Ao contrário do que acontece com ponteiros, uma referência precisa ser inicializada durante sua declaração. Tentar declarar uma referência sem inicializá-la gera um erro em tempo de compilação, ou seja, o compilador vai cuspir na sua cara &#8220;Perdeu playboy, perdeu!&#8221;. A única exceção a essa regra é para referências declaradas como <a href="http://en.wikipedia.org/wiki/External_variable">extern</a>, pois elas serão inicializadas em algum outro ponto do programa, mas isso é outro papo.</p>
<p style="text-align: justify;">Se você tentar trapacear declarando uma referência extern sem inicializá-la o compilador não vai reclamar. Se ela nunca for utilizada, ok. Se o compilador for esperto e notar que ela não será utilizada, pode até removê-la da lista de símbolos. Mas se ela for utilizada em qualquer parte do programa, o linker vai rir da sua cara gargalhando &#8220;undefined reference to &#8216;nome_da_variavel&#8217;&#8221;. Portanto faça as coisas direitinho. Declarou uma referência? Então iniclalize-a. extern? Tem certeza que sabe o que está fazendo?</p>
<p style="text-align: justify;">A lógica por trás disso é que uma referência foi planejada para ser um nome para alguma coisa. Se você não a inicializar, ela não será nome para nada, então não faz sentido. Um detalhe muito importante é que inicializar uma referência <strong>não</strong> é atribuir um valor a ela. Como o prório Bjarne diz, nenhum operador opera sobre referências, ou seja, não há como atribuir, somar, subtrair, etc com uma referência. Como uma referência é um apelido para um objeto, cada operador atua nese objeto, e não na referência. Uma vez inicializada, uma referência sempre referenciará o mesmo objeto.</p>
<p style="text-align: justify;">A primeira armadilha com referências, assim como ponteiros está na questão do tamanho. Enquanto o tamanho de um ponteiro (e de outras estruturas de dados) pode ser obtido com o operador sizeof, o tamanho de uma referência não pode ser obtido por técnicas convencionais, já que ao aplicar o operador sizeof em uma referência, estamos na verdade, aplicando o operador no objeto ao qual ela se referencia, conforme vimos no parágrafo anterior.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">char</span>    c<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  d<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span><span style="color: #000040;">&amp;</span>   rc <span style="color: #000080;">=</span> c<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span>    ri <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span><span style="color: #000040;">&amp;</span> rd <span style="color: #000080;">=</span> d<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// O operador sizeof diz o tamanho do tipo do seu argumento.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int:     &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char&amp;:   &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int&amp;:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>ri<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double&amp;: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>rd<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">As técnicas para obter os tamanhos das referências fogem ao escopo deste texto, mas pretendo falar sobre elas futuramente. Por hora, vou apenas dizer sem demonstrar que, quando aplicável, o tamanho de uma referência é idêntico ao tamanho de um ponteiro.</p>
<p style="text-align: justify;">A parte boa da história é que frequentemente os tamanhos de ponteiros e referências são bem menos relevantes que os tamanhos dos objetos apontados ou referenciados. Eu particularmente, nunca precisei utilizar essa informação, mas para o desenvolvimento em arquiteturas diferentes ou para sistemas embarcados, isso já se torna mais interessante.</p>
<h2>Utilizando Referências</h2>
<p style="text-align: justify;">O uso de referências já é bem mais simples que o de ponteiros, pois não são necessários operadores de extração de endereços ou de de-referenciação. Variáveis referências são utilizadas como variáveis comuns, lembrando que uma operação feita numa referência sempre afeta o objeto referenciado.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> x, y<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> rx <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ry <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
&nbsp;
x <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
y <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
&nbsp;
rx <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>    <span style="color: #666666;">// A atribuição é automaticamente aplicada em x.</span>
ry<span style="color: #000040;">++</span><span style="color: #008080;">;</span>       <span style="color: #666666;">// O incremento é automaticamente aplicado em y.</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;x:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>    <span style="color: #666666;">// Valor de x.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;y:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> y <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>    <span style="color: #666666;">// Valor de y.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;rx: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> rx <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>   <span style="color: #666666;">// Valor de rx == x.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;ry: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> ry <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>   <span style="color: #666666;">// Valor de ry == y.</span></pre></td></tr></table></div>

<p style="text-align: justify;">Utilizar uma referência é tão transparente para o programador, que ele nem precisa saber que é uma referência. Simplesmente usa como se fosse uma variável ordinária. Com minha imaginação limitada não vejo como alguém consiga ser <a href="http://en.wikipedia.org/wiki/Excommunication">excomungado</a> por utilizar referências inadequadamente. Embora sempre tenha algum <a href="http://pt.wiktionary.org/wiki/esp%C3%ADrito_de_porco">espírito de porco</a> que consiga fazer merda com referências, é muito mais fácil levar rasteira de <a href="http://pt.wikipedia.org/wiki/Saci">Saci</a> ao manusear ponteiros.</p>
<h2>Endereços e Referências</h2>
<p style="text-align: justify;">Do ponto de vista de <a href="http://en.wikipedia.org/wiki/Murphy%27s_law">Murphy</a>, as referências são feias, chatas e bobas, pois existe pouca coisa potencialmente perigosa a se fazer com elas. Nem mesmo quanto a endereçamento há muitas surpresas (será?). Considere o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ra <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> rb <span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
&nbsp;
ra <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
rb <span style="color: #000080;">=</span> <span style="color: #0000dd;">7</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;ra  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> ra <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O valor de ra == 42.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;rb  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> rb <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O valor de rb == 7.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;a   = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O valor de a == ra == 42.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;b   = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O valor de b == rb == 7.</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;a  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>a <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O endereço de a.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;b  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O endereço de b.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;ra = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>ra <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O endereço de ra == &amp;a. </span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;rb = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>rb <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O endereço de rb == &amp;b.</span></pre></td></tr></table></div>

<p style="text-align: justify;">Nas linhas 17 e 18 eu declaro duas variáveis inteiras (poderia ter feito esse exemplo com uma só&#8230;). Nas linhas 20 e 21 eu declaro duas referências, referenciando as duas variáveis anteriores. A partir desse momento as variáveis ra e rb são apenas <strong>apelidos</strong> para as variáveis a e b. Como vimos anteriormente, qualquer operador aplicado às referências, na verdade atua nos objetos referenciados, portanto cada par variável-referência possui sempre o mesmo valor.</p>
<p style="text-align: justify;">A parte interessante a se notar é que os endereços das referências são exatamente os mesmo endereços das variáveis que elas referenciam, ao contrário dos ponteiros que tinham seus próprios endereços. Por quê? Porque você caiu na <a href="http://desciclo.pedia.ws/wiki/S%C3%A9rgio_Malandro">Pegadinha do Malandro</a>. Lembra daquele papo de nenhum operador ser aplicável a uma referência? Pois bem, o <strong>&amp;</strong> utilizado aqui é o <strong>operador</strong> &#8220;endereço de&#8221;, que também é aplicado diretamente nas variáveis originais e não nas referências. As mesmas técnicas ninja utilizadas para obter os tamanhos das referências são necessárias para se obter os endereços delas.</p>
<p style="text-align: justify;">Novamente a parte divertida disso é que o mecanismo de referências foi planejado para ser o mais transparente possível para o programador. Tamanhos e endereços físicos de referências são informações irrelevantes do ponto de vista da programação &#8220;normal&#8221; em C++.</p>
<h2>Diferenças e semelhanças entre Ponteiros e Referências</h2>
<p style="text-align: justify;">Tanto ponteiros como referências são mecanismos de indireção em C++, ou seja, são mecanismos utilizados para que a partir de um dado símbolo (variável) eu seja capaz de manipular outro objeto.</p>
<p style="text-align: justify;">Os principais usos para ponteiros são geralmente relacionados com gerenciamento e manipulação dinâmica de memória, criação e destruição de objetos de formas e em momentos especiais, bem como &#8220;passagem de parâmetros por referência&#8221; (assim entre aspas mesmo). Já as referências são mais utilizadas em passagem por referência (por que será?) e sobrecarga de operadores.</p>
<p style="text-align: justify;">Basicamente, tudo que podemos fazer com referências pode ser emulado com ponteiros. Já a recíprocra não é sempre verdadeira. A grande vantagem delas no entanto, é o fato de tornarem a indireção completamente transparente ao programador.</p>
<p style="text-align: justify;">Uma alegoria interesante para ajudar a entender melhor as diferenças entre ponteiros e referências é o apelido. Por exemplo: Imagine que um pessoa, digamos, <a href="http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri">Carlos Caetano Bledorn Verri</a>, seja a nossa variável original, o objeto. <a href="http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri">Dunga</a> já é uma referência a Carlos Caetano Bledorn Verri, pois é um apelido para o mesmo objeto, são a mesma pessoa. Já a Mãe do Dunga (ou do Carlos Caetano Bledorn Verri, tanto faz), que é contantemente citada pela torcida, pode ser considerada um ponteiro para ele, pois dados determinados operadores de vocabulário, um elogio feito a ela, na verdade é <strong>indiretamente direcionado</strong> a ele.</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/referencias.zip">referencias.zip</a> (todos os fontes do post);</li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/01-declaracao.cpp">01-declaracao.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/02-tamanhos.cpp">02-tamanhos.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/03-utilizando.cpp">03-utilizando.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/04-enderecos.cpp">04-enderecos.cpp</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Testando o flash no Kubuntu 64</title>
		<link>http://blog.blabos.org/2009/04/testando-o-plugin-do-flash-kubuntu-64/</link>
		<comments>http://blog.blabos.org/2009/04/testando-o-plugin-do-flash-kubuntu-64/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 05:07:53 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=563</guid>
		<description><![CDATA[Cortesia do pessoal do charges.com.br Maldito flash&#8230; Bem, se você conseguiu ver até o final, então o plugin aguenta mesmo&#8230;]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><object width="425" height="344" data="http://www.youtube.com/v/7MJpDwJ8sEo&amp;hl=pt-br&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/7MJpDwJ8sEo&amp;hl=pt-br&amp;fs=1" /><param name="allowfullscreen" value="true" /></object>
</p>
<p style="text-align: justify;">Cortesia do pessoal do <a href="http://charges.uol.com.br/emails-comentados/2009/04/27/chuck-norris-de-bollywood">charges.com.br</a></p>
<p><span id="more-563"></span></p>
<p style="text-align: center;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/rcsf24fX8Ow&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/rcsf24fX8Ow&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p style="text-align: center;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/6MdpaoBbK8c&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/6MdpaoBbK8c&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p style="text-align: center;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/SxVCFGrNHWc&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/SxVCFGrNHWc&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p style="text-align: justify;">Maldito flash&#8230;</p>
<p style="text-align: justify;">Bem, se você conseguiu ver até o final, então o plugin aguenta mesmo&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/04/testando-o-plugin-do-flash-kubuntu-64/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ponteiros e referências em C++ parte 1</title>
		<link>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/</link>
		<comments>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 22:44:20 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=454</guid>
		<description><![CDATA[Ponteiros e referências são dois conceitos importantíssimos em ciência da computação. Eles aparecem em muitas linguagens de programação com uma roupagem ou pouco diferente, mas basicamente o tratamento é o mesmo. Em C++, habilidades com ponteiros são fundamentais. Ponteiro é um tipo especial de dado, cujas variáveis declaradas desse tipo podem apontar (ou não) para [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ponteiros e referências são dois conceitos importantíssimos em ciência da computação. Eles aparecem em muitas linguagens de programação com uma roupagem ou pouco diferente, mas basicamente o tratamento é o mesmo. Em C++, habilidades com ponteiros são fundamentais.</p>
<p><span id="more-454"></span></p>
<p style="text-align: justify;">Ponteiro é um tipo especial de dado, cujas variáveis declaradas desse tipo podem apontar (ou não) para algum outro dado na memória. Uma variável do tipo ponteiro, guarda o endereço de um outra coisa na memória. Essa coisa pode ser alguma variável, constante, início de um conjunto de dados, uma função, entre outras.</p>
<h2>Declarando Ponteiros</h2>
<p style="text-align: justify;">A declaração de um ponteiro é normalmente feita acrescentando-se um * antes do nome da variável. Uma notação muito utilizada cola o * ao nome do tipo para dizer simbolicamente que se está declarando um &#8220;ponteiro para o tipo&#8221;, ao invés de uma &#8220;variável ponteiro&#8221;, mas elas são equivalentes. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Ponteiro para um int.</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> ptr_num1<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ou assim.</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>ptr_num2<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ponteiro para um double.</span>
<span style="color: #0000ff;">double</span><span style="color: #000040;">*</span> ptr_double1<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ou assim.</span>
<span style="color: #0000ff;">double</span> <span style="color: #000040;">*</span>ptr_double2<span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Depois de declarado, o ponteiro existe, possui tamanho e consequentemente ocupa lugar na memória. O tamanho de um ponteiro geralmente é igual ao número de bits da máquina/sistema em questão, por exemplo 4 bytes num sistema 32 bits.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">char</span>    c, <span style="color: #000040;">*</span>pc<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     i, <span style="color: #000040;">*</span>pi<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  d, <span style="color: #000040;">*</span>pd<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// O operador sizeof diz o tamanho do tipo do seu argumento.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int:     &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char*:   &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int*:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pi<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double*: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pd<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<h2>Utilizando Ponteiros</h2>
<p style="text-align: justify;">Após a sua declaração, o conteúdo de um ponteiro é um valor aleatório, lixo de memória, como qualquer variável. Para que ele seja útil precisamos atribuir algo a ele. Como um ponteiro guarda um endereço de memória, precisamos atribuir a ele um endereço válido.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> x, y<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>px, <span style="color: #000040;">*</span>py<span style="color: #008080;">;</span>
&nbsp;
x <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
y <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
&nbsp;
px <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>x<span style="color: #008080;">;</span>
py <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>y<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #000040;">*</span>px <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>py<span style="color: #008000;">&#41;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>px <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>py <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>px<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>py<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">O operador <strong>&amp;</strong> (ê comercial ou  <a href="http://en.wikipedia.org/wiki/&#038;">ampersand</a>) antes do nome de uma variável significa &#8220;o endereço de&#8221;, até porque o seu nome é &#8220;endereço de&#8221;.</p>
<p style="text-align: justify;">O que está à esquerda da igualdade tem que poder guardar exatamente o mesmo tipo do que estiver do outro lado da igualdade. Um ponteiro guarda um endereço. Portanto para atribuir um endereço a um ponteiro, neste caso, é preciso obter um endereço com o operador &amp;.</p>
<p style="text-align: justify;">Exceto nos caso em que há conversão implícita de tipos (como entre tipos numéricos), atribuir a uma variável algo com um tipo diferente do seu, causa um erro de compilação. Felizmente!!!</p>
<p style="text-align: justify;">Depois que um ponteiro já apontar para um endereço válido, poderemos acessar o conteúdo desse endereço com o operador <strong>*</strong> (<a href="http://en.wikipedia.org/wiki/*">Asterisco</a>), cujo nome formal é &#8220;operador de de-referência&#8221;.</p>
<p style="text-align: justify;">Note que o asterisco em uma <strong>declaração</strong> significa &#8220;ponteiro para o tipo&#8221; e no contexto da <strong>leitura ou escrita</strong> do conteúdo de um ponteiro, significa &#8220;o conteúdo do endereço&#8221; ou &#8220;o conteúdo apontado por&#8221;. Também cuidado para não confundir com o símbolo para produto aritmético. Para não confundir, lembre-se daquela <a href="http://www.cppreference.com/wiki/operator_precedence">tabela enorme de precedência dos operadores</a>, que você só passou o olho e deixou cair no esquecimento. Nela você vai encontrar que o operador de de-referência tem precedência sobre o operador de multiplicação. Feito isso você vai se lembrar que o operador de de-referência é avaliado <strong>ANTES</strong> do operador de multiplicação.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a, b, c, <span style="color: #000040;">*</span>pa, <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
b <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
&nbsp;
pa <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>a<span style="color: #008080;">;</span>
pb <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008080;">;</span>
&nbsp;
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span> pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span> pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span> pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa<span style="color: #000040;">**</span>pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Valor da Pegadinha: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> c <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Assim quando aquela prova de algoritmos te perguntar o que faz qualquer uma das últimas 5 linhas do exemplo, você vai dizer que ela multiplica os conteúdos apontados por pa e pb. Não vai mais precisar pegar DP por causa disso! E de quebra na vida real, se você realmente precisar fazer isso, você vai salvar suas 4 gerações passadas e as 5 futuras da <a href="http://en.wikipedia.org/wiki/Excommunication">excomunhão</a>, se escolher usar a última linha.</p>
<p style="text-align: justify;">Tudo que é possível fazer com uma variável comum é possível fazer com o conteúdo apontado por um ponteiro, seja leitura ou escrita (a menos é claro que o ponteiro seja const, mas isso é outro papo&#8230;).</p>
<h2>Endereços e Ponteiros</h2>
<p style="text-align: justify;">Tomemos como exemplo o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a, b<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>pa, <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Antes de qualquer atribuição:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
&nbsp;
<span style="color: #666666;">// Tente descomentar as linhas abaixo, recompilar e rodar.</span>
<span style="color: #666666;">//printf(&quot;*pa  = %d\n&quot;, *pa); // O que será (*aleatório)?</span>
<span style="color: #666666;">//printf(&quot;*pb  = %d\n&quot;, *pb); // O que será (*aleatório)?</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Após as inicializações dos ponteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
pa <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>a<span style="color: #008080;">;</span>
pb <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa (*pa == a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (*pb == b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Após as inicializações dos inteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
b <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (10).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (13).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa (*pa == a == 10).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (*pb == b == 13).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Alterando os valores através dos ponteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #000040;">*</span>pa <span style="color: #000080;">=</span> <span style="color: #0000dd;">7</span><span style="color: #008080;">;</span>
<span style="color: #000040;">*</span>pb <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (a == *pa ==  7).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (b == *pb == 42).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa ( 7).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (42).</span></pre></td></tr></table></div>

<p style="text-align: justify;">As linhas 18 e 19 declaram respectivamnete dois inteiros e dois ponteiros para inteiros.</p>
<p style="text-align: justify;">As linhas 23 a 26 mostram os endereços das minhas variáveis. Esses endereços foram dados pelo sistema operacional e são fixos enquanto essas variáveis existirem. Uma variável não muda de endereço durante a execução do programa, mas pode mudar entre uma execução e outra. Quem define qual é esse endereço é o sistema operacional no momento da execução do programa. O compilador só sabe que serão necessários x bytes para cada variável, e qual a interpretação (tipo) que o programa vai dar a esse espaço.</p>
<p style="text-align: justify;">As linhas 30 a 33 mostram os conteúdos dessas variáveis, que ainda não foram inicializadas. É lixo, o último valor que alguém (não sei quem) colocou naqueles lugares da memória do computador e que agora pertencem às minhas variáveis.</p>
<p style="text-align: justify;">Note que não é seguro descomentar as linhas 36 e 37 pois elas tentam acessar os conteúdos apontados por pa e pb, que ainda não foram inicializados. Durante essa tentativa, o programa vai tentar interpretar aqueles valores de lixo aleatório como se fossem endereços de variáveis int válidos. Dependendo do compilador, do SO utilizado e da sua sorte, pode ser algo inofensivo ou não. O certo é que o resultado dessas linhas é imprevisível e fonte certa de problemas.</p>
<p style="text-align: justify;">Nas linhas 41 e 42 os ponteiros são inicializados com os endereços das variáveis inteiras a e b. A partir daí os prints são repetidos.</p>
<p style="text-align: justify;">Veja que os endereços dos ponteiros não mudam, o que já era esperado. O que mudam são os seus conteúdos. As variáveis pa e pb recebem os endereços de a e b respectivamente. Note que o conteúdo dos ponteiros é exatamente o valor do endereço das variáveis a e b que foram dados pelo SO no início do programa. Confira com os prints anteriores. O conteúdo apontado por pa e pb é o mesmo conteúdo de a e b, que ainda não foram inicializados, ou seja, lixo. Porém, diferentemente da etapa anterior, agora os ponteiros apontam para endereços válidos (os endereços de a e b) e ainda que os conteúdos de a e b sejam lixo de memória, os ponteiros agora apontam para variáveis que já foram alocadas.</p>
<p style="text-align: justify;">Nas linhas 61 e 62 as variáveis inteiras são inicializadas com os valores 10 e 13, e os prints repetidos denovo.</p>
<p style="text-align: justify;">Desta vez os coteúdos de a e b não são mais lixo. São valores devidamente conhecidos. Note que não há nenhuma alteração no endereçamento das variáveis em relação às etapas anteriores, apenas nos valores.</p>
<p style="text-align: justify;">Veja também que depois que a e b foram inicializados, o conteúdo apontado por pa e pb também foram alterados automaticamente. Isto acontece justamente porque pa e pb apontam para as mesmas áreas de memória utilizadas pelas variáveis pa e pb. Isso significa que o conteúdo apontado por um ponteiro pode ser modificado alterando-se o conteúdo das variáveis originais apontadas por ele. E finalmente as linhas 81 a 97 mostram que o inverso também vale, ou seja, alterando-se o conteúdo apontado por um ponteiro, altera-se automaticamente o conteúdo das variáveis originais apontadas por eles.</p>
<p style="text-align: justify;">É mais fácil entender isso pensando nas frases em português do que olhando para o código.</p>
<h2>Por enquanto&#8230;</h2>
<p style="text-align: justify;">Este foi o básico da operação com ponteiros. Ainda existem coisas interessantes para serem vistas, como ponteiros para funções, por exemplo, mas isso já é considerado um tópico mais avançado. Na sequência desta série, que está planejada para 4 posts, veremos referências, diferenças e semelhanças entre ponteiros e referências e por último ponteiros para funções.</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/ponteiros.zip">ponteiros.zip</a> (todos os fontes do post);</li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/01-declaracao.cpp">01-declaracao.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/02-tamanhos.cpp">02-tamanhos.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/03-utilizando.cpp">03-utilizando.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/04-pegadinha.cpp">04-pegadinha.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/05-enderecos.cpp">05-enderecos.cpp</a></li>
<li><a href="http://www.cplusplus.com/doc/tutorial/pointers/">Ponteiros no cplusplus.com</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

