<?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>Coders.me &#187; C++</title>
	<atom:link href="http://www.coders.me/lang/en/category/c/feed" rel="self" type="application/rss+xml" />
	<link>http://www.coders.me/</link>
	<description>Blog de Informática y Programación</description>
	<lastBuildDate>Mon, 07 Dec 2009 18:48:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Objetos DTO en C#</title>
		<link>http://www.coders.me//lang/en/c/objetos-dto-en-c</link>
		<comments>http://www.coders.me//lang/en/c/objetos-dto-en-c#comments</comments>
		<pubDate>Sat, 20 Dec 2008 03:00:54 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[diseño logico]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=368</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Los objetos de trasferencia de datos (DTO) pueden ser de mucha utilidad al momento de desarrollar software.  Basicamente son un molde  para la información, donde el esquema se encuentra fuertemente tipeado<br />
Algunas de las ventajas de utilizar diseños que implementen este…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Los objetos de trasferencia de datos (DTO) pueden ser de mucha utilidad al momento de desarrollar software.  Basicamente son un molde  para la información, donde el esquema se encuentra fuertemente tipeado<br />
Algunas de las ventajas de utilizar diseños que implementen este tipo de objetos son:</p>
<ul>
<li>En cualquier punto del sistema  la información puede ser validada, a partir de metadatos establecidos</li>
<li>Mejora la comunicación entre los programadores, dandoles un mismo esquema de información, evitando conflictos</li>
<li>Separa fisicamente las capas del sistema, haciendo el codigo mucho mas limpio y reutilizable</li>
<li>Proporciona mayor seguridad</li>
</ul>
<p>Aunque estos objetos pueden darnos una gran cantidad de ventajas, tienen una enorme desventaja la cual es la causante de su poco uso, y es el tiempo de desarrollo, ya que obliga al programador a tipear cada una de las entidades logicas del sistema.<br />
Es por esta razón por la cual muchas de las compañias que utilizan este tipo de diseño, o que elaboración frameworks para lo mismo, utilizan herramientas de generación automatica de código.</p>
<p>En lo que respecta a .NET,  Microsoft deposito toda su confianza en los famosos objetos denominados Dataset, con los cuales se puede trabajar de una manera muy grafica y sencilla, es muy facil crear un esquma de información a partir de una base de datos de casi cualquier tipo (SQL, OLEDB, XML, etc.).<br />
Pero estos objetos Dataset tienen una desventaja tan grande como sus ventajas&#8230; no les importa el diseño del sistema, puedes continuar utilizando los asistentes del VS y ver como terminas juntando el acceso a datos, juntos con las reglas de negocio y la interfaz grafica, tienen tanta funcionalidad que resulta practicamente inutil tratar de heredarlos e incrementar funcionalidad.</p>
<p>Aunque es posible crear objetos DTO usando un Dataset, muchas veces resulta inapropiado, ya que se perdio la razón de ser de estos mismos que es: asegurarse que el transporte de la información se lleve acabo de manera practica y segura, y solo eso.Es por eso que me decidi a crear mi propia estructura para objetos DTO, la cual aunque muy simple tambien es muy concreta y eficaz.<br />
Aún no acabo de hacer todo lo que eh querido (una aplicación de auto-generación de código, y la funcionalidad de  serialización en XML), pero por lo pronto ya tiene la funcionalidad que deberia tener para poder trabajar con el.</p>
<p>Les muestro el diagrama de clases, y el código, si  alguien tiene alguna de idea de alguna modificación, escribanlo en los comentarios</p>
<p><span id="more-368"></span><br />
<a href="http://s545.photobucket.com/albums/hh372/mtzfba/?action=view&#038;current=DTO.png" target="_blank"><img src="http://i545.photobucket.com/albums/hh372/mtzfba/DTO.png" border="0" width="600px" height="390" alt="DTO Class Diagram"></a></p>
<pre class="brush: cpp;">
using System;
using System.Collections.Generic;

    /// &lt;summary&gt;
    /// Domain. Representa la gama de valores en que cierto objeto debe pertenecer
    /// &lt;/summary&gt;
    public struct Range&lt;type&gt; where type : struct
    {

        #region Campos
            private System.Nullable&lt;type&gt; minValue;
            private System.Nullable&lt;type&gt; maxValue;
            private bool applyMinValue;
            private bool applyMaxValue;
        #endregion

        #region Constructores

            internal Range(System.Nullable&lt;type&gt; minValue, System.Nullable&lt;type&gt; maxValue) {
                this.minValue = minValue;
                this.maxValue = maxValue;
                this.applyMinValue = true;
                this.applyMaxValue = true;
            }

            internal Range(System.Nullable&lt;type&gt; minValue, System.Nullable&lt;type&gt; maxValue, bool applyMinValue, bool applyMaxValue)
            {
                this.minValue = minValue;
                this.maxValue = maxValue;
                this.applyMinValue = applyMinValue;
                this.applyMaxValue = applyMaxValue;
            }            

        #endregion

        #region Propiedades
            public object MinValue {
                get { return minValue; }
            }
            public object MaxValue {
                get { return maxValue; }
            }
            public bool ApplyMinValue {
                get { return applyMinValue; }
            }
            public bool ApplyMaxValue {
                get { return applyMaxValue; }
            }
        #endregion

    }

    /// &lt;summary&gt;
    /// Metada. Representa un metadato (Información de un campo)
    /// &lt;/summary&gt;
    public class MetaData
    {

        #region Campos

            private Type netType; //Default. NETTypes.String
            private int length; //Default. 0
            private int maxLength; //Default. 0

            private bool isNullable; //Default. false
            private bool isReadOnly; //Default. false
            private bool isUnique; //Default. false

            private int numericPrecision; //Default. 0
            private int numericScale; //Default. 0

        #endregion

        #region Constructores

            /// &lt;summary&gt;
            /// MetaData. Constructor Generico
            /// &lt;/summary&gt;
            public MetaData() {
                this.netType = Type.GetType(&quot;System.String&quot;);
                this.length = 0;
                this.isNullable = false;
                this.isReadOnly = false;
                this.isUnique = false;
                this.numericPrecision = 0;
                this.numericScale = 0;
            }
            /// &lt;summary&gt;
            /// Metadata. Constructor por tipo
            /// &lt;/summary&gt;
            public MetaData(Type nettype) : this(){
                this.netType = nettype;
            }

        #endregion

        #region Propiedades

            public Type NetType {
                get {
                    return this.netType;
                }
                set {
                    this.netType = value;
                }
            }

            public int Length {
                get {
                    return this.length;
                }
                set {
                    this.length = value;
                }
            }

            public int MaxLength{
                get {
                    return this.maxLength;
                }
                set {
                    this.maxLength = value;
                }
            }

            public bool IsNullable {
                get {
                    return this.isNullable;
                }
                set{
                    this.isNullable = value;
                }
            }

            public bool IsReadOnly {
                get {
                    return this.isReadOnly;
                }
                set {
                    this.isReadOnly = value;
                }
            }

            public bool IsUnique {
                get {
                    return this.isUnique;
                }
                set {
                    this.isUnique = value;
                }
            }

            public int NumericPrecision {
                get {
                    return this.numericPrecision;
                }
                set {
                    this.numericPrecision = value;
                }
            }

            public int NumericScale {
                get {
                    return this.numericScale;
                }
                set {
                    this.numericScale = value;
                }
            }

        #endregion

    }

    /// &lt;summary&gt;
    /// FieldMeta. Clase abstracta basica de Field
    /// &lt;/summary&gt;
    public abstract class BaseField : MarshalByRefObject
    {

        #region Campos

            private MetaData meta;
            private string name;

        #endregion

        #region Constructores

            public BaseField(string name, MetaData meta) {;
                this.name = name;
                this.meta = meta;
            }

            public BaseField(string name, MetaData meta, bool isLocked){
                this.name = name;
                this.meta = meta;
            }            

        #endregion

        #region Propiedades

            internal MetaData Meta{
                get { return this.meta; }
                set { this.meta = value; }
            }

            public string Name{
                get { return name; }
                set { name = value; }
            }

        #endregion

        #region Delegados &amp; Eventos

            internal delegate void ValueChange(BaseField field, object value);
            internal event ValueChange valueChange;

            internal void OnValueChange(BaseField field, object value) {
                if (valueChange != null) {
                    valueChange(field, value);
                }
            }
        #endregion
    }

    /// &lt;summary&gt;
    /// Field. Representa un campo
    /// &lt;/summary&gt;
    public class Field&lt;type&gt; :  BaseField where type : struct
    {

        #region Campos
            private System.Nullable&lt;type&gt; value;
            private System.Nullable&lt;Range&lt;type&gt;&gt; range;
            private string regEx;
        #endregion

        #region Constructores

            public Field(string name, MetaData meta) : base(name, meta) { }
            public Field(string name, MetaData meta, bool isLocked) : base(name, meta, isLocked) { }

        #endregion

        #region Propiedades

            public type Value{
                get { return this.value.Value; }
                set {  this.value = value; }
            }

            public Range&lt;type&gt; Range {
                get { return this.range.Value; }
                set { this.range = value; }
            }

            public string RegEx {
                get { return this.regEx; }
                set { this.regEx = value; }
            }

            public bool HasValue {
                get { return value.HasValue; }
            }

            public bool HasRange{
                get { return range.HasValue; }
            }

            public bool HasRegEx {
                get { return !string.IsNullOrEmpty(this.regEx); }
            }

        #endregion

        #region Metodos

            #region General

                public override string ToString() {
                    if (value.HasValue){
                        return Value.ToString();
                    }
                    else{
                        return string.Empty;
                    }
                }                

            #endregion

            #region Dominio

                public void SetRange(type minValue, type maxValue)
                {
                    this.range = new Range&lt;type&gt;(minValue, maxValue);
                }

                public void SetRange(type minValue, type maxValue, bool applyMinValue, bool applyMaxValue)
                {
                    this.range = new Range&lt;type&gt;(minValue, maxValue, applyMinValue, applyMaxValue);
                }

            #endregion 

        #endregion

    }

    /// &lt;summary&gt;
    /// DTObject. Representaun objeto tipo DTO
    /// &lt;/summary&gt;
    public abstract class DTObject : MarshalByRefObject
    {

        #region Campos
            private Dictionary&lt;string, BaseField&gt; internalCollection;
        #endregion

        #region Propiedades
            public BaseField this[string name]{
                get { return this.internalCollection[name]; }
            }
        #endregion

        #region Constructores
            public DTObject() {
                this.internalCollection = new Dictionary&lt;string,BaseField&gt;();
                SetFields();
            }
        #endregion

        #region Metodos
            protected abstract void SetFields();
            protected void AddField(string name, BaseField field) {
                field.valueChange += new BaseField.ValueChange(OnValueChange);
                this.internalCollection.Add(name, field);
            }
        #endregion

        #region Delegados &amp; Eventos
            public delegate void ValueChange(BaseField field, object value);
            public event ValueChange fieldValueChange;

            protected void OnValueChange(BaseField field, object value){
                if (fieldValueChange != null){
                    fieldValueChange(field, value);
                }
            }
        #endregion
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/c/objetos-dto-en-c/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción al Manejo de Excepciones en C</title>
		<link>http://www.coders.me//lang/en/c/introduccion-al-manejo-de-excepciones-en-c</link>
		<comments>http://www.coders.me//lang/en/c/introduccion-al-manejo-de-excepciones-en-c#comments</comments>
		<pubDate>Tue, 05 Aug 2008 05:13:20 +0000</pubDate>
		<dc:creator>Amir</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[excepciones]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[handling]]></category>
		<category><![CDATA[manejador]]></category>
		<category><![CDATA[seh]]></category>
		<category><![CDATA[structured]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=208</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Para comenzar a utilizar el SEH (Structured Exception Handling) primero que nada comenzaremos definiendo que es una &#8220;<strong>Excepción</strong>&#8220;.</p>
<p><strong>Excepción:</strong></p>
<blockquote><p>Es un evento que ocurre durante la ejecución de un programa y require la ejecución de codigo fuera del flujo normal de control.…</p></blockquote>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Para comenzar a utilizar el SEH (Structured Exception Handling) primero que nada comenzaremos definiendo que es una &#8220;<strong>Excepción</strong>&#8220;.</p>
<p><strong>Excepción:</strong></p>
<blockquote><p>Es un evento que ocurre durante la ejecución de un programa y require la ejecución de codigo fuera del flujo normal de control.
</p></blockquote>
<p><span id="more-208"></span><br />
Hay dos tipos de excepciones:</p>
<ul>
<li><strong>Excepciones de Software</strong><br />
<blockquote><p>Suceden cuando por ejemplo el programa pasa un parámetro invalido</p></blockquote>
</li>
<li><strong>Excepciones de Hardware</strong><br />
<blockquote><p>Son iniciadas por el CPU y ocurren cuando son ejecutadas secuencias de código invalidas como una división por zero</p></blockquote>
</li>
</ul>
<p>Las cuales serán tratadas de la misma forma por nuestro manejador de excepciones.</p>
<p><strong>Bloque de Código SEH</strong></p>
<pre class="brush: c;">
__try
{
    /* Bloque de código  en el cual podría generarse una excepción*/
}
   __except(/*Expresión de filtrado*/)
   {
      /* Bloque de código el cual se ejecutará inmediatamente después de que se produzca la excepción en el bloque anterior */
   }
</pre>
<p>
El bloque de codigo anterior es la estructura la cual nos servirá para manejar las excepciones.<br />
Ahora ¿cómo saber que bloque de código meter en &#8220;try&#8221;?
</p>
<p>
Para que nos demos una idea aplicaremos el SEH en estos casos:
</p>
<ul>
<li>Manipulación de arrays.</li>
<li>Operaciones matemáticas.</li>
<li>Al llamar una función que puede generar una excepción a propósito o por que no ha sido bien testeada.</li>
<li>Errores de sistema que puedan ocurrir y en vez de terminar el programa continuar su ejecución.
<li>
</ul>
<p><strong>Ejemplo de uso de SEH</strong></p>
<pre class="brush: c;">
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

int main()
{
	__try
	{
			int x,y = 0;
			int z;
			z = x / y;
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		MessageBoxA(0,&quot;Capturamos la excepcion&quot;,&quot;SEH Activo&quot;,0);
	}

	return 0;
}
</pre>
<p>Como podemos ver en el anterior ejemplo de código, dentro de try incluimos una división por 0, al ejecutarse ese bloque inmediatamente se salta al bloque de &#8220;except&#8221; el cual siempre se le pasará un parámetro definido ya en unas constantes:</p>
<ul>
<li><strong>EXCEPTION_EXECUTE_HANDLER</strong><br />
<blockquote><p>
Se ejecuta inmediatamente el bloque de código contenido en __except
</p></blockquote>
</li>
<li>
<strong>EXCEPTION_CONTINUE_SEARCH</strong></p>
<blockquote><p>
El sistema ignora el manejador de excepciones y busca por un manejador de excepciones dentro del bloque, y continua hasta que encuentra un manejador
</p></blockquote>
</li>
<li>
<strong>EXCEPTION_CONTINUE_EXECUTION</strong></p>
<blockquote><p>
El sistema inmediatamente regresa el control al punto en el cual la exepción ocurrió aunque no es posible continuar después de que ocurran &#8220;ciertas&#8221; excepciones.
</p></blockquote>
</li>
</ul>
<p>Y esto ha sido solamente una introducción al manejo de SEH al menos en C.<br />
Si alguien tiene alguna duda o sugerencia con respecto a este artículo sería bueno que lo comente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/c/introduccion-al-manejo-de-excepciones-en-c/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Análisis de los IDE mas usados para C++</title>
		<link>http://www.coders.me//lang/en/c/los-ide-mas-usados-para-c</link>
		<comments>http://www.coders.me//lang/en/c/los-ide-mas-usados-para-c#comments</comments>
		<pubDate>Wed, 05 Mar 2008 05:18:14 +0000</pubDate>
		<dc:creator>Gustavo</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.algoritmatica.com/c/los-ide-mas-usados-para-c</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Bueno hoy ante ustedes traigo, <em>para la cartera de la dama o bolsillo del caballero</em>, una guía sobre las ventajas y desventajas de los Entornos de Programación Integrados (IDE en ingles) mas usados en C++ :</p>
<p><span id="more-125"></span></p>
<h3>VISUAL C++ STUDIO</h3>
<p>Empezando por la…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Bueno hoy ante ustedes traigo, <em>para la cartera de la dama o bolsillo del caballero</em>, una guía sobre las ventajas y desventajas de los Entornos de Programación Integrados (IDE en ingles) mas usados en C++ :</p>
<p><span id="more-125"></span></p>
<h3>VISUAL C++ STUDIO</h3>
<p><img src='http://www.coders.me/wp-content/uploads/2008/03/vs60.thumbnail.jpg' alt='vs60.jpg' class="thumbnail-class" />Empezando por la versión de Microsoft, el Visual C++ es quizás el mas completo de todos los entornos que vamos a encontrar para trabajar en C++. Junto con sus completas librerías (el conjunto SDK) podemos crear casi de todo, y además es la plataforma utilizada por mas del 90% de los desarrolladores de video juegos ya sea en 2D o en 3D.</p>
<p>Su compilador es muy veloz, el depurador es excelente, permite el encarpetamiento de clases para mejorar la organización de los proyectos y tiene una integración sencilla con herramientas externas.</p>
<p>Sus desventajas son, que no es conveniente utilizarlo si vamos a realizar proyectos pequeños ya que requiere demasiadas especificaciones antes de poder empezar a tipear código, además sus diferentes versiones van desde los u$s 600 hasta los u$s 10939, es un producto caro, no es recomendable para personas que quieren comenzar en la programación C++ y sus requerimientos en memoria son mucho mas altos que los de sus competidores.</p>
<p>Recientemente Microsoft a realizado una versión gratuita del Visual C++ la cual podemos descargar de su pagina<br />
<a href="http://www.microsoft.com/express/download/">http://www.microsoft.com/express/download/</a>, esta versión tiene algunas restricciones.</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6896919298908258";
/* Post Abajo Patrocinado Por (Grande) */
google_ad_slot = "5751554033";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>Para resumir es la mejor herramienta si tienes el dinero suficiente y sabes bastante de C++, por mi parte utilizo la versión gratuita <s>que descargué desde un torrent</s> con la cual estoy aprendiendo desarrollo de video juegos y me es aún difícil de controlar.</p>
<h3>BLOODSHED DEV C++</h3>
<p><img src='http://www.coders.me/wp-content/uploads/2008/03/devcpp.thumbnail.jpg' alt='devcpp.jpg' class="thumbnail-class"  /> Es un entorno gratuito, aun muy joven, pero totalmente muy recomendable si estamos ingresando a la programación en C++ , además nos va marcando el código en diferentes colores para una mejor comprensión del mismo.</p>
<p>Lo mejor es que sus librerías se van actualizando día a día con versiones nuevas en Internet y sus requerimientos de memoria son bajos, es un entorno prometedor a futuro y podemos descargar la ultima versión de su pagina <a href="http://www.bloodshed.net/">http://www.bloodshed.net/</a>.</p>
<p>También deberemos descargar la librería MinGW desde la pagina <a href="http://sourceforge.net/project/showfiles.php?group_id=2435">http://sourceforge.net/project/showfiles.php?group_id=2435</a>. Recomiendo descargar la versión MinGW 5.1.3 es la última versión y funciona muy bien.</p>
<p>Otra desventaja que tiene este IDE es que no posee diseñador de formularios pero puede ser complementado con librerías como qt (descargar de: <a href="http://www.trolltech.com">http://www.trolltech.com</a>), muchas veces se puede colgar y el depurador es algo pobre.</p>
<h3>BORLAND C++ BUILDER 6.0</h3>
<p><img src='http://www.coders.me/wp-content/uploads/2008/03/borland-c.thumbnail.jpg' alt='borland-c.jpg' class="thumbnail-class" />Es un entorno excelente y una gran opción ya que permite el desarrollo de proyectos con interfaces de usuario complejas de manera fácil y permite recompilar proyectos de C++ en Linux.</p>
<p>Pero por otra parte su depurador es algo pobre, contiene un compilador mucho mas lento que el de Visual Studio y solo permite importar proyectos de Visual Studio 6 o aquellos cuales tengan código en ANSI C++.</p>
<p>No es gratuito pero su precio es inferior al de Visual aunque difícil de conseguir (legalmente) su precio varia entre los u$s69 y los u$s 100, además creo que han salido nuevas versiones pero no las he revisado aun, en definitiva no deja de ser una buena opción para quienes no estén dispuestos a pagar los terribles precios de Microsoft o crean que el Dev C++ no es una buena herramienta.</p>
<h3>ECLIPSE</h3>
<p><img src='http://www.coders.me/wp-content/uploads/2008/03/eclipse.thumbnail.jpg' alt='eclipse.jpg' class="thumbnail-class"  />Este IDE es, a mi entender, una de las mejores opciones para proyectos pequeños, medianos y hasta para algunos grandes proyectos, al igual que DEV C++ colorea el código y es gratuito.</p>
<p>Es un proyecto creado dentro del ámbito universitario y esta en constante actualización. Contiene un buen depurador, utiliza MinGW y contiene muchas opciones para la creación de proyectos con POO.</p>
<p>Pero sus desventajas son, la lentitud tanto para compilar como para depurar, y su instalación es verdaderamente tediosa. Necesitaremos tener motor java instalado o descargarlo desde <a href="http://www.java.com/es/download/">http://www.java.com/es/download/</a> ya que originalmente se creo como un IDE para java y contiene algunos bugs, sin embargo no deja de ser una de las mejores opciones a la hora de iniciarnos, algo difícil al principio pero cuando descubramos todas sus opciones lo encontraremos realmente útil.</p>
<p>Para descargarlo debemos elegir alguno de los mirrors en su <a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/europa/winter/eclipse-cpp-europa-winter-win32.zip">pagina de descargas</a> y luego deberemos seguir las instrucciones en su tutorial en la parte -&gt; C/C++Developers, y luego en la ventana de ayuda, en el índice de contenidos con la solapa -&gt; &#8220;before begin&#8221;, instalando el MinGW 5.1.3 si tenemos Windows, o el Cygwin si tenemos Linux. Luego deberemos seguir todos los pasos descriptos instalando todo lo que nos pide desde los links que proporciona el mismo.</p>
<blockquote><p>Estos no son los únicos entornos existentes pero son los mas utilizados, sobre todo Visual Studio. Antes de elegir uno deberemos detenernos y pensar que es lo que vamos a hacer y que nos conviene más, investigando detenidamente la plataforma que mejor nos parezca.
</p></blockquote>
<blockquote><p><strong>¿Y tú&#8230; que IDE vas a usar?</strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/c/los-ide-mas-usados-para-c/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Los Templates en C++</title>
		<link>http://www.coders.me//lang/en/c/los-templates-en-c</link>
		<comments>http://www.coders.me//lang/en/c/los-templates-en-c#comments</comments>
		<pubDate>Mon, 03 Mar 2008 18:12:12 +0000</pubDate>
		<dc:creator>Gustavo</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.algoritmatica.com/c/los-templates-en-c</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Este artículo es una continuación de <a href="http://www.coders.me/ingenieria-de-software/programacion-generica">Programación Genérica</a>.</p>
<blockquote><p><strong>Siguiendo con la introducción que hizo Eduardo y con ayuda de unos amigos, voy a explicar que son y para que se usan los <em>templates</em>, uno de los recursos mas poderosos de C++.</strong>
</p></blockquote>
<h3>Definición</h3>
<p>Según…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/03/gnome-mime-text-x-csrc.thumbnail.gif" width="128" height="128" alt="" title="C++" /><br/><p>Este artículo es una continuación de <a href="http://www.coders.me/ingenieria-de-software/programacion-generica">Programación Genérica</a>.</p>
<blockquote><p><strong>Siguiendo con la introducción que hizo Eduardo y con ayuda de unos amigos, voy a explicar que son y para que se usan los <em>templates</em>, uno de los recursos mas poderosos de C++.</strong>
</p></blockquote>
<h3>Definición</h3>
<p>Según la wikipedia:</p>
<blockquote><p>Las plantillas son el mecanismo de C++ para implantar el paradigma de la <a href="http://www.coders.me/ingenieria-de-software/programacion-generica">programación genérica</a>. Permiten que una clase o función trabaje con tipos de datos abstractos, especificándose más adelante cuales son los que se quieren usar. </p></blockquote>
<p>Las <em>templates</em> nos permiten crear estructuras de datos que no dependen de si vamos a ingresarles un entero, una letra, o cualquier otro tipo de dato que se nos ocurra. ¿como es esto? Se nos permite, mediante simples modificaciones, adaptar nuestras estructuras.</p>
<p>Yo usaré una clase con un array (vector) que iré modificando para que reciba enteros, luego char y por ultimo float(reales). Esta es una de las mejores maneras de reutilizar código!</p>
<p>A la antigua, esto requería que se hiciera 3 clases diferentes con 3 arrays diferentes&#8230; pero usando <em>templates</em> lo haré en una sola.<br />
<span id="more-118"></span><br />
El siguiente es el código:</p>
<pre class="brush: cpp;">
/*********ARCHIVO PRUEBA.H ***********/
#ifndef PRUEBA_H_
#define PRUEBA_H_
#include &lt;iostream&gt;

/**
 * Aqui empiezan las diferencias a una declaración ordinaria.
 * La linea siguiente define que cada vez que aparezca  &quot;t&quot;
 * se modificará el dato por otro que mas adelante definiremos.
 */
template &lt;class t&gt;

class prueba
{
  private:

                      /** como vemos, el array no es ni de enteros **/
    t array[5];       /** ni de char ni de otros datos sino que es
                      /** de datos tipo &quot;t&quot;
                      /**/

    int poscicion;

  public:
    prueba(){}
    virtual ~prueba(){}
    bool ingresar_datos(t &amp; datos)
    {
      if (poscicion&lt;5)
      {
        array[poscicion]=datos;
        poscicion ++;
        return true;
      }
      else
      {
        return false;
      }
    }

    /**
     * nuevamente vemos que esta funcion nos devuelve un dato de tipo &quot;t&quot;
     */
    t mostrar_datos(int &amp; pos)
    {
      if (pos&lt;=4 &amp;&amp; pos&gt;=0)
        return array[pos];
      else
        return array[1];
    }
};

#endif /*PRUEBA_H_*/
</pre>
<p>Bueno, hasta aquí vimos que donde supuestamente debía aparecer un tipo de dato aparecía una <strong>&#8220;t&#8221;</strong>, esto le indicará al compilador que se debe tomar a <strong>&#8220;t&#8221;</strong> como el tipo de variable que a continuacion definiremos en el <em>main</em> de abajo.</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6896919298908258";
/* Post Abajo Patrocinado Por (Grande) */
google_ad_slot = "5751554033";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h3>Jugando con templates</h3>
<p>A continuación, dejo una posible implementación en un archivo main.cpp:</p>
<pre class="brush: cpp;">
#include &quot;prueba.h&quot;
#include &lt;iostream&gt;

using namespace std;

int main (){
  int   dato1 = 1;
  char  dato2 = 'a';
  float dato3 = 3.14;
  int   pos = 0;

  prueba&lt;float&gt;prueba3;
  prueba&lt;char&gt;prueba2;
  prueba&lt;int&gt;prueba1;

  prueba1.ingresar_datos(dato1);
  cout &lt;&lt; prueba1.mostrar_datos(pos) &lt;&lt; endl;

  prueba2.ingresar_datos(dato2);
  cout &lt;&lt; prueba2.mostrar_datos(pos) &lt;&lt; endl;

  prueba3.ingresar_datos(dato3);
  cout &lt;&lt; prueba3.mostrar_datos(pos) &lt;&lt; endl;
  return 0;
}
</pre>
<p>Como vemos, con esta simple declaración cambiamos de una clase común, a una clase que puede admitir tanto enteros como punteros como cualquier otro dato que se nos ocurra; hicimos una infinidad de pasos en pocas líneas ya que con modificar <strong>&lt;float&gt;</strong> por <strong>&lt;char&gt;</strong> o por <strong>&lt;int&gt;</strong> cambiamos nuestra clase para que admita un dato diferente.</p>
<p>Ahora, quizás esta forma de definir nuestras clases y crear objetos se vea un poco complicada, pero yo recomiendo que se familiaricen bien con los <em>templates</em> porque en mas de una ocasión nos ahorrarán muchas pero muchas líneas de código.</p>
<p>Mas adelante explicaré como crear una lista enlazada con templates&#8230; y ahí veremos la gran utilidad de los templates.</p>
<blockquote><p><strong>¿Y tu, utilizas esta potente herramienta?</strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/c/los-templates-en-c/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

