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

<channel>
	<title>Ebarbeito</title>
	<link>http://enrique.barbeito.org</link>
	<description>Página personal de Enrique Barbeito García</description>
	<pubDate>Sat, 26 Jan 2008 18:55:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.7</generator>
	<language>es-es</language>
			<item>
		<title>Be void* my friend</title>
		<link>http://enrique.barbeito.org/blog/be-void-my-friend/</link>
		<comments>http://enrique.barbeito.org/blog/be-void-my-friend/#comments</comments>
		<pubDate>Tue, 31 Oct 2006 16:48:05 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Humor</category>

		<category>C/C++</category>

		<guid isPermaLink="false">http://enrique.barbeito.org/blog/humor/be-void-my-friend/</guid>
		<description><![CDATA[ 


Don&#8217;t get set into one form, adapt it and build your own, and let it grow, be like void*. Empty your mind, be formless, shapeless — like void*. If you put an int into a void*, it becomes the int. You put float into a void* it becomes the float. You put in a char [...] ]]></description>
			<content:encoded><![CDATA[<p>
<div class="cajitaIzq"><a href="http://www.youtube.com/watch?v=OlFUcWd0InU" title="YouTube - Be water my friend"><img src="http://enrique.barbeito.org/img/be-water-bruce-lee.jpg" border="0" /></a></div>
</p>
<blockquote><div class="cita">Don&#8217;t get set into one form, adapt it and build your own, and let it grow, be like void*. Empty your mind, be formless, shapeless — like void*. If you put an int into a void*, it becomes the int. You put float into a void* it becomes the float. You put in a char it becomes the char. Now, void* can flow or it can overflow. <strong>Be void* my friend</strong>.</div>
<div class="referencia">Comentario en <a href="http://barrapunto.com" title="Barrapunto: La información que te interesa">Barrapunto</a>. De <a href="http://barrapunto.com/~McPolu/" title="Usuarios de Barrapunto - McPolu">McPolu</a> — Martes, 31 de Octubre 2006 (<a href="http://barrapunto.com/comments.pl?sid=66624&#038;cid=835986" title="Barrapunto - (void *)(*f)(void *) = NULL;">link</a>)<a href=</div>
</blockquote>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/be-void-my-friend/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Felices, y ofuscadas, fiestas :)</title>
		<link>http://enrique.barbeito.org/blog/felices-y-ofuscadas-fiestas/</link>
		<comments>http://enrique.barbeito.org/blog/felices-y-ofuscadas-fiestas/#comments</comments>
		<pubDate>Wed, 21 Dec 2005 13:28:53 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Miscelánea</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=551</guid>
		<description><![CDATA[  Hace unos días echando un vistazo por los foros de El Rincón del C me topé con un curioso fragmento de código escrito en C ofuscado. Como soy muy malo para eso de felicitar las fiestas y desear una feliz navidad, he pensado en copiar aquí dicho código y así dejarlo bien claro que [...] ]]></description>
			<content:encoded><![CDATA[<p> Hace unos días echando un vistazo por los <a href="http://www.elrincondelc.com/portal/modules.php?name=Forums&#038;file=viewtopic&#038;t=4893" title="Cancion navideña">foros de El Rincón del C</a> me topé con un curioso fragmento de código escrito en <a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C" title="Lenguaje de programación C - Wikipedia">C</a> <a href="http://es.wikipedia.org/wiki/Ofuscaci%C3%B3n" title="Ofuscación - Wikipedia">ofuscado</a>. Como soy muy malo para eso de felicitar las fiestas y desear una feliz navidad, he pensado en copiar aquí dicho código y así dejarlo bien claro que se, de verdad, me da de culo :D</p>
<p><pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*  gcc -o christmas christmas.c      */</span>
&nbsp;
main<span style="color: #66cc66;">&#40;</span>t,_,a<span style="color: #66cc66;">&#41;</span> <span style="color: #993333;">char</span> *a; <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">return</span>!<span style="color: #cc66cc;">0</span>&lt;t?t&lt;<span style="color: #cc66cc;">3</span>?main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-79</span>,<span style="color: #cc66cc;">-13</span>,a+main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-87</span>,<span style="color: #cc66cc;">1</span>-_,
main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-86</span>,<span style="color: #cc66cc;">0</span>,a<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>+a<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #cc66cc;">1</span>,t&lt;_?main<span style="color: #66cc66;">&#40;</span>t<span style="color: #cc66cc;">+1</span>,_,a<span style="color: #66cc66;">&#41;</span>:<span style="color: #cc66cc;">3</span>,main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-94</span>,<span style="color: #cc66cc;">-27</span>+t,a<span style="color: #66cc66;">&#41;</span>&amp;&amp;t==<span style="color: #cc66cc;">2</span>?_&lt;<span style="color: #cc66cc;">13</span>?
main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>,_<span style="color: #cc66cc;">+1</span>,<span style="color: #ff0000;">&quot;%s %d %dn&quot;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #cc66cc;">9</span>:<span style="color: #cc66cc;">16</span>:t&lt;<span style="color: #cc66cc;">0</span>?t&lt;<span style="color: #cc66cc;">-72</span>?main<span style="color: #66cc66;">&#40;</span>_,t,
<span style="color: #ff0000;">&quot;@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l 
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# 
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' 
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c 
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')#
}'+}##(!!/&quot;</span><span style="color: #66cc66;">&#41;</span>:t&lt;<span style="color: #cc66cc;">-50</span>?_==*a?putchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">31</span><span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>:main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-65</span>,_,a<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>:
main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>*a==<span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span>+t,_,a<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #cc66cc;">0</span>&lt;t?main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">2</span>,<span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #66cc66;">&#41;</span>:*a==<span style="color: #ff0000;">'/'</span>||main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,main<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">-61</span>,*a,
<span style="color: #ff0000;">&quot;!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m .vpbks,fxntdCeghiry&quot;</span><span style="color: #66cc66;">&#41;</span>,a<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span></pre></p>
<p>Ah, y una cosa. ¡Sobretodo no os ofusquéis! Intentarlo al menos :-)<br />
Felices fiestas y próspero año nuevo.</p>
<p>Más sobre C ofuscado:</p>
<ul>
<li>- <a href="http://www.es.ioccc.org/main.html" title="The International Obfuscated C Code Contest">IOCCC</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/felices-y-ofuscadas-fiestas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Argumentos variables en C/C++</title>
		<link>http://enrique.barbeito.org/blog/argumentos-variables-en-c/</link>
		<comments>http://enrique.barbeito.org/blog/argumentos-variables-en-c/#comments</comments>
		<pubDate>Wed, 09 Feb 2005 00:25:09 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Programación</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=483</guid>
		<description><![CDATA[  Frecuentemente me he preguntado cómo se las apañan algunas funciones como printf &#40;&#41; o scanf &#40;&#41; para permitir al programador realizar llamadas con una lista indeterminada de argumentos. Ayer aprendí el método en el que, al parecer, se basan para funcionar. Existe una librería de C llamada stdarg.h la cual contiene un pequeño conjunto [...] ]]></description>
			<content:encoded><![CDATA[<p> Frecuentemente me he preguntado cómo se las apañan algunas funciones como <pre class="php"><a href="http://www.php.net/printf"><span style="color: #000066;">printf</span></a> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre> o <pre class="php">scanf <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre> para permitir al programador realizar llamadas con una lista indeterminada de argumentos. Ayer aprendí el método en el que, al parecer, se basan para funcionar. Existe una librería de C llamada <a href="http://c.conclase.com/librerias/libreria.php?lib=stdarg" title="C++ con Clase. Librería stdarg">stdarg.h</a> la cual contiene un pequeño conjunto de macros y un tipo de datos preparado para definir funciones que trabajen con listas de argumentos variables, donde nosotros en la/s llamada/s indicaremos el número de argumentos (<em>parámetros actuales</em>) que necesitemos. Las herramientas que <pre class="php">stdarg.h</pre> nos aporta son:</p>
<ul>
<li><pre class="php">va_list</pre> : es el tipo de dato utilizado para declarar la variable que será utilizada con las macros que ofrece <pre class="php">stdarg.h</pre>. Define un puntero a la lista de argumentos variable y en entornos como Dev-C++ o el compilador <acronym title="GNU Compiler Collection">GCC</acronym> se trata de un alias de un puntero a caracter (<pre class="php">typedef char * va_list;</pre>).</li>
<li><pre class="php">void va_start <span style="color: #66cc66;">&#40;</span>va_list ap, last<span style="color: #66cc66;">&#41;</span>;</pre> : macro que se encarga de inicializar una variable <pre class="php">pa</pre> (<em>parámetro de argumentos</em>) para poder utilizarla con el par de macros restantes. <pre class="php">last</pre> es un argumento fijo que hay que pasar siempre a la función, como primer parámetro, ya que le sirve como referencia a <pre class="php">va_start</pre> para saber dónde localizar la lista de argumentos variables (estos argumentos estarán en posiciones de memoria adyacentes a <pre class="php">last</pre>, de ahí a que se le deba pasar siempre un argumento &#8220;<em>estático</em>&#8221; a la función).</li>
<li><pre class="php">type va_arg <span style="color: #66cc66;">&#40;</span>va_list ap, type<span style="color: #66cc66;">&#41;</span>;</pre> : macro con la que recorreremos la lista de argumentos variable. Devuelve el contenido del siguiente de estos argumentos.</li>
<li><pre class="php">void va_end <span style="color: #66cc66;">&#40;</span>va_list ap<span style="color: #66cc66;">&#41;</span>;</pre> : macro encargada de finalizar el uso de la variable <pre class="php">ap</pre> previamente inicializada con <pre class="php">va_start</pre>.</li>
</ul>
<p>Bien, el mecanismo para emplear estas macros sin obtener resultados inesperados es básicamente siempre el mismo: lo primero de todo es declarar correctamente una función que utilizará lista de argumentos variable. Para ello se emplea un parámetro fijo inicial pasado por valor y, seguidamente, el operador especial <pre class="php">...</pre> (&#8221;puntos suspensivos&#8221;) que indica la lista de argumentos variable. Algo así:</p>
<pre class="codigo">tipo_f foo (tipo_p bar, ...);</pre>
<p>Hago especial hincapie en el paso del parámetro <pre class="php">bar</pre> puesto que como dije éste servirá de referencia a <pre class="php">va_start</pre> para saber dónde encontrar el inicio de la lista de argumentos variable. Normalmente este parámetro fijo contendrá el número de argumentos con que la función fue llamada o, también, puede ser un puntero a la primera posición de una cadena de caracteres (como es el caso de <pre class="php"><a href="http://www.php.net/printf"><span style="color: #000066;">printf</span></a> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre> o <pre class="php">scanf <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre>).</p>
<p>Lo siguiente es declarar una variable que sea del tipo de dato <pre class="php">va_list</pre>. Seguidamente se debe emplear <pre class="php">va_start</pre> para inicializar dicha variable y, al final, emplear <pre class="php">va_end</pre>. En conjunto quedaría algo así:</p>
<pre class="codigo">tipo_f foo (tipo_p bar, ...)
{
    va_list pa;
    tipo_p param;

    ...

    va_start (pa, bar);

    ... por aquí se podría usar va_arg -&gt; param = va_arg (pa, tipo_p);

    va_end (pa);
    return;
}</pre>
<p>Esta técnica, a priori, parece no tener demasiadas aplicaciones prácticas en la vida real. A mí al menos no se me ocurren demasiadas y, tal vez, como curiosidad está la mar de bien :-) Aunque lo cierto es que creo que la utilización de funciones con lista de argumentos variables podría venir muy bien para procesos de <a href="http://elvex.ugr.es/decsai/java/pdf/8B-Refactoring.pdf" title="Refactorización">refactorizaación</a> de código fuente; para según que casos / funciones concretas que tengamos hechas tal vez pueda valer.</p>
<p>Es un tema interesante y seguramente no haya quedado del todo claro con mis escuetas explicaciones. Os recomiendo la lectura de un artículo muy logrado sobre el tema que justamente ayer encontré en <a href="http://elrincondelprogramador.com" title="El Rincón del Programador">El Rincón del Programador</a> y con el que he aprendido a utilizar un poco este juego de macros que trae <pre class="php">stdarg.h</pre>. El documento que digo es [ <a href="http://www.elrincondelprogramador.com/default.asp?pag=articulos/leer.asp&#038;id=54" title="Funciones en C con lista de argumentos variable">éste</a> ] Además también se puede leer información práctica en las páginas man, [ <a href="http://www.linuxinfor.com/spanish/man3/stdarg.html" title="Manpage of STDARG">aquí</a> ]</p>
<p><a id="more-483"></a></p>
<p>Y ahora de la teoría a la práctica. Esta mañana en clase he estado jugando un poco con lo dicho anteriormente, sobre todo para afianzar lo aprendido ayer y hacer algún ejercicio chorra de prueba. El siguiente programilla lee por línea de comandos de dos a cuatro caracteres e imprime por pantalla una concatenación de ellos. Para cada número de argumentos, se utiliza una función que trabaja con una lista de argumentos variable. El código está hecho en plan <em>guarro</em> y, obviamente, solo sirve para liar un poco la cosa y aportar algún ejemplo algo más extraño a lo que personalmente he podido encontrar buscando por ahí (aunque, a fin de cuentas, es lo mismo).</p>
<pre class="codigo">#include &lt;stdarg.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

char * get_mem (int);
char * concatena (int, ...);

int main (int argc, char **argv)
{
  size_t i, error = 0;
  char * cad;

  switch (argc)
  {
      case 3 :
        cad = get_mem (argc);
        strcpy (cad, concatena (argc, argv [1], argv [2]));
        break;

      case 4 :
        cad = get_mem (argc);
        strcpy (cad, concatena (argc, argv [1], argv [2], argv [3]));
        break;

      case 5 :
        cad = get_mem (argc);
        strcpy (cad, concatena (argc, argv [1], argv [2], argv [3], argv [4]));
        break;

      default :
        error = 1;
        break;
  }

  if (!error)
  {
    for (i = 1; i &lt; argc; i++)
        fprintf (stdout, "(%s) ", argv [i]);

    fprintf (stdout, "-> %s", cad);
    free (cad);
  }
  else
    fprintf (stderr, "uso: %s car1 car2 [car3 car4]", *argv);

  putchar ('n');
  return 0;
}

char * get_mem (int args)
{
  char * result = (char *) malloc (sizeof (char) * (--args));

  if (result == NULL)
    exit (1);

  return result;
}

char * concatena (int args, ...)
{
  char * result;
  va_list pa;

  result = get_mem (--args);
  va_start (pa, args);
  *result = ' ';

  while (args--)
    strcat (result, va_arg (pa, char *));

  va_end (pa);

  return result;
}</pre>
<p>Lo dicho, recomendado:</p>
<ul>
<li><a href="http://www.elrincondelprogramador.com/default.asp?pag=articulos/leer.asp&#038;id=54" title="Funciones en C con lista de argumentos variable">Funciones en C con lista de argumentos variable</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/argumentos-variables-en-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Curso de programación C/C++</title>
		<link>http://enrique.barbeito.org/blog/curso-de-programacion-cc/</link>
		<comments>http://enrique.barbeito.org/blog/curso-de-programacion-cc/#comments</comments>
		<pubDate>Fri, 08 Oct 2004 22:00:57 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Programación</category>

		<category>Libros</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=430</guid>
		<description><![CDATA[ 


Por mis manos ya han pasado unos cuantos libros sobre introducción a la programación en C y, sin lugar a dudas, Curso de programación C/C++, de Fco. Javier Ceballos Sierra (un Genial divulgador), es el que más interesante y completo me ha parecido. Sin pretender ser un libro enciclopédico o bíblico, esta joya sí se [...] ]]></description>
			<content:encoded><![CDATA[<p>
<div class="cajitaIzq"><a href="http://www.ra-ma.es/libros/0001572.htm" title="C/C++ Curso de programación, 2ª edición"><img src="http://enrique.barbeito.org/img/prog_c.jpg" border="0" alt="prog_c.jpg" /></a></div>
</p>
<p>Por mis manos ya han pasado unos cuantos libros sobre introducción a la programación en C y, sin lugar a dudas, <em>Curso de programación C/C++</em>, de Fco. Javier Ceballos Sierra (un Genial <em>divulgador</em>), es el que más interesante y completo me ha parecido. Sin pretender ser un libro <em>enciclopédico</em> o <em>bíblico</em>, esta joya sí se puede considerarse como un buen manual de referencia y apoyo para personas que estén estudiando lenguaje C. Personalmente pienso que se centra en esto último, en detallar del modo más claro, completo y práctico posible las entrañas de C y cómo programar de manera estructurada. Apuesto a que a más de uno bastante familiarizado con C le puede servir como material de apoyo, sobre todo por los últimos temas dedicados a detallar multitud de estructuras dinámicas (listas lineales: simple y doblemente enlazadas, pilas y colas; listas circulares, árboles: binarios, binarios de búsqueda y binarios perfectamente equilibrados) y problemas algorítmicos (recursividad, ordenación de vectores &#8211;burbuja, inserción y quicksort&#8211;, ordenación de ficheros &#8211;acceso secuencial, acceso aleatorio&#8211;, búsqueda &#8211;secuencial, binaria, algoritmo/métodos Hash&#8211;). Está claro que existe bibliografía mucho más extensa y avanzada sobre el tema pero creo que este libro puede ser una muy buena elección tanto para empezar a aprender lenguaje C como para quienes lleven una base.</p>
<p>El libro se divide en doce capítulos preparados con el fin de ir destripando el lenguaje <em>de menos a más</em>. Es otra de las ventajas que le veo, que está muy muy bien diferenciado todo y muy organizado. Cada capítulo se compone de multitud de puntos que, a su vez, desglosan cada uno de los elementos / técnicas de la programación con C. A groso modo, aquí os dejo el indica global:</p>
<ol>
<li>Fases en el desarrollo de un programa C</li>
<li>Elementos del lenguaje C</li>
<li>Estructura de un programa</li>
<li>Estrada y salida estándar</li>
<li>Sentencias de control</li>
<li>Tipos estructurados de datos</li>
<li>Punteros</li>
<li>Funciones</li>
<li>Funciones estándar de E/S</li>
<li>El preprocesador C</li>
<li>Estructuras dinámicas de datos</li>
<li>Algoritmos</li>
<li>Apéndices
<ol>
<li type="A">Depurar un programa</li>
<li type="A">Visual C++</li>
<li type="A">Códigos de caracteres</li>
<li type="A">Índice alfabético</li>
</ol>
</li>
</ol>
<p>Y por si no fuese poco, cada concepto que se explica es enriquecido con al menos un ejemplo práctico. El libro está repletito de ellos, incluso con explicaciones sobre los ejemplos en muchos casos (a veces incluso detallando la ejecución del programa). Se explican multitud de funciones, casi todas relativas a la biblioteca estándar de C (cada función detallada viene presentada con su librería necesaria así como la compatibilidad &#8211;ANSI, UNIX y/o <acronym title="Microsoft">MS</acronym>-DOS&#8211; con el sistema y acompañada con ejemplos prácticos jeje).</p>
<p>Además de dar una muy completa base sobre lo que es la programación en C, este libro forma parte de una trilogía encaminada terminar aprendiendo a desarrollar aplicaciones visuales. Los tres libros son del mismo autor y están editados por <a href="http://www.ra-ma.es/" title="RA-MA Editorial: Libros de Inform&aacute;tica, Computaci&oacute;n y Empresa">RA-MA</a>. Y son:</p>
<ol>
<li>Curso de programación C/C++</li>
<li>Programación orientada a objetos con C++</li>
<li>Visual C++. Aplicaciones para Windows</li>
</ol>
<p>En la actualidad, y al menos que yo sepa, el primero de los tres libros va por la segunda edición. Yo dispongo de los dos primeros :-) aunque lo cierto es que no son del todo míos, mi padre fue quien se los compró hace ya unos cuantos años (y he cogido yo y me los he agenciado rápidamente jeje). Dispongo de las primeras ediciones de ambos libros. La primera edición del que os hablo aquí es de 1995. Y aunque me lo haya leído completo este verano, 2004, me sigue pareciendo un gran libro. Así que ni os cuento cómo debe estar de bien la segunda edición, con (me parece) casi un par de cientos de páginas más :-)</p>
<p>En definitiva, muy recomendable para un alto número de <em>público variopinto</em> jeje. Fco. Javier Ceballos tiene una extensa <a href="http://www.ra-ma.es/autores/ccc.htm#7" title="Índice por autores. CEBALLOS, F.J.">bibliografía</a> editada de la mano de RA-MA. Personalmente si necesitase un libro sobre algún tema de programación, no dejaría de visitar esta bibliografía y comprobar si el señor éste le ha dedicado tiempo a enseñar sobre lo que esté buscando. Sinceramente, me ha encantado la manera de explicar cada cosa; y si el resto de sus libros viene tan plagada de ejemplos y problemas resueltos/propuestos como en el de <em>Curso de programación C/C++</em>, seguro que están geniales (por cierto, no es familiar ni le conozco de nada. Solo es que me ha ayudado mucho con C nada más).</p>
<blockquote><div class="cita"><b>Título</b>: Curso de programación C/C++<br />
<b>Autor</b>: Fco. Javier Ceballos.<br />
<b>ISBN</b>: 84-7897-200-5<br />
<b>Precio</b>: 4950 pesetas (al menos en 1996 :))<br />
<b>Editorial</b>: RA-MA Editorial.<br />
<b>Copyright</b> RA-MA Editorial.<br />
Imprimido en España. Primera impresión en Septiembre de 1995.</div>
</blockquote>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/curso-de-programacion-cc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Calcular la letra del NIF a través del DNI</title>
		<link>http://enrique.barbeito.org/blog/calcular-la-letra-del-nif-a-travs-del-dni/</link>
		<comments>http://enrique.barbeito.org/blog/calcular-la-letra-del-nif-a-travs-del-dni/#comments</comments>
		<pubDate>Sun, 04 Apr 2004 22:05:29 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Programación</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=360</guid>
		<description><![CDATA[  Hace unos días me encontré en la bitácora de makross en Barrapunto una curiosa nota explicando cómo funciona, por así decirlo, el método de asignación de la letra del NIF a partir de un determinado DNI. Aunque es una chorrada, no deja de tener su gracia ;-)
Todo consiste en hacer una simple operación y [...] ]]></description>
			<content:encoded><![CDATA[<p> Hace unos días me encontré en la <a href="http://barrapunto.com/journal.pl?op=display&#038;uid=306&#038;id=4140" title="Algoritmo de creación del NIF (DNI más la letra)">bitácora de makross</a> en Barrapunto una curiosa nota explicando cómo funciona, por así decirlo, el método de asignación de la letra del <acronym title="Número de Identificación Fiscal">NIF</acronym> a partir de un determinado <acronym title="Documento Nacional de Identidad">DNI</acronym>. Aunque es una chorrada, no deja de tener su gracia ;-)</p>
<p>Todo consiste en hacer una simple operación y comparar el resultado de la misma en una tabla de números enteros que va desde el 0 hasta el 22 y en la que cada número tiene definido una letra distinta. Basta hacer el módulo entre el número de 8 cifras que forma un DNI y <strong>23</strong> o, lo que es lo mismo, dividir el DNI entre 23 y fijarnos en el resto. Dependiendo de qué resto nos de (el cual estará entre 0 y 22) obtendremos una u otra letra y ésta es la letra del NIF para el DNI en cuestión jeje.</p>
<p>Dicho de un modo más gráfico, la supuesta tabla podemos verla como un vector de 23 elementos. De este modo:</p>
<pre class="codigo">T  R  W  A  G  M  Y  F  P  D  X   B   N   J   Z   S   Q   V   H   L  C  K  E
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19 20 21 22</pre>
<p>Un ejemplo: Halla el NIF del DNI: <em>48537318</em></p>
<ol>
<li>( 48537318 % 23 ) = <astrong>4</astrong></li>
<li>Mirar en la tabla y extraer la letra correspondiente al número obtenido. 4 -&gt; <strong>G</strong></li>
<li>Solucion: 48537318-G</li>
</ol>
<p>No sé hasta qué punto es fiable este sencillo algoritmo, toda sugerencia es bienvenida :)</p>
<p>Y ahí va la chapuza de marras en C/C++</p>
<pre class="codigo">const char letra[] = "TRWAGMYFPDXBNJZSQVHLCKE";
const int kTAM = 8; // numero de cifras para el DNI
using namespace std;
int main (int argc, char *argv[])
{
    int dni;
    if (argc != 2)
        cout &lt;&lt; "uso: " &lt;&lt; argv[0] &lt;&lt; " &lt;DNI&gt;nn";
    else
    {
        if (strlen(argv[1]) != kTAM)
            cout &lt;&lt; "DNI no valido.nn";
        else
        {
            dni = atoi (argv[1]);
            dni %= 23;
            cout &lt;&lt; argv[1] &lt;&lt; "-" &lt;&lt; letra[dni] &lt;&lt; endl;
        }
    }
}</pre>
<p>Jeje, ahora entiendo por qué mis profesores me obligan a declarar el DNI como dato de tipo entero ;)
</p>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/calcular-la-letra-del-nif-a-travs-del-dni/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Curso de C++ en Kylix</title>
		<link>http://enrique.barbeito.org/blog/curso-de-c-en-kylix/</link>
		<comments>http://enrique.barbeito.org/blog/curso-de-c-en-kylix/#comments</comments>
		<pubDate>Sun, 27 Apr 2003 01:38:37 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Noticias</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=74</guid>
		<description><![CDATA[  « Para aquél que no tiene ningún conocimiento de programación y quiere aprender a programar con un curso muy práctico y totalmente visual.
Además, como casi todo en Linux, es gratis. »
Vía GULA me entero del comienzo de un curso de programación en C++ impartido por Ernesto Barragán López y llevado a cabo en esta [...] ]]></description>
			<content:encoded><![CDATA[<p> « <i>Para aquél que no tiene ningún conocimiento de programación y quiere aprender a programar con un curso muy práctico y totalmente visual.<br />
Además, como casi todo en Linux, es gratis.</i> »</p>
<p>Vía <a href="http://www.gulalug.org" target="nwindow">GULA</a> me entero del comienzo de un curso de programación en C++ impartido por <i>Ernesto Barragán López</i> y llevado a cabo en <a href="http://usuarios.lycos.es/ernestus/CursoCpp/" target="nwindow">esta página</a>.</p>
<p>El autor va desarrollando el curso poco a poco (intentando llevar un capítulo por semana). Por ahora hay tres publicados (así que aun estamos a tiempo de <i>subirnos al tren</i> :)</p>
<p>La peculiaridad de este curso es el cómo su autor lo enfonca: de un modo gráfico utilizando como entorno de desarrollo a <a href="http://www.borland.com/kylix/" target="nwindow">Kylix Open Edition</a>. Este enfoque gráfico es debido a que las cosas, vistas desde un punto de vista gráfico, se entienden (generalmente) mejor y más rápido que de un modo más abstracto. Otra peculiaridad es la utilización de aspectos avanzados (como objetos) desde las primeras lecciones.</p>
<p>[ <a href="http://usuarios.lycos.es/ernestus/CursoCpp/" target="nwindow">»»</a> ] Web del curso<br />
[ <a href="http://usuarios.lycos.es/ernestus/CursoCpp/faq.html" target="nwindow">»»</a> ] <acronym title="Frequently Asked Questions">FAQ</acronym> del curso<br />
[ <a href="http://www.mediawes.com/portal/modules.php?name=Forums&#038;file=viewforum&#038;f=6" target="nwindow">»»</a> ] Foro del curso
</p>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/curso-de-c-en-kylix/feed/</wfw:commentRss>
		</item>
		<item>
		<title>chapuza v2.0</title>
		<link>http://enrique.barbeito.org/blog/chapuza-v20/</link>
		<comments>http://enrique.barbeito.org/blog/chapuza-v20/#comments</comments>
		<pubDate>Sat, 19 Apr 2003 23:46:00 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Programación</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=64</guid>
		<description><![CDATA[  Problema: Estamos
dentro de un directorio en el que hay muchos subdirectorios (34). En
cada uno de ellos hay un archivo que se llama mensajeitor.txt; tiene permisos de escritura/lectura
para el propietario y de lectura para el resto (644) y esto no
deber&#237;a ser as&#237;. Todos estos archivos deber&#237;an
tener permisos 666 (lectura/escritura para todo el mundo). &#191;Como
lo hacemos [...] ]]></description>
			<content:encoded><![CDATA[<p> <span style="text-decoration: underline;">Problema</span>: Estamos<br />
dentro de un directorio en el que hay muchos subdirectorios (34). En<br />
cada uno de ellos hay un archivo que se llama <i>mensajeitor.txt</i>; tiene permisos de escritura/lectura<br />
para el propietario y de lectura para el resto (644) y esto no<br />
deber&iacute;a ser as&iacute;. Todos estos archivos deber&iacute;an<br />
tener permisos 666 (lectura/escritura para todo el mundo). &iquest;Como<br />
lo hacemos sin tener que hacerlo manualmente? Porque ejecutar 34 <i>chmod</i>&#8217;s<br />
para cambiarle los permisos a cada uno de esos archivos&#8230; como que no.</p>
<p><span style="text-decoration: underline;">Soluci&oacute;n</span>: Esta<br />
es la soluci&oacute;n mas eficiente. Es la que uno debe pensar. Estamos<br />
en un entorno BASH, así que ejecutemos una orden propia de este entorno capaz de hacerlo.</p>
<p><span style="font-family: courier new,courier,monospace;">&nbsp;&nbsp; for i<br />
in `find . -name mensajeitor.txt`; do chmod 666 $i; done</span></p>
<p>Con ese simple, bucle el problema esta solucionado :)</p>
<p><span style="text-decoration: underline;">Soluci&oacute;n chapucera</span>:<br />
&iquest;Y si escribo un peque&ntilde;o algoritmo en C++ que me resuelva<br />
el problema de una tacada? &#8230; Esto es mucho menos eficiente. Pues hay<br />
que tener en cuenta que en BASH tenemos que teclear una simple<br />
l&iacute;nea, mientras que de otro modo (con C++ por ejemplo) son<br />
bastantes m&aacute;s l&iacute;neas de c&oacute;digo jeje. Adem&aacute;s<br />
que no es coherente hacerlo de este modo pero vamos&#8230; estaba aburrido<br />
y quer&iacute;a hacerlo porque implicaba utilizar ficheros (&iexcl;y<br />
as&iacute; practicaba! ;) Este es el resultado:<br />
<pre class="c"><span style="color: #808080; font-style: italic;">/*
 * Chapuza v2.0
 *
 * lo que hace este algoritmo es lo mismo que lo que se puede hacer
 * en UNA linea utilizando &quot;lenguaje bash&quot; dicha linea seria:
 *      for i in `find . -name mensajeitor.txt`; do chmod 644 $i; done
 *
 */</span>
 
<span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;fstream&gt;</span>
 
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> kCHMOD = <span style="color: #cc66cc;">100</span>;
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> kLINEA = <span style="color: #cc66cc;">50</span>;
 
using namespace std;
 
<span style="color: #993333;">void</span> chapuza<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> files<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
   fstream ficLogico;
   <span style="color: #993333;">char</span> chmod<span style="color: #66cc66;">&#91;</span>kCHMOD<span style="color: #66cc66;">&#93;</span>=<span style="color: #ff0000;">&quot;chmod 666 &quot;</span>;
   <span style="color: #993333;">char</span> copiaChmod<span style="color: #66cc66;">&#91;</span>kCHMOD<span style="color: #66cc66;">&#93;</span>=<span style="color: #ff0000;">&quot;chmod 666 &quot;</span>;
   <span style="color: #993333;">char</span> linea<span style="color: #66cc66;">&#91;</span>kLINEA<span style="color: #66cc66;">&#93;</span>;
   <span style="color: #993333;">int</span> i;
&nbsp;
   ficLogico.<span style="color: #202020;">open</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;lista.txt&quot;</span>, ios::<span style="color: #202020;">in</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// leeremos el archivo lista.txt</span>
   <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!ficLogico<span style="color: #66cc66;">&#41;</span>
           <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> &lt;&lt; <span style="color: #ff0000;">&quot;Error de apertura&quot;</span>;
   <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
       <span style="color: #808080; font-style: italic;">/* he de usar este bucle que emula a la funcion eof()
        * si lo pongo tal y como esta en la version 1.0 de chapuza
        * el system(chmod) funciona. las concatenaciones se van realizando
        * y todo parece funcionar bien. pero al final da un error
        *
        * # ./chapuza
        * chmod: too few arguments
        * Try `chmod --help' for more information.
        */</span>
&nbsp;
       <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">1</span>; i&lt;=files; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
              ficLogico.<span style="color: #202020;">getline</span><span style="color: #66cc66;">&#40;</span>linea,kLINEA<span style="color: #66cc66;">&#41;</span>;
              strcat<span style="color: #66cc66;">&#40;</span>chmod,linea<span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// modificamos chmod[]</span>
              system<span style="color: #66cc66;">&#40;</span>chmod<span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// esto ejecuta un chmod 666 numLinea[i]</span>
              strcpy<span style="color: #66cc66;">&#40;</span>chmod,copiaChmod<span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// dejamos chmod[] como estaba</span>
        <span style="color: #66cc66;">&#125;</span>
 
        ficLogico.<span style="color: #202020;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// cierre del fichero</span>
   <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
 
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
   <span style="color: #993333;">int</span> numLineas;
&nbsp;
   <span style="color: #808080; font-style: italic;">// miramos cuantos archivos 'mensajeitor.txt' hay y los contamos</span>
   numLineas = system<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;find . -name mensajeitor.txt | wc -l&quot;</span><span style="color: #66cc66;">&#41;</span>;
   chapuza<span style="color: #66cc66;">&#40;</span>numLineas<span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// este parametro es para el bucle for de arriba</span>
<span style="color: #66cc66;">&#125;</span></pre><br />
Me cost&oacute; bastante trabajo hacer que funcionara, pues era incapaz<br />
de hacer que las dos cadenas que utilizo (<i>chmod</i> y <i>linea</i>) hicieran<br />
correctamente todas las concatenaciones que deben hacer. Me daba<br />
<i>violaciones de segmento</i>; por todas partes. Uuuff&#8230;<br />
la verdad que fue complicado jeje. Menos mal que ten&iacute;a gente que<br />
me ayud&oacute; ;) estaba conectado al <acronym title="Internet Relay Chat">IRC</acronym>, en el canal de <a<br />
href="http://www.gulalug.org" target="nwindow">mi LUG</a> y un<br />
amigo me estuvo ayudando en todo momento (hasta me dio una clase<br />
r&aacute;pida de <i>gdb</i> , ¡gracias chema! :D)</p>
<p>Fue divertido, y comprobar que funciona despu&eacute;s de tanto<br />
fallo&#8230; &iexcl;mola! ;)
</p>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/chapuza-v20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ficheros</title>
		<link>http://enrique.barbeito.org/blog/ficheros/</link>
		<comments>http://enrique.barbeito.org/blog/ficheros/#comments</comments>
		<pubDate>Sun, 13 Apr 2003 14:57:40 +0000</pubDate>
		<dc:creator>Enrique Barbeito García</dc:creator>
		
		<category>Programación</category>

		<category>C/C++</category>

		<guid isPermaLink="false">/?p=52</guid>
		<description><![CDATA[  #include &#60;iostream&#62;
#include &#60;fstream&#62;
const int kTAM=99;
using namespace std;
 
int main&#40;&#41; &#123;
        int i;
        fstream nomLogico;
        char nomFisico&#91;15&#93;;
 
        cout &#60;&#60; â??Nombre del fichero de salida: â??;
  [...] ]]></description>
			<content:encoded><![CDATA[<p> <pre class="c"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;fstream&gt;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> kTAM=<span style="color: #cc66cc;">99</span>;
using namespace std;
 
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #993333;">int</span> i;
        fstream nomLogico;
        <span style="color: #993333;">char</span> nomFisico<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#93;</span>;
 
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> &lt;&lt; â??Nombre del fichero de salida: â??;
        cin.<span style="color: #202020;">getline</span><span style="color: #66cc66;">&#40;</span>nomFisico,kTAM<span style="color: #66cc66;">&#41;</span>;
 
        nomLogico.<span style="color: #202020;">open</span><span style="color: #66cc66;">&#40;</span>nomFisico,ios::<span style="color: #202020;">out</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!nomFisico<span style="color: #66cc66;">&#41;</span>
               <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> &lt;&lt; â??Error de apertura.\nâ?;
        <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
               <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">0</span>; i&lt;=kTAM; i++<span style="color: #66cc66;">&#41;</span>
                       nomLogico &lt;&lt; i &lt;&lt; endl;
               nomLogico.<span style="color: #202020;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></p>
<pre>$ g++ 0a99.cpp
$</pre>
<blockquote><p><i>Tema 11. Estructuras de datos IV: FICHEROS</i><br />
( &#8230; ) -página 290- «<i> Para trabajar con ficheros se deberá incluir el fichero de cabecera fstream-h, que incluye al iostream-h, por lo que ya no será necesario incluir este último. </i>»</p></blockquote>
<p>Estoy mirándome este tema de programación. Si le hago caso al libro y excluyo del código de arriba el archivo de cabecera <font face="courier new">iostream</font> (tal y como indica el libro):</p>
<p><pre class="c"><span style="color: #339933;">#include &lt;fstream&gt;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> kTAM=<span style="color: #cc66cc;">99</span>;
using namespace std;
 
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
   <span style="color: #66cc66;">&#91;</span> ... <span style="color: #66cc66;">&#93;</span></pre></p>
<p>E intento compilar así:</p>
<pre>$ g++ 0a99.cpp
0a99.cpp: In function `int main()â??:
0a99.cpp:13: `coutâ?? undeclared (first use this function)
0a99.cpp:13: (Each undeclared identifier is reported only once
   for each function it appears in.)
0a99.cpp:14: `cinâ?? undeclared (first use this function)
$</pre>
<p>Osea&#8230; que por lo visto <font face="courier new">iostream</font> no está incluído en <font face="courier new">fstream</font>. Al menos utilizando la version 3.2.2 de GCC. El libro (escrito hace unos cuantos años) utiliza GCC 2.95.</p>
<p>Cuando me entere de un modo seguro del por qué de esto, pondré un comentario en este post para acordarme jeje. (Y si sabes tu el por qué de esto&#8230; no te cortes y ¡¡ sacame de dudas !!)</p>
<p><font face="courier new" size="-1">post.close(); // Sayonara baby!</font>
</p>]]></content:encoded>
			<wfw:commentRss>http://enrique.barbeito.org/blog/ficheros/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
