<?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>Codigo Manso &#187; c</title>
	<atom:link href="http://www.codigomanso.com/es/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codigomanso.com</link>
	<description>Programación, informática y tecnología</description>
	<lastBuildDate>Sun, 21 Aug 2011 10:54:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>La clase std::string de C++ es una patraña</title>
		<link>http://www.codigomanso.com/es/2009/10/la-clase-stdstring-de-c-es-una-patrana/</link>
		<comments>http://www.codigomanso.com/es/2009/10/la-clase-stdstring-de-c-es-una-patrana/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 08:15:24 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[std::string]]></category>
		<category><![CDATA[strings]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=699</guid>
		<description><![CDATA[Aún hoy, después de un tiempo considerable sin programar en C++, sigo teniendo pesadillas sobre el manejo de cadenas.
Seguro que si has programado en C++ sabrás de lo que hablo. Es HORRIBLE. Seguro que el que diseñó (o los que diseñaron) la clase standard de C++ para strings pensaron algo como:
&#8220;Dios!! Vamos a hacer una [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Aún hoy, después de un tiempo considerable sin programar en C++, sigo teniendo pesadillas sobre el manejo de cadenas.</p>
<p style="text-align: justify;">Seguro que si has programado en C++ sabrás de lo que hablo. <strong>Es HORRIBLE.</strong> Seguro que el que diseñó (o los que diseñaron) la clase standard de C++ para strings pensaron algo como:</p>
<p style="text-align: justify; padding-left: 30px;"><strong>&#8220;Dios!! Vamos a hacer una clase string que se van a cagar! Si si, se van a cagar! Vamos a hacer una clase base sobre la que puedan instanciar otras, y vamos a usar iteradores, y vamos a poner funciones de bajo nivel para que se pueda hacer de todo!&#8221;</strong></p>
<p style="text-align: justify;">Tipica paja mental. Es que claro, te pones a diseñar, te lias, te lias, y mira lo que se monta al final&#8230;</p>
<p style="text-align: justify;">Por supuesto, esta es mi opinión. También estoy seguro de que a día de hoy, algunos de ellos se arrepentirán del diseño que hicieron.</p>
<p style="text-align: justify;">Desde mi punto de vista, una clase string estándard, debería ser capaz de hacer un mínimo de operaciones. Por ejemplo, el método <strong>replace</strong> ahora mismo se le pasan dos iteradores (del texto a eliminar), y luego un string, u otros dos iteradores, que es el nuevo texto.</p>
<p style="text-align: justify;">Vale, el replace puede ser eso, bien. Pero, ¿el uso más normal de esta función, no será un &#8220;search and replace&#8221;? No es más cómodo y legible que alguien haga<strong> str.replace (&#8220;casa&#8221;, &#8220;hogar&#8221;);</strong> en vez de inicializar dos iteradores, antes de poder llamar a <strong>str.replace (it_start, it_end, &#8220;hogar&#8221;);</strong></p>
<p style="text-align: justify;">Y éste es un ejemplo un tanto rebuscado. Pongamos un ejemplo más sencillo, en C++ ¿cómo transformas la cadena en mayúsculas?</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>size_t i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> str.<span style="color: #202020;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> toupper <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">¡¡Venga hombre!! Eso lo podía hacer en C</p>
<p style="text-align: justify;">Básicamente, y después de meditarlo unos minutos, la única utilidad de la clase string de C++ es que reserva y libera la memoria por nosotros (importante), permite concatenar strings al final (con el operador <strong>+=</strong> o mediante <strong>append</strong>), y probablemente el método <strong>find</strong> también pueda ser de utilidad. Todo lo demás debería revisarse. De todos modos, una clase que haga eso se programa como muuucho, en 20 minutos.</p>
<p style="text-align: justify;">Finalmente, de soporte para unicode es que ni hablamos. Lo cual me parece patético. Unicode debería ser el estándard en los compiladores de C/C++, y debería ser soportado por la clase string. Aunque bueno, esto ya es otra historia&#8230; y mejor dejamos la discusión para otro momento.</p>
<p style="text-align: justify;">Por supuesto, desde este blog mando un cordial saludo a la gente que hizo posible la clase string&#8230; <strong>sin rencor lo digo :p</strong></p>
<p style="text-align: justify;">Para el que haya seguido leyendo hasta aquí, y quiera alguna alternativa a la clase string, con soporte de unicode y que sea fácilmente portable, puede echarle un vistazo a los siguientes enlaces:</p>
<ul>
<li><a href="http://site.icu-project.org/" target="_blank">International Components for Unicode (ICU)</a>: ICU is a mature, widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications</li>
<li><a href="http://utfcpp.sourceforge.net/" target="_blank">UTF8-CPP</a>: UTF-8 with C++ in a Portable Way</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/10/la-clase-stdstring-de-c-es-una-patrana/feed/</wfw:commentRss>
		<slash:comments>251</slash:comments>
		</item>
		<item>
		<title>Un error común en programación</title>
		<link>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/</link>
		<comments>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 09:28:16 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[bucles]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[error comun]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=156</guid>
		<description><![CDATA[Un error que comete mucha gente, aunque mucha no se da cuenta, y la mayoría de veces pasa desapercibido, se da a la hora de poner las condiciones en los bucles. Se debe tener cuidado cuando se hacen llamadas dentro de un bucle, porque algo que a priori puede parecer O(n) se convierte en O(n2).
¿Alguien [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Un error que comete mucha gente, aunque mucha no se da cuenta, y la mayoría de veces pasa desapercibido, se da a la hora de poner las condiciones en los bucles. Se debe tener cuidado cuando se hacen llamadas dentro de un bucle, porque algo que a priori puede parecer O(n) se convierte en O(n<sup>2</sup>).</p>
<p style="text-align: justify;">¿Alguien ve algo raro en el siguiente código?</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// whatever this loop does</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">A priori ¿Parece que todo está bien, no? Si te lo parece es que no eres consciente aún.</p>
<p style="text-align: justify;">Es bien sabido que las condiciones de los bucles se evaluan tantas veces como iteraciones tiene el bucle, con esto no estoy descubriendo nada a nadie, sin embargo, si se mete un <strong>strlen</strong> para medir la longitud de la cadena en un bucle que se ejecuta tantas veces como caracteres hay, acabamos de elevar al cuadrado el tiempo de ejecución.</p>
<p style="text-align: justify;">Tanto en C como en PHP, la función <strong>strlen</strong> necesita recorrer toda la cadena hasta encontrar el &#8216;\0&#8242; para determinar su longitud, así pues, si la longitud es 20, strlen necesitará 20 iteraciones para determinar que la longitud es 20. El problema es que el bucle que estamos haciendo también tiene 20 iteraciones, y en cada iteración se ejecuta strlen, que consume otras 20 iteraciones (claro que en PHP esas 20 iteraciones se ejecutan en código máquina, y no en el interprete), por lo que tendríamos que el coste de ese bucle para una cadena de 20 caracteres es de 20*(20 + lo que hay dentro del bucle) = 400 + 20*lo que hay dentro del bucle.</p>
<p style="text-align: justify;">El siguiente script (<a href="http://www.codigomanso.com/archives/phpscripts/common_mistake_with_loops_using_strlen.php.txt" target="_blank">error común con los bucles</a>) muestra un ejemplo de esto en PHP, donde dentro del bucle no se hace nada, y se puede observar como un bucle es mucho más lento que el otro.</p>
<p style="text-align: justify;">Los resultados tras ejecutarlo en mi ordenador han sido:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">strlen($sentence) =  12608 bytes
Making the common mistake: 3.02566313744 seconds
Fixing the common mistake: 0.958508968353 seconds</pre></div></div>

<p style="text-align: justify;">Creo que se puede apreciar claramente la diferencia <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Finalmente, aunque he usado PHP para ilustrar el error, y concretamente <strong>strlen</strong>, si nos olvidamos de strlen y de PHP, esto es aplicable a otros muchos lenguages C/C++/Java/Pascal/PHP/Python/Perl/Ruby y un largo etcetera; y pasa en todos los lenguajes porque todos los lenguajes usan el mismo concepto, la condicion de salida del bucle se evalua en cada iteración. Quizás no ocurra cuando se utilizan cadenas, porque guardan la longitud en una variable, pero puede que pase al mirar la longitud de listas enlazadas, etc&#8230;</p>
<p style="text-align:justify;"><strong>Conclusión:</strong> si en el bucle estás llamando a una función que siempre te va a devolver lo mismo, mejor guardalo en una variable y usa esa variable dentro del bucle, te ahorrará sorpresas</p>
<p style="text-align:justify;">
<p><strong>Enlaces interesantes:</strong></p>
<ul>
<li><a href="http://www.joelonsoftware.com/articles/fog0000000319.html" target="_blank">Back to basics</a>, un excelente artículo de Joel (<a href="http://local.joelonsoftware.com/mediawiki/index.php/De_vuelta_a_lo_b%C3%A1sico" target="_blank">disponible en Español</a>) donde reflexiona sobre algunas cosas directamente relacionadas con esto.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
	</channel>
</rss>

