<?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 PacMan &#187; programação</title>
	<atom:link href="http://pacman.blog.br/blog/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://pacman.blog.br/blog</link>
	<description>Varias Coisas, por Tiago Peczenyj</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:51:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Compatibilidade Binária em C</title>
		<link>http://pacman.blog.br/blog/programacao/compatibilidade-binaria-em-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=compatibilidade-binaria-em-c</link>
		<comments>http://pacman.blog.br/blog/programacao/compatibilidade-binaria-em-c/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 16:45:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/?p=106</guid>
		<description><![CDATA[Programar em C é sempre divertido, principalmente se vc sabe o que faz. Um exemplo disso é como trabalhar com estruturas de dados complexas, ponteiros e casting. Imaginem as duas estruturas abaixo: typedef struct &#123; int id; char name&#91;128&#93;; &#125; &#8230; <a href="http://pacman.blog.br/blog/programacao/compatibilidade-binaria-em-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Programar em C é sempre divertido, principalmente se vc sabe o que faz. Um exemplo disso é como trabalhar com estruturas de dados complexas, ponteiros e casting.</p>
<p>Imaginem as duas estruturas abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> id<span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> tpessoa<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> id<span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> rg<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> tpessoafisica<span style="color: #339933;">;</span></pre></div></div>

<p>Ok, tenho um tipo tpessoa e um tpessoafisica que representam um tipo básico (pessoa) e um tipo propositalmente extendido, especializado para algum fim (pessoa fisica). Posso ter um tipo para pessoa juridica, por exemplo.</p>
<p>Imagine que eu posso ter diversas operações com o tipo básico e, por acaso, quero utilizar também com o tipo extendido (tpessoafisica). Como fazer? Em algumas linguagens eu posso fazer isso:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">tpessoafisica x <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>...<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
tpessoa y <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>tpessoa<span style="color: #009900;">&#41;</span> x<span style="color: #339933;">;</span></pre></div></div>

<p>Entretanto em C isso gera um erro de <em>conversion to non-scalar type requested</em>. Eu posso converter int para float, float para int, int para long, char para int, etc, mas conversão de estruturas não é bem por ai: até porque não existe uma clara noção do que deveria acontecer, certo?</p>
<p>Para isso temos que clamar pelo conceito de compatibilidade binária: Sendo duas estruturas de dados, A e B, se B <em>especializa</em> A de forma ter todos os mesmos atributos <em>na ordem que foi definida</em> em A (e, opcionalmente, alguma coisa a mais no final), eu posso fazer um cast de um ponteiro do tipo B para um ponteiro do tipo A.</p>
<p>Vejamos, o tpessoafisica tem no começo os mesmos atributos (id e name) que a tpessoa e, por acaso, tem um atributos rg a mais no final. Dessa forma eu posso fazer o cast dos ponteiros na ordem apropriada.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> mostra_pessoa<span style="color: #009900;">&#40;</span>tpessoa <span style="color: #339933;">*</span>x<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Pessoa { id = %d, name = %s }<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>x<span style="color: #339933;">-&gt;</span>id<span style="color: #339933;">,</span>x<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	tpessoafisica x <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">100</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;pacman&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;666&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// cast vale para ponteiros, por isso uso o operador &amp;</span>
	mostra_pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>tpessoa <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ou seja, mostra pessoa esta preparado para receber um ponteiro do tipo tpessoa mas, graças a um habil cast de ponteiros aproveitando o principio de compatibilidade binária eu posso passar o endereço de uma estrutura diferente, no caso de tpessoafisica.</p>
<p>Perceba que eu preciso de um cast entre ponteiros, por isso eu preciso apelar para um &#038; na frente da variavel, pegando o endereço de memória associado aquela variavel. Este recurso é util em muitas situações, desde simular interfaces e herança até coisas mais divertidas como fazer <a href="http://daniel.ruoso.com/categoria/perl/smopp5-first-steps">perl 5.x rodar perl 6</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/programacao/compatibilidade-binaria-em-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hello World orientado a objetos</title>
		<link>http://pacman.blog.br/blog/programacao/hello-world-orientado-a-objetos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hello-world-orientado-a-objetos</link>
		<comments>http://pacman.blog.br/blog/programacao/hello-world-orientado-a-objetos/#comments</comments>
		<pubDate>Wed, 21 May 2008 16:47:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/hello-world-orientado-a-objetos/</guid>
		<description><![CDATA[Hoje em dia é raro um desenvolvedor conhecer bem apenas uma linguagem. Em nome da multidisciplinaridade, decidi mostrar algums exemplos do mesmo programa: uma classe HelloWord com um construtor que recebe uma mensagem (&#8220;ola mundo&#8221;) e um método show() que &#8230; <a href="http://pacman.blog.br/blog/programacao/hello-world-orientado-a-objetos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia é raro um desenvolvedor conhecer bem apenas uma linguagem. Em nome da multidisciplinaridade, decidi mostrar algums exemplos do mesmo programa: uma classe HelloWord com um construtor que recebe uma mensagem (&#8220;ola mundo&#8221;) e um método show() que imprime essa mensagem.</p>
<p>Vejamos um exemplo em C++</p>
<pre><code>#include &lt;iostream&gt;#include &lt;string&gt;using namespace std;

class HelloWorld{        string mensagem;        public:        HelloWorld(string mensagem) { // construtor!                this-&gt;mensagem = mensagem;        }

        void show() { // metodo show                cout &lt;&lt; "mensagem: " &lt;&lt; this-&gt;mensagem &lt;&lt; endl;        }};int main(){        HelloWorld obj("ola mundo");        obj.show();        return(0);}</code></pre>
<p>Agora o mesmo código em Java:</p>
<pre><code>package Hello;

public class HelloWorld{        private String mensagem;        public HelloWorld(String mensagem){                 this.mensagem = mensagem;        }        public void show() {                 System.out.println("mensagem: " + mensagem);        }        public static void main(String [] args){                HelloWorld obj = new HelloWorld("ola mundo");                obj.show();        }}</code></pre>
<p>Agora, percebam a simplicidade do Ruby:
<pre><code>class HelloWorld        def initialize(mensagem)                @mensagem = mensagem         end        def show                 puts "mensagem: #{@mensagem}"        endend

obj = HelloWorld.new "ola mundo"obj.show</code></pre>
<p>Agora em Perl (sim, Perl!)
<pre><code>package HelloWorld;

sub new{        my ($class, $mensagem) = @_;        my $self = {  mensagem =&gt; $mensagem  };        bless $self, $class; # abençoando a variavel!        return $self;}

sub show{        my $self = shift; # sim, ela vem como argumento!        print "mensagem: " . $self-&gt;{mensagem} . "\n";}

my $obj = new HelloWorld("ola mundo");$obj-&gt;show(); # parece artificial, não?

1;</code></pre>
<p>PHP também é: 
<pre><code>&lt;?php

Class HelloWorld{        var $mensagem = "";        function HelloWorld($mensagem){                $this-&gt;mensagem = $mensagem;        }        function show(){                echo "mensagem : " . $this-&gt;mensagem . "&lt;br/&gt;";        }}

$obj = new HelloWorld("ola mundo");$obj-&gt;show();?&gt;</code></pre>
<p>Por fim, vamos criar um tipo usando JavaScript
<pre><code>function HelloWorld(mensagem){        this.mensagem = mensagem;        this.show = function(){                alert("mensagem: " + this.mensagem);        }}

var obj = new HelloWorld("ola mundo");obj.show();</code></pre>
<p>Edit: Python, atendendo a diversos pedidos
<pre><code>class HelloWorld:    def __init__(self, arg):        self.message = arg

    def show(self):        print "mensagem: ", self.message

hello = HelloWorld("Ola Mundo")hello.show()</code></pre>
<p>A diferença entre uma linguagem e outra está (entre outras coisas) na sintaxe: em Perl eu tenho que criar os mecanismos na mão (com bless e receber $self) mas em Java e Ruby é tudo muito natural. Em Javascript eu não tenho uma construtor propriamente dito (muito menos classes) mas uma função (e crio um objeto dando um new nessa função). </p>
<p>Vou abordar o tema &#8220;herança&#8221; no proximo post, espero que seja útil <img src='http://pacman.blog.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/programacao/hello-world-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>TDD com Perl</title>
		<link>http://pacman.blog.br/blog/programacao/tdd-com-perl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tdd-com-perl</link>
		<comments>http://pacman.blog.br/blog/programacao/tdd-com-perl/#comments</comments>
		<pubDate>Fri, 02 May 2008 18:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/tdd-com-perl/</guid>
		<description><![CDATA[É possivel fazer Test Driven Development com Perl? Mas claro Artigo interessante sobre Test::More:http://www.testingreflections.com/node/view/5333 Tutorial bem sucinto:http://www.wgz.org/chromatic/perl/IntroTestMore.pdf Excelente apresentação:http://wellington.pm.org/archive/200606/tdd/]]></description>
			<content:encoded><![CDATA[<p>É possivel fazer Test Driven Development com Perl? Mas claro <img src='http://pacman.blog.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Artigo interessante sobre <a href="http://perldoc.perl.org/Test/More.html">Test::More</a>:<br /><a href="http://www.testingreflections.com/node/view/5333">http://www.testingreflections.com/node/view/5333</a></p>
<p>Tutorial bem sucinto:<br /><a href="http://www.wgz.org/chromatic/perl/IntroTestMore.pdf">http://www.wgz.org/chromatic/perl/IntroTestMore.pdf</a></p>
<p>Excelente apresentação:<br /><a href="http://wellington.pm.org/archive/200606/tdd/">http://wellington.pm.org/archive/200606/tdd/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/programacao/tdd-com-perl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programando em C para console &#8211; parte 1</title>
		<link>http://pacman.blog.br/blog/c/programando-em-c-para-console-parte-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=programando-em-c-para-console-parte-1</link>
		<comments>http://pacman.blog.br/blog/c/programando-em-c-para-console-parte-1/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 17:10:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/programando-em-c-para-console-parte-1/</guid>
		<description><![CDATA[(Depois de um fecundo primeiro de Abril&#8230; ) Cada vez mais eu me espanto com a quantidade de novatos que tentam fazer programas para o &#8220;modo console&#8221; que não fazem o menor sentido. Programas com menuzinho (1 &#8211; saque , &#8230; <a href="http://pacman.blog.br/blog/c/programando-em-c-para-console-parte-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>(Depois de um fecundo primeiro de Abril&#8230; )</p>
<p>Cada vez mais eu me espanto com a quantidade de novatos que tentam fazer programas para o &#8220;modo console&#8221; que não fazem o menor sentido.</p>
<p>Programas com menuzinho (1 &#8211; saque , 2 &#8211; deposito, 3 &#8211; sair) ou do estilo &#8220;digite um numero (q para sair)&#8221; são totalmente contra-produtivos. O novato perde TEMPO fazendo um monte de código desnecessário quando esquece o que deveria fazer (o tal do <span style="font-style:italic;">algoritmo</span>).</p>
<p>Veja um exemplo: um programa que receba uma quantidade variavel de números e que imprima a soma dos mesmos. IMHO a forma mais interessante para fazer isso é pegar os números como argumentos do programa principal. Vc cria um programa console absolutamente limpo e facil de scriptar, por exemplo.</p>
<p>Veja só:</p>
<pre><code>#include &lt;stdio.h&gt;

int main(int argc, char *argv[]){        double soma = 0.0;

        printf("A soma dos numeros eh %g\n",soma);

        return 0;}</code></pre>
<p>Feito esse simples arquivo, vamos compilar
<pre>$ gcc -Wall soma.c$ ./a.out 1 2 3 4 5 A soma dos numeros eh 0</pre>
<p>Ai vc fala &#8220;po, ta errado!&#8221;, mas claro, eu primeiro escrevi a base do meu programa. Perceba que eu compilei com a opção -Wall, que me informa todos os <span style="font-style:italic;">warnings</span> que a compilação pode gerar (o que sempre é uma excelente pratica, eu procuro compilar sempre com 0 warnings).</p>
<p>Feito isso, vamos definir 2 coisas:<br /> &#8211; O algoritmo da soma e<br /> &#8211; Possiveis fluxos de excessão.</p>
<p>Vou partir do suposto que, se vc digitar alguma coisa que não seja um numero, eu vou ignorar e considerar como 0. Caso eu não informe nenhum numero ao programa, isso significa que estou faltando com alguma coisa, nesse caso vou informar uma mensagem elucidativa sobre o uso do programa.</p>
<pre><code>#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;

int main(int argc, char *argv[]){        int i;        double soma = 0.0;

        if(argc == 1){                fprintf(stderr,"Faltando Argumentos!\n");                fprintf(stderr,"Uso: %s x1 [ x2 .. xN ]\n",argv[0]);                return 1;        }

        for(i=1;i&lt;argc;i++)                 soma += atof(argv[i]);

        printf("A soma dos numeros eh %g\n",soma);

        return 0;}</code></pre>
<p>Todos os argumentos que eu passo para o programa, incluindo o nome do mesmo, ficam no vetor <span style="font-weight:bold;">argv</span>, e o número de argumentos fica na variavel <span style="font-weight:bold;">arcc</span>. Dessa forma, o nome do programa é o argv[0] e, se eu não passar nenhum argumento adicional, argc será 1. A função atof converte a string para um número de ponto flutuante e retorna 0 se não for possivel converter.</p>
<p>Simples, não? Agora vamos executar:</p>
<pre>$ ./a.out          Faltando Argumentos!Uso: ./a.out x1 [ x2 .. xN ]$ echo $?1$ ./a.out 1 2 3 4 5A soma dos numeros eh 15$ echo $?0</pre>
<p>A mensagem de uso utiliza uma notação no manual de alguns programas do mundo unix: colocar os argumentos opcionais entre colchetes. Eu informo que preciso de pelo menos <span style="font-weight:bold;">um</span> argumento. Caso eu entre no fluxo de excessão, o meu main retorna um valor diferente de 0 para o sistema operacional que pode ser capturado pela variavel de ambiente $? (nesse caso estou em um linux utilizando o bash, em outros sistemas mais exotéricos como o Windows eu não imagino como vc poderia capturar essa informação, tampouco imagino se ela seria util).</p>
<p>Perceba que eu posso criar um script extremamente simples para utilizar esse programa, assim como testar o resultado é uma tarefa de um grep (ou diff). Eu poderia juntar um script de teste e um makefile nesse post mas estou esperando um exemplo um pouco mais interessante.</p>
<p>Eu criei um programa sucinto, facil de entender e muito util, sem ter que perguntar para o usuario nada. transformar esse programa num que calcula a média, por exemplo, é uma tarefa de colocar apenas uma linha (na verdade uma subtração e uma divisão) a mais. Espero que os programadores novatos se inspirem nessa forma de pensar e que utilizem os programas básicos do unix como o grep, cat, diff, cp, etc, para seus futuros trabalhos.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/c/programando-em-c-para-console-parte-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

