<?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>nemediano &#187; c</title>
	<atom:link href="http://www.nemediano.com.mx/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nemediano.com.mx</link>
	<description>Reflexiones de un espiritu curioso</description>
	<lastBuildDate>Fri, 28 Oct 2011 19:07:41 +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>Un swap sin memoria extra</title>
		<link>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/</link>
		<comments>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 04:56:13 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Matematicas]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=384</guid>
		<description><![CDATA[Este es otro de los trucos que me enseño Eduardo Lemus cuando me estaba preparando para mis entrevistas en Microsoft. Se trata de hacer un cambio swap entre dos variables con la restricción de que no podemos usar ninguna variable temporal como buffer. Antes que nada quiero aclarar que este truco es una mala practica, [...]]]></description>
			<content:encoded><![CDATA[<p>Este es otro de los trucos que me enseño Eduardo Lemus cuando me estaba preparando para mis entrevistas en Microsoft. Se trata de hacer un cambio swap entre dos variables con la restricción de que no podemos usar ninguna variable temporal como buffer.</p>
<p>Antes que nada quiero aclarar que este truco es una mala practica, en la mayoría de los lugares donde lo he visto (mientras me documentaba para escribir este post) aconsejan no hacerlo. La razón, aunque el truco funciona (y como veremos adelante tiene un fundamento solido) es confuso. Es decir según los <a href="http://en.wikipedia.org/wiki/Software_engineering">IS</a> la ganancia en performance es muy poca comparada con la complicación en entender el código escrito. Además de que en computadoras modernas este truco puede ser mas lento que la solución estándar (estúpidos optimizadores de memoria).</p>
<p>Así que solo ocuparlo en código que quieran usar con fin de hacer faramalla, show e impresionar chicas. <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  O en caso de que algún entrevistador para alguna chamba se pase de listo y les pregunte como hacerlo.<br />
<span id="more-384"></span></p>
<h2>Entendiendo el problema</h2>
<p>En muchos algoritmos (por ejemplo en ordenación) es necesario intercambiar los valores de dos variables. Para simplificar el resto de la explicación asumiré <em>sin perdida de generalidad</em> (como me gusta usar esa frase <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ) que se tienen valores numéricos y enteros.</p>
<p>Es decir al principio tenemos algo como.</p>
<p>A = 2<br />
B = 4</p>
<p>Queremos llevar a cabo la operación de intercambio y obtener una situación como:</p>
<p>A = 4<br />
B = 2</p>
<h2>Como lo haría una persona normal</h2>
<p>Pues como nos enseñaron en la escuela XD. En todos los lenguajes de programación al asignación es una operación destructiva. Es decir al momento de asignar un valor a una variable se pierde el contenido anterior. (¡Estúpidas limitantes físicas del computo!).</p>
<p>Por lo que la gente que no sabe el truco haría algo así:</p>
<p>TEMP = A<br />
A = B<br />
B = TEMP</p>
<p>De esta manera tenemos un espacio de memoria extra donde guardar el valor de A, por lo tanto podemos destruir el contenido de A sin tentarnos nuestro corazoncillo. Y recuperarlo después del buffer temporal.</p>
<p>Ahora lo interesante: ¿Cómo se hace sin usar ninguna variable TEMP?</p>
<h2>La solución del matemático.</h2>
<p>Ahora si ustedes son de esas personas que saben un montón de matemáticas, pero jamas han programado de a de veras (¡Como los hombres!) podrían sugerir esta solución. (No se hagan se que por ahí hay muchísimos).</p>
<p>A = A + B<br />
B = A &#8211; B<br />
A = A &#8211; B</p>
<p>Ahora sabemos que ésta es un caso particular de una solución mas general.</p>
<ol>
<li>Combina los dos valores en la variable A por medio de una operación binaria bien portada (Es decir que sea invertible). En este momento en A están guardados de alguna manera los dos valores.</li>
<li>Usa la operación inversa de la operación binaria para extraer en la variable B el valor original de A a partir del valor actual de A. Recuerda que no hemos modificado B.</li>
<li>Usa la operación inversa para extraer ahora el viejo valor de B en A. Recordando que tenemos guardado en B el valor original de A.</li>
</ol>
<p>El fallo de la solución anterior es que trabajamos con maquinas de memoria finita, es decir podría pasar que la operación bien portada que es la suma produzca un número tan grande que no quepa en la localidad de memoria que le guardamos. ¿No se acuerdan del molesto carry cuando nos enseñaron la suma en binario y  hacer circuitos sumadores? Pues es aquí donde nos vino a fastidiar la vida.</p>
<h2>La solución del computólogo</h2>
<p>Tan simple, tan elegante, tan parecida a la solución del matemático XD (Por ahí dicen que es la misma por que los computologos y los matemáticos son casi lo mismo ). Pues resulta que hay mas de una operación bien portada y una que tiene todo lo que necesitamos es el XOR.</p>
<table>
<tr>
<th>x</th>
<th>y</th>
<th>x<img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus+&bg=FFFFFF&fg=000000'  alt="\oplus " />y</th>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
</table>
<p>¡Muérete de envidia suma! ¡El XOR es una suma sin carry vean la tabla!. ¿Suficiente? El XOR (conocido también en los bajos mundos de la lógica como <strong>disyunción exclusiva</strong>) es una de las operaciones que pueden construir toda la lógica de primer orden, además es conmutativo, asociativo y es su propio inverso. Pueden ver aquí la lista de <a href="http://en.wikipedia.org/wiki/Xor">todo lo bello que es el XOR</a>. Es mas: ¡XOR soy tu fan!</p>
<p>Es decir podemos usar el XOR que como no tiene carry y nunca se desborda para hacer</p>
<p>A = A <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> B<br />
B = B <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> A<br />
A = A <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> B</p>
<p>¿Mencione que es conmutativo y que es su propio inverso? Además que en todo lenguaje decente como en C y C++ y en algunos no decentes (Java <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) Tenemos un operador de XOR y tenemos una forma abreviada de hacer la asignación. ¿No me creen? Miren con sus propios ojos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">4</span>, b <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</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;Los valores son: a = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <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>
&nbsp;
	swap<span style="color: #008000;">&#40;</span>a, b<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;Después del swap:&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;Los valores son: a = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <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>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> swap <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>a, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	a <span style="color: #000040;">^</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
	b <span style="color: #000040;">^</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	a <span style="color: #000040;">^</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Y para que no digan que no pelo a la banda Javera, tomen no se vallan a enojar.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestSwaping <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span>, b <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Los valores son: a = &quot;</span> <span style="color: #339933;">+</span> a <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; b = &quot;</span> <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		a <span style="color: #339933;">^=</span> b<span style="color: #339933;">;</span>
		b <span style="color: #339933;">^=</span> a<span style="color: #339933;">;</span>
		a <span style="color: #339933;">^=</span> b<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Después del swap&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Los valores son: a = &quot;</span> <span style="color: #339933;">+</span> a <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; b = &quot;</span> <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mas información sobre la correctez y demás cosas de este truco esta en su <a href="http://en.wikipedia.org/wiki/XOR_swap_algorithm">pagina wikipedia</a>.<br />
﻿</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2011%2Fun-swap-sin-memoria-extra%2F&amp;t=Un%20swap%20sin%20memoria%20extra" id="facebook_share_icon_384" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	<!--
	var button = document.getElementById('facebook_share_link_384') || document.getElementById('facebook_share_icon_384') || document.getElementById('facebook_share_both_384') || document.getElementById('facebook_share_button_384');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_384') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	-->
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilizando Geany para hacer codigo de C y C++</title>
		<link>http://www.nemediano.com.mx/2007/utilizando-geany-para-hacer-codigo-de-c-y-c/</link>
		<comments>http://www.nemediano.com.mx/2007/utilizando-geany-para-hacer-codigo-de-c-y-c/#comments</comments>
		<pubDate>Sat, 22 Sep 2007 01:53:45 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[geany]]></category>
		<category><![CDATA[Ide]]></category>
		<category><![CDATA[opengl]]></category>

		<guid isPermaLink="false">http://nemediano.wordpress.com/2007/09/22/utilizando-geany-para-hacer-codigo-de-c-y-c/</guid>
		<description><![CDATA[Un editor que a mi me gusta mucho usar para escribir mis programas de C, que comúnmente llevan OpenGL es Geany, se trata de un editor muy ligero y sencillo de usar, esta escrito en GTK, por lo que corre independientemente de cualquier manejador de ventanas que estemos usando (ya sea Gnome, Xfce, o KDE), [...]]]></description>
			<content:encoded><![CDATA[<p>Un editor que a mi me gusta mucho usar para escribir mis programas de C, que comúnmente llevan OpenGL es <a title="Pagina oficial de Geany" href="http://geany.uvena.de/" target="_blank">Geany</a>, se trata de un editor muy ligero y sencillo de usar, esta escrito en GTK, por lo que corre independientemente de cualquier manejador de ventanas que estemos usando (ya sea Gnome, Xfce, o KDE), es un editor, no un IDE, por esto me refiero a que nonos va a hacer proyectos, ni nada de eso, solo nos va a dejar editar el texto.</p>
<p><span id="more-29"></span></p>
<p>Instalar Geany, no debe de dar mayor problema, pues se encuentra en los repositorios oficiales de Ubuntu, lo podemos hacer via apt-get, o synaptic, o incluso se encuentra disponible en agregar o quitar programas bajo la categoría de desarrollo, si su sistema esta en español (el Ubuntu), geany también vendrá en español.</p>
<p>Bueno, por que querría yo usar un editor de texto aparte de gedit? Pues por que geany me da ciertas ventajas que no me da por ejemplo gedit, al escribir código, estoy hablando a que nos da mas ventajas que el simple sintax highlight</p>
<p><a title="Una pantalla de Geany en accion" href="http://www.nemediano.com.mx/wp-content/uploads/2007/09/pantalla_geany.png"><img src="http://nemediano.files.wordpress.com/2007/09/pantalla_geany.thumbnail.png" alt="Una pantalla de Geany en accion" /></a></p>
<p>Pues aquí viene lo bonito del asunto, si queremos usar Geany para escribir código de OpenGL  y glut en Ubuntu, y ya sabemos hacer nuestros propios makefiles, como lo explique en el <a title="El post donde explico como hace makefiles" href="http://nemediano.wordpress.com/2007/09/01/como-hacer-makefiles-para-programar-en-opengl-y-glut/" target="_blank">post anterior</a>.</p>
<p>Ahora podemos usar todo esto a nuestro favor para tener un entorno de desarrollo muy amigable, para empezar guardemos todos nuestros archivos fuentes y makefile en una sola carpeta luego iniciamos geany.</p>
<p>Ahora suponemos que en nuestro makefile, define cierto nombre para el ejecutable por ejemplo &#8220;Modelo3D&#8221;, y que definimos un make all, de defualt, y que también pusimos un &#8220;make destroy&#8221;, que elimina los objetos y el ejecutable.</p>
<p>Pues abrimos Geany, de ahí abrimos todos nuestros archivos fuentes,  Archivo -&gt; abrir y luego nos vamos al menú que dice: <strong>construir</strong></p>
<p>En la ultima opción se encuentra  <strong>Selecciona Inclusiones y Argumentos</strong>, al entrar a esta opción vemos una ventana como esta:</p>
<p><a title="Seleccion de argumentos en Geany" href="http://www.nemediano.com.mx/wp-content/uploads/2007/09/pantallazo-selecciona-incluciones-y-argumentos.png"><img src="http://nemediano.files.wordpress.com/2007/09/pantallazo-selecciona-incluciones-y-argumentos.thumbnail.png" alt="Seleccion de argumentos en Geany" /></a><br />
Ahora vemos que Geany ya ha dado valores de default, pues sabe que estamos escribiendo código en C, por que abrimos un archivo .c, sin embargo como nosotros ya hicimos nuestro propio makefile, la vamos a cambiar esas opciones, para que llame a nuestro make.</p>
<p>Lo que tenga escrito en la primer caja de  de compilar es lo que se va a ejecutar, cuando apretemos el botón de compilar, ahora nosotros queremos que antes de compilar elimine todos los objetos y el ejecutable, y luego intente compilar todo, es decir queremos que ejecute &#8220;make destroy&#8221; y luego &#8220;make all&#8221;, y como esta instrucción se va a mandar al shell tal como la escribimos podemos escribir:<br />
<code>make destroy; make</code><br />
Ahora lo que escribamos en argumentso para el programa, es lo que ejecuta cuando presionamos el boton de ejecutar, así que podemos poner ahi ./nombre_de_ejecutable o para nuestro ejemplo:<br />
<code>./modelo3D</code><br />
<a title="Como queda la configuracion al final" href="http://www.nemediano.com.mx/wp-content/uploads/2007/09/pantallazo-selecciona-incluciones-y-argumentos-1.png"><img src="http://nemediano.files.wordpress.com/2007/09/pantallazo-selecciona-incluciones-y-argumentos-1.thumbnail.png" alt="Como queda la configuracion al final" /></a></p>
<p>Y listo, ahora podemos programar cómodamente en Geany, usando glut y OpenGL, cada que queramos compilar, solo presionamos el botón de compilar y al ejecutar el botón de ejecutar.</p>
<p>Algunas observaciones</p>
<ul>
<li>Geany es muy ligero y tiene la enorme ventaja que no hace archivos de proyecto, o de configuración, esto es una ventaja para programas pequeños.</li>
<li>La ventaja de tener total control de los argumentos con nuestro propio makefile.</li>
<li>También se puede importar código muy fácil, ya que geany, nos da lo mínimo, para poder escribir entre Windows y GNU/Linux, es decir nos deja cambiar el carácter de terminación de linea de los archivos fuentes y la codificación de caracteres, la codificación de GNU/Linux y en particular de Ubuntu es UTF8, la codificación en Windows es depende del idioma en que lo tengamos, pero seguro aparece en el menú de geany. La terminación de linea en Windows es CRLF y en GNU/Linux es LF.</li>
<li>Tenemos las opciones que mas comúnmente se usan al programar en un Editor muy ligero y que no para instalar no necesitamos traer montones de librerías como en los casos de editores mas poderosos.</li>
</ul>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2007%2Futilizando-geany-para-hacer-codigo-de-c-y-c%2F&amp;t=Utilizando%20Geany%20para%20hacer%20codigo%20de%20C%20y%20C%2B%2B" id="facebook_share_icon_29" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	<!--
	var button = document.getElementById('facebook_share_link_29') || document.getElementById('facebook_share_icon_29') || document.getElementById('facebook_share_both_29') || document.getElementById('facebook_share_button_29');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_29') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	-->
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2007/utilizando-geany-para-hacer-codigo-de-c-y-c/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>Como hacer Makefiles para programar en OpenGL y glut</title>
		<link>http://www.nemediano.com.mx/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/</link>
		<comments>http://www.nemediano.com.mx/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 15:37:22 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[geany]]></category>
		<category><![CDATA[glut]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://nemediano.wordpress.com/2007/09/01/como-hacer-makefiles-para-programar-en-opengl-y-glut/</guid>
		<description><![CDATA[Bueno en el post pasado aprendimos como instalar el compilador y las librerías(bibliotecas para los puristas del idioma) en Ubuntu, para poder hacer nuestros propios programas de OpeGL y glut. Supongo que si estas leyendo esto es que todavía no sabes muy bien como programar en OpenGL y probablemente quieres un entorno de desarrollo medio [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno en el post pasado aprendimos como instalar el compilador y las librerías(bibliotecas para los puristas del idioma) en Ubuntu, para poder hacer nuestros propios programas de OpeGL y glut. Supongo que si estas leyendo esto es que todavía no sabes muy bien como programar en OpenGL y probablemente quieres un entorno de desarrollo medio amigable para hacer todo el show de codifico, intento compilar, corrijo errores, va de nuevo.Lo mas recomendable para hacer esto es construir un makefile (por eso en el post pasado instalamos el paquete build-essentials).<span id="more-21"></span></p>
<p>El makefile es un archivo de texto plano, que usa la herramienta make, dicho archivo debe ser escrito por el desarrollador y dice como se compila el programa que escribió. Usualmente los makefiles son complejos y contienen un montón de reglas, sin embargo nosotros <strong>nos vamos a limitar a tres</strong>: una para compilar, una para limpiar y otra para reconstruir.</p>
<p>Así que abrimos nuestro editor de texto plano favoritos y construimos un archivo que tenga por nombre makefile (el nombre es muy importante).</p>
<p>Si nuestro programa solo va tener un archivo fuente esta sera nuestra plantilla:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="make" style="font-family:monospace;">LIBDIR <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>L<span style="color: #004400;">/</span>usr<span style="color: #004400;">/</span>X11R6<span style="color: #004400;">/</span>lib
CC <span style="color: #004400;">=</span> gcc
CFLAGS <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>Wall
LIBRARIES <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>lglut <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lm
ejecutable<span style="color: #004400;">:</span> fuente<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>o <span style="color: #000088; font-weight: bold;">$@</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBDIR</span><span style="color: #004400;">&#41;</span> <span style="color: #000088; font-weight: bold;">$?</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBRARIES</span><span style="color: #004400;">&#41;</span>
destroy<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">*.</span>o ejecutable
clean<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">*.</span>o</pre></td></tr></table></div>

<p>En donde <em>ejecutable</em> es el nombre que queremos que tenga nuestro archivo ejecutable y <em>fuente</em> es el nombre de nuestro <strong>único</strong> archivo fuente.</p>
<p>Analizando un poco vemos que el makefile define unas variables en las primeras lineas, y luego define unas reglas, las reglas siempre son de la forma:</p>
<p>[objetivo]: [dependencia]<br />
[comandos]</p>
<p>Donde <em>objetivo</em> es el nombre de la operación que queremos hacer, <em>dependencia</em> es todo lo que necesitamos para llevarla a acabo y <em>comandos</em> es lo que debemos hacer para llevar a cabo la operación.</p>
<p>Las reglas que defino son <em>ejecutable</em> que sirve para hacer el ejecutable, <em>clean</em> que sirve para borrar todos los los archivos intermedios que hace el compilador (por ejemplo los .o) y <em>destroy</em> que borra todo lo que hace el compilador y nos deja listos para intentar compilar de nuevo (por ejemplo en nuestro periodo de ensayo error).</p>
<p>Se observa que uso gcc como compilador, por que el lenguaje C es usualmente nuestro default, si piensan programar en c++, cambien gcc por g++. Tambien fijense que entra las librerías mando a GL a GLU y a glut, que es por que queremos hacer un programa de OpenGL con glut, pero además mando un misterioso -lm, estas son as demás librerías de default de C, por ejemplo si en nuestro programa queremos usar funciones definidas en math.h.</p>
<p>Si queremos hacer un programa con mas de un código fuente esta es otra plantilla:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="make" style="font-family:monospace;">LIBDIR <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>L<span style="color: #004400;">/</span>usr<span style="color: #004400;">/</span>X11R6<span style="color: #004400;">/</span>lib
CC <span style="color: #004400;">=</span> gcc
CFLAGS <span style="color: #004400;">=</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">COMPILERFLAGS</span><span style="color: #004400;">&#41;</span>
LIBRARIES <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>lglut <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lm
OBJ <span style="color: #004400;">=</span> fuente1<span style="color: #004400;">.</span>o fuente2<span style="color: #004400;">.</span>o fuente3<span style="color: #004400;">.</span>o fuente4<span style="color: #004400;">.</span>o
BIN <span style="color: #004400;">=</span> ejecutable
&nbsp;
all<span style="color: #004400;">:</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span>
<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">:</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span>
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>o <span style="color: #000088; font-weight: bold;">$@</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBDIR</span><span style="color: #004400;">&#41;</span> <span style="color: #000088; font-weight: bold;">$?</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBRARIES</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente1<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente1<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente1<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente1<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente2<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente2<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente2<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente2<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente3<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente3<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente3<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente3<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente4<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente4<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente4<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente4<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
destroy<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span>
clean<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span></pre></td></tr></table></div>

<p>En donde <em>fuente1</em>, &#8230; <em>fuentei</em>, son todos los archivos fuentes que componen el programa y <em>ejecutable</em> es el nombre del ejecutable.</p>
<h2><strong>Ahora lo importante:</strong></h2>
<p>Es ampliamente recomendado tener una carpeta donde guardar todo lo referente a nuestro programa y solo eso, es decir mi fuente y mi makefile deben estar en una carpeta para ellos solos (esto para facilitar su transporte) y que no se vayan a volar algo sin querer al escribir una regla mal del make XD<br />
Para compilar nuestro programa simplemente escribimos en la linea de comandos &#8220;make&#8221;: (obviamente debemos estar parados en el directorio donde esta todo):</p>
<pre>$make</pre>
<p>Si nuestro programa compilo correctamente genero el archio ejecutable, <span style="text-decoration: underline;">pero si tuvimos errores, veremos los errores y warnings en la shell</span> y debemos de hacer los siguiente:<br />
ejecutar <strong>make destroy</strong>, para limpiar toda al basura generada por la compilación fallida, corregir nuestro fuente y luego volver a intentar compilar.</p>
<pre>$make destroy<strong> </strong></pre>
<h2>Algunas observaciones:</h2>
<ul>
<li>Estos makefiles son solo recomendaciones y de hecho no siguen las reglas GNU de los makefiles, para aprender mas de eso pueden visitar: http://www.gnu.org/software/make/</li>
<li>Para escribir este post me base en la guia publicada por el area de linux de la fesa, quizas si le dan un ojo les quede mas claro http://www.acatlan.unam.mx/linux/graficacion/compilalinux.html</li>
<li>Si nuestro fuente tiene cabeceras por ejemplo cabecera.h, estas no necesitan ser compiladas y por lo tanto no se ponen en el make, basta que en el fuente sean usadas #include, Siempre que la cabecera no tenga código en C, si no mas bien declaraciones de estructuras y variables globales (que es como debe ser).</li>
</ul>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2007%2Fcomo-hacer-makefiles-para-programar-en-opengl-y-glut%2F&amp;t=Como%20hacer%20Makefiles%20para%20programar%20en%20OpenGL%20y%20glut" id="facebook_share_icon_21" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	<!--
	var button = document.getElementById('facebook_share_link_21') || document.getElementById('facebook_share_icon_21') || document.getElementById('facebook_share_both_21') || document.getElementById('facebook_share_button_21');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_21') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	-->
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

