<?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>Linux, Java y programación &#187; C++</title>
	<atom:link href="http://casidiablo.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Paso de valores por valor y referencia en C # [arreglos] &#8211; 2da parte</title>
		<link>http://casidiablo.net/paso-array-valor-referencia-c-sharp/</link>
		<comments>http://casidiablo.net/paso-array-valor-referencia-c-sharp/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 10:06:49 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2207</guid>
		<description><![CDATA[En el post anterior decíamos que cuando pasamos un arreglo a un método, &#8216;se pasa la referencia al arreglo por valor&#8217;. En este post veremos entonces cual es la diferencia entre pasar la &#8220;referencia de un arreglo por valor&#8221; y &#8220;referencia de un arreglo por referencia&#8221;. Ejemplo&#8230; Descargar código fuente]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fpaso-array-valor-referencia-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Paso%20de%20valores%20por%20valor%20y%20referencia%20en%20C%20%23%20%5Barreglos%5D%20-%202da%20parte%22%20%7D);"></div>
<p style="text-align: justify;">En <a href="http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/">el post anterior decíamos</a> que cuando pasamos un arreglo a un método, &#8216;se pasa la referencia al arreglo por valor&#8217;. En este post veremos entonces cual es la diferencia entre pasar la &#8220;referencia de un arreglo por valor&#8221; y &#8220;referencia de un arreglo por referencia&#8221;.</p>
<h3>Ejemplo&#8230;</h3>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2008/11/ejemploarregloreferencia.png" alt="c sharp" /></p>
<p><span id="more-2207"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
using System.Drawing;
using System.Windows.Forms;
public class EjemploArregloReferencia : Form
{
  private Label labelSalida;
  private Button botonMostrarSalida;
  public EjemploArregloReferencia()
  {
     InitializeComponent();
  }

  private void InitializeComponent()
  {
     this.labelSalida = new Label();
     this.botonMostrarSalida = new Button();
     this.SuspendLayout();
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(10, 40);
     this.labelSalida.Name = &quot;labelSalida&quot;;
     this.labelSalida.Size = new System.Drawing.Size(272, 280);
     this.labelSalida.TabIndex = 0;
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(101, 8);
     this.botonMostrarSalida.Name = &quot;botonMostrarSalida&quot;;
     this.botonMostrarSalida.Size = new System.Drawing.Size(91, 23);
     this.botonMostrarSalida.TabIndex = 1;
     this.botonMostrarSalida.Text = &quot;Mostrar salida&quot;;
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // EjemploArregloReferencia
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 325);
     this.Controls.AddRange(new Control[] {
                                                                  this.botonMostrarSalida,
                                                                  this.labelSalida});
     this.Name = &quot;EjemploArregloReferencia&quot;;
     this.Text = &quot;EjemploArregloReferencia&quot;;
     this.ResumeLayout(false);

  }
  static void Main()
  {
     Application.Run( new EjemploArregloReferencia() );
  }

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     // crear e iniciar primerArreglo
     int[] primerArreglo = { 1, 2, 3 };

     // copiar primerArreglo en otro arreglo
     int[] copiaPrimerArreglo = primerArreglo;

     labelSalida.Text =
        &quot;Ejemplo pasar la referencia de primerArreglo por valor&quot;;

     labelSalida.Text += &quot;\n\nContenido de primerArreglo &quot; +
        &quot;antes de llamar el metodo primerDoblar:\n\t&quot;;

     // imprimir el contenido del arreglo primerArreglo
     for ( int i = 0; i &lt; primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + &quot; &quot;;

     // pasar referencia de primerArreglo por valor a primerDoblar
     primerDoblar( primerArreglo );

     labelSalida.Text += &quot;\n\nContenido de primerArreglo despues &quot; +
        &quot;de llamar el metodo primerDoblar\n\t&quot;;

     // imprimir contenido de primerArreglo
     for ( int i = 0; i &lt; primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + &quot; &quot;;

     // probar si la copia cambio
     if ( primerArreglo == copiaPrimerArreglo )
        labelSalida.Text +=
           &quot;\n\nLa copia fue modificada tambien (porque tiene la referencia a dicho arreglo)\n&quot;;
     else
        labelSalida.Text +=
           &quot;\n\nLa copia no fue modificada\n&quot;;

     // crear e inciar segundoArreglo
     int[] segundoArreglo = { 1, 2, 3 };

     // crear una copia de segundoArreglo
     int[] copiaSegundoArreglo = segundoArreglo;

     labelSalida.Text += &quot;\nEjemplo, pasar referencia de segundoArreglo &quot; +
        &quot;por referencia&quot;;

     labelSalida.Text += &quot;\n\nContenido de segundoArreglo &quot; +
        &quot;antes de llamar el metodo segundoDoblar:\n\t&quot;;

     // imprime el contenido de segundoArreglo antes de llamar al metodo
     for ( int i = 0; i &lt; segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + &quot; &quot;;

     segundoDoblar( ref segundoArreglo );

     labelSalida.Text += &quot;\n\nContenido de segundoArreglo &quot; +
        &quot;despues de llamar el metodo segundoDoblar:\n\t&quot;;

     // imprimir el contenido de segundoArreglo despues de llamar al metodo
     for ( int i = 0; i &lt; segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + &quot; &quot;;

     // verificar si la copia ha cambiado
     if ( segundoArreglo == copiaSegundoArreglo )
        labelSalida.Text +=
           &quot;\n\nLa copia ha cambiado\n&quot;;
     else
        labelSalida.Text +=
           &quot;\n\nLa referencia y el arreglo original son distintos (porque el original cambio de referencia)\n&quot;;

  } // fin del metodo botonMostrarSalida_Click

  // modifica elementos del arreglo e intentar modificar la referencia
  void primerDoblar( int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i &lt; array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }

  // modifica elementos del arreglo e intentar modificar la referencia
  void segundoDoblar( ref int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i &lt; array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }
}</pre>
<p><a class="tooltip descargacodigo" title="Paso de arreglos por valor y referencia C# (2)::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Ejemplo+Arreglo+Referencia">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/paso-array-valor-referencia-c-sharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paso de valores por valor y referencia en C# [arreglos] &#8211; 1ra parte</title>
		<link>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/</link>
		<comments>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 09:55:43 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2198</guid>
		<description><![CDATA[Cuando estamos trabajando con arreglos en C#, debemos tener en cuenta algo importante: si pasamos un arreglo entero, éste será pasado por referencia ; mientras que si pasamos uno de los elementos del arreglo, éste es pasado por valor. Importante: Bueno, decir que el arreglo se pasa por referencia, en realidad es una manera fácil [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fpaso-arreglos-por-valor-referencia-csharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Paso%20de%20valores%20por%20valor%20y%20referencia%20en%20C%23%20%5Barreglos%5D%20-%201ra%20parte%22%20%7D);"></div>
<p style="text-align: justify;">Cuando estamos trabajando con arreglos en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C#</a>, debemos tener en cuenta algo importante: si pasamos un arreglo entero, éste será pasado por referencia ; mientras que si pasamos uno de los elementos del arreglo, éste es pasado por valor.</p>
<div class="nota" style="text-align: justify;"><strong>Importante:</strong> Bueno, decir que el arreglo se pasa por referencia, en realidad es una manera fácil de decirlo. Lo que en verdad sucede es que &#8216;se pasa la referencia al arreglo por valor&#8217;. Esto resulta a veces un poco difícil de entender, pero con el siguiente ejemplo, y el del próximo post quedará mucho más claro.</div>
<p style="text-align: justify;">¿Qué quiere decir esto exactamente? Pues bien, cuando pasamos un arreglo completo a un método, TODAS las modificaciones que hagamos sobre el arreglo en dicho método se verán reflejadas en el arreglo original. Por otro lado, cuando lo que pasamos es un elemento de un arreglo, las modificaciones que hagamos sobre el elemento serán accesibles únicamente desde dicho método, por lo tanto el valor original del elemento no es modificado.</p>
<h3>Ejemplo&#8230;</h3>
<p style="text-align: center;"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/11/pasararreglo.png" alt="" /></p>
<p><span id="more-2198"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
using System.Drawing;
using System.Windows.Forms;
public class PasarArreglo : Form
{
  private Button botonMostrarSalida;
  private Label labelSalida;
  public PasarArreglo()
  {
     InitializeComponent();
  }
  private void InitializeComponent()
  {
     this.botonMostrarSalida = new Button();
     this.labelSalida = new Label();
     this.SuspendLayout();
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(106, 8);
     this.botonMostrarSalida.Name = &quot;botonMostrarSalida&quot;;
     this.botonMostrarSalida.Size = new System.Drawing.Size(80, 23);
     this.botonMostrarSalida.TabIndex = 0;
     this.botonMostrarSalida.Text = &quot;Mostrar salida&quot;;
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(8, 48);
     this.labelSalida.Name = &quot;labelSalida&quot;;
     this.labelSalida.Size = new System.Drawing.Size(280, 184);
     this.labelSalida.TabIndex = 1;
     //
     // PasarArreglo
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 237);
     this.Controls.AddRange(new Control[] {
          this.labelSalida,
          this.botonMostrarSalida});
     this.Name = &quot;PasarArreglo&quot;;
     this.Text = &quot;Pasar Arreglo por valor y referencia&quot;;
     this.ResumeLayout(false);

  }
  static void Main()
  {
     Application.Run( new PasarArreglo() );
  }

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     int[] a = { 1, 2, 3, 4, 5 };

     labelSalida.Text = &quot;Resultado de pasar un arreglo &quot; +
        &quot;por referencia...\n\nLos valores del arreglo original son:\n\t&quot;;

     for ( int i = 0; i &lt; a.Length; i++ )
        labelSalida.Text += &quot;   &quot; + a[ i ];

     ModificarArreglo( a );   // el array es pasado por referencia

     labelSalida.Text +=
        &quot;\n\nEl valor de los datos modificados del arreglo son:\n\t&quot;;

     // mostrar elementos del array a
     for ( int i = 0; i &lt; a.Length; i++ )
        labelSalida.Text += &quot;   &quot; + a[ i ];

     labelSalida.Text += &quot;\n\nResultado de pasar un elemento del array por valor...&quot; +
        &quot;\n\nvalor de a[ 3 ] (antes de ser pasado a ModificarElemento()) &quot; + a[ 3 ];

     // elemento del array pasado por valor
     ModificarElemento( a[ 3 ] );

     labelSalida.Text +=
        &quot;\na[ 3 ] (despues de ser pasado a ModificarElemento()): &quot; + a[ 3 ];
  }

  // metodo que modifica el arreglo que recibe
  // (el original será modificado)
  public void ModificarArreglo( int[] b )
  {
     for ( int j = 0; j &lt; b.Length; j++ )
        b[ j ] *= 2;
  }

  // metodo que modifica el entero recibido
  // (el original no será modificado)
  public void ModificarElemento( int e )
  {
     labelSalida.Text +=
        &quot;\nvalor recibido por el metodo: &quot; + e;
     e *= 2;
     labelSalida.Text +=
        &quot;\nvalor modificado dentro del metodo: &quot; + e;
  }
}</pre>
<p><a class="tooltip descargacodigo" title="Paso de arreglos por valor y referencia C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Pasar+arreglo+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ejemplos básicos de manipulación de arreglos en C#</title>
		<link>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/</link>
		<comments>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 21:00:42 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2191</guid>
		<description><![CDATA[Ejemplos básicos de manipulación de arreglos en C# Sumar elementos de un array Sinopsis: hacer la sumatoria de los elementos de un arreglo. Resultado&#8230; Suma de todos los elementos del array: 55 Descargar código fuente Creacion de histogramas Sinopsis: crear un histograma (barras a base de asteriscos) a partir de unos datos. Resultado&#8230; Elemento Valor [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fejercicios-basicos-manejo-arreglos-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplos%20b%C3%A1sicos%20de%20manipulaci%C3%B3n%20de%20arreglos%20en%20C%23%22%20%7D);"></div>
<p>Ejemplos básicos de manipulación de arreglos en C#</p>
<h3>Sumar elementos de un array</h3>
<p><strong>Sinopsis</strong>: hacer la sumatoria de los elementos de un arreglo.</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class SumarArreglo
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     int total = 0;
     for ( int i = 0; i &lt; a.Length; i++ )
        total += a[ i ];
     Console.WriteLine( &quot;Suma de todos los elementos del array: &quot; + total);
  } // fin de Main
} // fin de la clase SumarArreglo</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Suma de todos los elementos del array: 55</div>
<p><a class="tooltip descargacodigo" title="Suma de elementos de arreglos en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Sumar+Arreglo+C+Sharp">Descargar código fuente</a></p>
<h3>Creacion de histogramas</h3>
<p><strong>Sinopsis</strong>: crear un histograma (barras a base de asteriscos) a partir de unos datos.<span id="more-2191"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
class Histograma
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] n = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 };
     string salida = &quot;Elemento\tValor\tHistograma\n&quot;;
     // construir salida
     for ( int i = 0; i &lt; n.Length; i++ )
     {
        salida += &quot;\n&quot; + i + &quot;\t\t\t&quot; + n[ i ] + &quot;\t\t&quot;;
        for ( int j = 1; j &lt;= n[ i ]; j++ ) // imprimir una barra
           salida += &quot;*&quot;;
     }
     Console.WriteLine( salida);
  } // fin Main
} // fin de la clase Histograma</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Elemento	Valor	Histograma</p>
<p>0			19		*******************<br />
1			3		***<br />
2			15		***************<br />
3			7		*******<br />
4			11		***********<br />
5			9		*********<br />
6			13		*************<br />
7			5		*****<br />
8			17		*****************<br />
9			1		*</p></div>
<p><a class="tooltip descargacodigo" title="Histogramas en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Histograma+C+Sharp">Descargar código fuente</a></p>
<h3>Estadisticas de notas de estudiantes</h3>
<p><strong>Sinopsis</strong>: apartir de un arreglo de notas (puntajes) identificar la frecuencia de cada una de ellas entre todos los estudiantes.</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class EncuestaEstudiantes
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] respuestas = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1,
        6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7,
        5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

     int[] frecuencia = new int[ 11 ];
     string salida = &quot;&quot;;

     // incrementar la frecuecia de para cada respuesta
     for ( int j = 0; j &lt; respuestas.Length; j++ )
        ++frecuencia[ respuestas[ j ] ];

     salida += &quot;Puntaje\tFrecuencia\n&quot;;

     // resultados
     for ( int puntaje = 1; puntaje &lt; frecuencia.Length; puntaje++ )
        salida += puntaje + &quot;\t\t&quot; + frecuencia[ puntaje ] + &quot;\n&quot;;

     Console.WriteLine( salida);

  } // fin Main

} // fin de la clase EncuestaEstudiantes</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Puntaje	Frecuencia<br />
1		2<br />
2		2<br />
3		2<br />
4		2<br />
5		5<br />
6		11<br />
7		5<br />
8		7<br />
9		1<br />
10		3</div>
<p><a class="tooltip descargacodigo" title="Encuesta Estudiantes en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Estudiantes+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Arreglos en C#</title>
		<link>http://casidiablo.net/arreglos-en-c-sharp/</link>
		<comments>http://casidiablo.net/arreglos-en-c-sharp/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 20:51:40 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplo]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2179</guid>
		<description><![CDATA[La creación y manipulación de arrays en C# es similar a la de cualquier otro lenguaje de programación, aunque difiere un poco en cuanto a sintaxis (desde la perspectiva de un programador en Java). Tenemos entoces 2 maneras básicas de iniciar un arreglo: Al asignarle un tamaño estamos iniciándolo con los valores por defecto (en [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Farreglos-en-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Arreglos%20en%20C%23%22%20%7D);"></div>
<p>La creación y manipulación de arrays en C# es similar a la de cualquier otro lenguaje de programación, aunque difiere un poco en cuanto a sintaxis (desde la perspectiva de un programador en Java).</p>
<p>Tenemos entoces 2 maneras básicas de iniciar un arreglo:</p>
<ul>
<li>Al asignarle un tamaño estamos iniciándolo con los valores por defecto (en el caso de enteros, es cero)</li>
<li>En el momento de la declaración podemos asignar directamente los valores, poniéndolos dentro de corchetes ({ &#8230; }), separados por comas.</li>
</ul>
<h3>Ejemplo&#8230;</h3>
<p><span id="more-2179"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
class InitArray
{
	// metodo main
	static void Main( string[] args )
	{
	   string salida = &quot;&quot;;
	   int[] x;            // declarar el array
	   x = new int[ 10 ];  // y asignarle un tamanio
     // iniciar un arreglo con tamanio y datos especificos
	   int[] y = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };
	   const int TAMANIO_ARRAY = 10; // crear una constante
	   int[] z;                   // declarar un array de enteros
	   // asignar el tammanio con la constante
	   z = new int[ TAMANIO_ARRAY ];
	   // asignar valores al array
	   for ( int i = 0; i &lt; z.Length; i++ )
	      z[ i ] = 2 + 2 * i;
	   salida += &quot;Indice\tArray x\tArray y\tArray z\n&quot;;
	   // poner los valores del array en el string de salida
	   for ( int i = 0; i &lt; TAMANIO_ARRAY; i++ )
	      salida += i + &quot;\t\t&quot; + x[ i ] + &quot;\t\t&quot; + y[ i ] +
	         &quot;\t\t&quot; + z[ i ] + &quot;\n&quot;;
	Console.WriteLine(salida);
	} // fin de Main
} // fin de la clase IniciarArray</pre>
<h3>Salida del programa&#8230;</h3>
<div class="consola"><code>Indice Array x Array y Array z<br />
0      0      32      2<br />
1      0      27      4<br />
2      0      64      6<br />
3      0      18      8<br />
4      0      95      10<br />
5      0      14      12<br />
6      0      90      14<br />
7      0      70      16<br />
8      0      60      18<br />
9      0      37      20</code></div>
<h3>Descargar código fuente</h3>
<p><a class="tooltip descargacodigo" title="Iniciar Arrays C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Iniciar+Arreglos+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/arreglos-en-c-sharp/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>Números aleatorios en C#</title>
		<link>http://casidiablo.net/numeros-random-c-sharp/</link>
		<comments>http://casidiablo.net/numeros-random-c-sharp/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 17:02:52 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[monodevelop]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1143</guid>
		<description><![CDATA[La generación de números aleatoreos es una de las prácticas más importantes en cualquier lenguaje de programación, sobre todo cuando deseamos desarrollar juegos, por ejemplo. Para usar números aleatorios en C# podemos utilizar la clase Random del namespace System, de la siguiente manera: El método Next de la clase Random genera y devuelve un número [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fnumeros-random-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22N%C3%BAmeros%20aleatorios%20en%20C%23%22%20%7D);"></div>
<p>La generación de números aleatoreos es una de las prácticas más importantes en cualquier lenguaje de programación, sobre todo cuando deseamos desarrollar juegos, por ejemplo. Para usar números aleatorios en <a href="http://casidiablo.net/c-y-net/">C#</a> podemos utilizar la clase <strong>Random</strong> del namespace <strong>System</strong>, de la siguiente manera:</p>
<pre class="brush: csharp; title: ; notranslate">Random objeto = new Random();
int numero = objeto.Next();</pre>
<p>El método Next de la clase Random genera y devuelve un número aleatorio entre 0 y la constante <strong>Int32.MaxValue</strong> (2,147,483,647). El número es generado después de (como decía mi profesora de matemáticas) <em>complejos procesos matemáticos</em>, y como en casi todos los lenguajes necesitan de una semilla (seed) para ser generados, que por defecto es la hora del sistema.</p>
<p>Aún así, muchas veces necesitamos que el número sea generado en un rango específico de valores. Por ejemplo, para una aplicación que simule el lanzamiento de un dado de seis caras necesitamos generar números entre 1 y 6. Para lograr esto, el método <strong>Next</strong> puede recibir además un entero que indica el rango máximo del número aleatorio. Por ejemplo, el código:</p>
<pre class="brush: csharp; title: ; notranslate">Random objeto = new Random();
int numero = objeto.Next(6);</pre>
<p>generaría un número aleatorio entre 0 y 7 (pero no 6), es decir, seis posibles números. Pero, si desearamos algún rango más exacto, podríamos hacer algo como:</p>
<pre class="brush: csharp; title: ; notranslate">Random objeto = new Random();
int numero = objeto.Next(1, 7);</pre>
<p>lo que generaría números entre 1 y 7 (pero no 7), de nuevo seis números posibles.</p>
<h3>Ejemplo completo&#8230;</h3>
<p>En el siguiente ejemplo se utilizará la clase <strong>Random</strong> para generar una serie de números aleatorios cada vez que se presiona un botón:</p>
<p style="text-align: center;"><img class="aligncenter" title="pantallazo numero aleatorio" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/07/pantallazo-numero-aleatorio.png" alt="pantallazo numero aleatorio" /></p>
<p>El código lo pongo para su descarga abajo, ya que lo hice con <a href="http://casidiablo.net/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/">Gtk# usando MonoDevelop</a>, y sería engorroso poner todo el código. Así que solo pondré la parte del código que nos interesa:</p>
<pre class="brush: csharp; title: ; notranslate">    private Random obj = new Random();
    //Método ejecutado al presionar el botón
    protected virtual void generar_Click (object sender, System.EventArgs e)
    {
        etiqueta.Text = &quot;&quot;;
        for(int i = 0; i &lt; 4 ; i++)
        {
            for(int j = 0; j &lt; 4 ; j++)
                etiqueta.Text += obj.Next(1, 10) +&quot;\t\t&quot;;
            etiqueta.Text += &quot;\n\n&quot;;
        }
    }</pre>
<h3>Enlaces y descargas</h3>
<ul>
<li><a href="http://casidiablo.net/descargar/Numeros+Aleatorios+C+Sharp" class="tooltip" title="Proyecto para MonoDevelop">Descargar código fuente del ejemplo (usando Gtk#)</a></li>
<li><a href="http://casidiablo.net/descargar/RandomInt" class="tooltip" title="Proyecto para VisualStudio">Descargar proyecto similar en inglés (usando Windows Forms)</a></li>
<li><a href="http://casidiablo.net/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/" class="tooltip" title="¿Tienes dudas al elegir? Consulta!">Aplicaciones con GUI en .NET: ¿Gtk# o Windows Forms?</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/numeros-random-c-sharp/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Programación C++ sobre Linux</title>
		<link>http://casidiablo.net/programacion-c-sobre-linux/</link>
		<comments>http://casidiablo.net/programacion-c-sobre-linux/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 19:51:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=360</guid>
		<description><![CDATA[Nota: este es un artículo que escribí hace mucho tiempo, y que decidí rescatar y actualizar un poco. Si se dan cuenta habla sobre RCS y CVS en vez de SVN y GIT, pero bueno, a alguien le servirá. Pueden descargar la versión PDF con todos los artículos incluidos. Este artículo pretende orientar un poco [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fprogramacion-c-sobre-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Programaci%C3%B3n%20C%2B%2B%20sobre%20Linux%22%20%7D);"></div>
<p class="avisolegal"><em><strong>Nota</strong></em>: este es un artículo que escribí hace mucho tiempo, y que decidí rescatar y actualizar un poco. Si se dan cuenta habla sobre RCS y CVS en vez de SVN y GIT, pero bueno, a alguien le servirá. Pueden descargar la versión PDF con todos los artículos incluidos.</p>
<p style="text-align: justify">Este artículo pretende orientar un poco acerca de lo que es la programación en C++ sobre linux. Esto NO es un tutorial de referencia de C++, si lo que buscas es eso puedes buscar en el google que hay bastantes. Posiblemente ya hayas programado en C++ sobre Windows, y has utilizado algún compilador como el C++ Builder de Borland, el Visual Studio de Microsoft o en el mejor de los casos DevC++.</p>
<p style="text-align: justify">Ok, esto es un buen comienzo. Pero lo que aquí vamos a ver es: qué nos proporciona Linux para programar en C++. Como sabes en Linux las cosas ya no son tan fáciles, pero tampoco difÃ­ciles; de hecho C++ es famoso gracias a Linux, son como uña y mugre. La cuestión es que nos centraremos en la programación desde la consola. Si lo tuyo no es la consola puedes echarle un vistazo a la sección que trata sobre <a title="Visitar página web de Anjuta" href="http://www.anjuta.org/">Anjuta</a>, que es un IDE para C++ en Linux, pero te recomiendo que leas todo el artículo, te aseguro que te servirá.</p>
<p style="text-align: justify">Vamos a tratar los siguientes temas (y talvez algunos más):</p>
<ul>
<li><a title="Ver capítulo" href="http://casidiablo.net/editores-de-texto-en-linux/">Editores</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/compiladores-de-cc-en-linux/">Compiladores</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/bibliotecas-compartidas-de-c-en-linux/">Bibliotecas y enlace</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/construccion-o-creacion-uso-del-comando-make/">Creación de archivos ejecutables con make</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/depuracion-programas-linux/">Depuración con gdb</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/control-de-versiones-con-rcs-y-cvs/">Control de versiones con RCS y CVS</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/crear-documentacion-comando-man/">Creación de documentación para el comando man</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/anjuta-ide-c-linux/">Anjuta, un IDE para Linux</a></li>
</ul>
<p style="text-align: justify">Esta es realmente la base de la programación en C++: cruda, sin vestimentos, tal como es.</p>
<p><a class="download tooltip" title="Descargar el tutorial!!!" href="http://casidiablo.net/descargar/Programaci%C3%B3n+C+Sobre+Linux">Descargar el tutorial completo en PDF</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/programacion-c-sobre-linux/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Paso de variables Por Referencia vs Por Valor [C#]</title>
		<link>http://casidiablo.net/funciones-referencia-valor-c-sharp/</link>
		<comments>http://casidiablo.net/funciones-referencia-valor-c-sharp/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 18:40:16 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=967</guid>
		<description><![CDATA[En C#, como en Java, u otros lenguajes de programación, es posible pasar variables a los métodos (funciones) de dos maneras: Por referencia y Por valor. La diferencia entre el uno y el otro es básicamente que: Cuando una variable es pasada por valor, el método recibe una copia del valor de la variable. Por [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Ffunciones-referencia-valor-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Paso%20de%20variables%20Por%20Referencia%20vs%20Por%20Valor%20%5BC%23%5D%22%20%7D);"></div>
<p>En <a href="http://casidiablo.net/c-y-net/">C#</a>, como en <a href="http://casidiablo.net/java/">Java</a>, u otros lenguajes de programación, es posible pasar variables a los métodos (funciones) de dos maneras: Por referencia y Por valor. La diferencia entre el uno y el otro es básicamente que:</p>
<ul>
<li>Cuando una variable es pasada por valor, el método recibe una copia del valor de la variable. Por lo tanto, los cambios realizados a esa variable dentro del contexto de la función, NO afecta a la variable original. Pero&#8230;</li>
<li>Cuando es pasada por referencia, el método recibe la referencia a la variable original. Por tanto los cambios realizados a esa variable dentro del contexto de la función, AFECTA a la variable original.</li>
</ul>
<h3>¿Cual debo usar?</h3>
<p>Eso depende de lo que quieras hacer. Cada una tiene sus ventajas y desventajas. Al pasar una variable por valor, estás asegurando que dicho valor no va a ser modificado por equivocación. Por otro lado, al pasar una variable por referencia, aunque la variable puede ser modificada por equivocación, ahorramos tiempo de ejecución y memoria, puesto que no es necesario crear una copia de la variable.</p>
<h3>Pasar variables por referencia</h3>
<p>Todas las variables que pasamos a un método declarado normalmente, <strong>son por valor</strong>. Para pasar argumentos por referencia es necesario utilizar las palabras reservada <em><strong>ref</strong></em> o <em><strong>out</strong></em>, tanto al declarar el método como al invocarlo. Cuando pasamos un argumento usando ref, es necesario que dicha variable esté ya inicializada, de lo contrario obtendremos una excepción. Si la variable que deseamos pasar por referencia no está inicializada, es nesesario usar <em><strong>out</strong></em>, de tal manera que podamos inicializar la variable dentro del contexto del método.</p>
<h3>Ejemplo&#8230;</h3>
<p>En el siguiente ejemplo tenemos dos variables (<em>y</em> Y <em>z</em>), las cuales son procesadas por métodos que reciben variables por valor y por referencia. El resultado y el código son:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2008/07/pantallazo-valor-vs-referencia.png"><img class="size-medium wp-image-969 aligncenter" title="pantallazo-valor-vs-referencia" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/07/pantallazo-valor-vs-referencia-300x171.png" alt="" width="300" height="171" /></a></p>
<p><span id="more-967"></span></p>
<pre class="brush: csharp; title: ; notranslate">// Demostración de paso por valor y referencia
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ValorReferencia
{
   public class ValorReferencia : Form
   {
      private Button mostrarSalida;
      private Label etiquetaResultado;
      public ValorReferencia()
      {
         this.mostrarSalida = new Button();
         this.etiquetaResultado = new Label();
         this.SuspendLayout();
         //Boton
         this.mostrarSalida.Location = new Point(105, 8);
         this.mostrarSalida.Name = &quot;mostrarSalida&quot;;
         this.mostrarSalida.Size = new Size(130, 23);
         this.mostrarSalida.TabIndex = 0;
         this.mostrarSalida.Text = &quot;Mostrar salida&quot;;
         this.mostrarSalida.Click += new System.EventHandler(this.mostrarSalida_Click);
         //Label
         this.etiquetaResultado.Location = new Point(10, 40);
         this.etiquetaResultado.Name = &quot;etiquetaResultado&quot;;
         this.etiquetaResultado.Size = new Size(272, 104);
         this.etiquetaResultado.TabIndex = 1;
         this.AutoScaleBaseSize = new Size(5, 13);
         this.ClientSize = new Size(292, 175);
         this.Controls.AddRange(new Control[] {
            this.etiquetaResultado,
            this.mostrarSalida});
         this.Name = &quot;Formulario&quot;;
         this.Text = &quot;Valor vs Referencia&quot;;
         this.ResumeLayout(false);
      }
      static void Main()
      {
         Application.Run(new ValorReferencia());
      }
      // x es pasado por referencia y el metodo modifica
      // el valor original de la variable
      void CuadradoRef( ref int x )
      {
         x = x * x;
      }
      // x es pasado con el parametro out que inicializa y
      // modifica el valor original de la variable
      void CuadradoOut( out int x )
      {
         x = 6;
         x = x * x;
      }
      // x pasado por valor y el metodo NO modifica
      // el valor original de la variable
      void Cuadrado( int x )
      {
         x = x * x;
      }
      private void mostrarSalida_Click(
         object sender, System.EventArgs e )
      {
         int y = 5; // crear nuevo entero e inicializarlo a 5
         int z;     // declarar z, pero no incializarlo
         // mostrar valores originales de 'y' y 'z'
         etiquetaResultado.Text = &quot;Valor original de y: &quot; + y + &quot;\n&quot;;
         etiquetaResultado.Text += &quot;Valor original de z: uninitialized\n\n&quot;;
         // pasar 'y' y 'z' por referencia
         CuadradoRef( ref y );
         CuadradoOut( out z );
         // mostrar valores de 'y' y 'z' despues
        // de ser modificados por CuadradoRef y CuadradoOut
         etiquetaResultado.Text += &quot;Valor de y despues de CuadradoRef: &quot; + y + &amp;amp;amp;amp;amp;uot;\n&quot;;
         etiquetaResultado.Text += &quot;Valor de z despues de CuadradoOut: &quot; + z + &quot;\n\&quot;;
         // pasar y y z por valor
         Cuadrado( y );
         Cuadrado( z );
         // mostrar que los valores no han cambiado
         etiquetaResultado.Text += &quot;Valor de y despues de Cuadrado: &quot; + y + &amp;amp;amp;amp;amp;uot;\n&quot;;
         etiquetaResultado.Text += &quot;Valor de z despues de Cuadrado: &quot; + z + &quot;\n&quot;;
      } // end method mostrarSalida_Click
   }
}</pre>
<h3>Descargar</h3>
<ul>
<li><a class="tooltip" title="En español" href="http://casidiablo.net/descargar/Valor+vs+Referencia+%28S+Sharp%29">Código fuente simplificado</a></li>
<li><a class="tooltip" title="En ingleś" href="http://casidiablo.net/descargar/RefOutTest">Código fuente original</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/funciones-referencia-valor-c-sharp/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Aplicaciones con GUI en .NET: ¿Gtk# o Windows Forms?</title>
		<link>http://casidiablo.net/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/</link>
		<comments>http://casidiablo.net/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/#comments</comments>
		<pubDate>Mon, 05 May 2008 20:03:51 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[artículos]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>
		<category><![CDATA[monodevelop]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/05/05/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/</guid>
		<description><![CDATA[Hace tiempo discutía con algunas personas la mejor manera de usar Mono tanto en el escritorio Linux como en Windows. Me refiero al momento de escoger entre Windows Forms y Gtk#, para desarrollar aplicaciones con interfaz gráfica. Personalmente pienso que la mejor opción es, inclinándome hacia el lado del software libre, usar Mono + Gtk#. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Faplicaciones-con-gui-en-net-%2525c2%2525bfgtk-o-windows-forms%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Aplicaciones%20con%20GUI%20en%20.NET%3A%20%C2%BFGtk%23%20o%20Windows%20Forms%3F%22%20%7D);"></div>
<p><img border="0" width="600" src="http://i270.photobucket.com/albums/jj96/Casidiablo/gtk-mono.png" height="455" /></p>
<p>Hace tiempo discutía con algunas personas la <em>mejor manera de usar Mono</em> tanto en el escritorio <a href="http://www.casidiablo.net/wordpress/index.php/category/linux/">Linux</a> como en Windows. Me refiero al momento de escoger entre <a href="http://en.wikipedia.org/wiki/Windows_Forms" title="Read at the Wikipedia ;)">Windows Forms</a> y <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a>, para desarrollar aplicaciones con interfaz gráfica. Personalmente pienso que <strong>la mejor opción es, inclinándome hacia el lado del <a href="http://www.casidiablo.net/wordpress/index.php/category/software-libre/">software libre</a>, usar <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/10/acerca-de-mono/">Mono</a> + <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a></strong>. Claro, eso también depende de tus gustos como desarrollador y, más importante aún, de las necesidades del proyecto a realizar.</p>
<p>Lo que quiero enseñarles en esta entrada es <em>cómo se pueden tomar diferentes caminos</em>, y aclarar algunas dudas que me han planteado ciertos lectores. Siendo así, vamos a tomar como ejemplo a dos programas sencillos: el primero usando <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a> y corriendo tanto en <a href="http://www.casidiablo.net/wordpress/index.php/category/linux/">Linux</a> como Windows, y el otro usando <a href="http://en.wikipedia.org/wiki/Windows_Forms" title="Read at the Wikipedia ;)">Windows Forms</a> corriendo tanto en Windows como <a href="http://www.casidiablo.net/wordpress/index.php/category/linux/">Linux</a>.</p>
<h3>Desarrollando y ejecutando aplicaciones Gtk# y Windows Forms usando Mono</h3>
<p>Antes de comenzar con los ejercicios, veamos qué necesitamos para desarrollar y ejecutar aplicaciones que usen <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a> y <a href="http://en.wikipedia.org/wiki/Windows_Forms" title="Read at the Wikipedia ;)">Windows Forms</a>. Es necesario (obviamente) tener dicho framework instalado; afortunadamente, la mayoría de las distribuciones Gnu/Linux actuales tienen los paquetes necesarios en los repositorios, e incluso vienen con lo necesario para ejecutar aplicaciones desarrolladas con <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/10/acerca-de-mono/">Mono</a> (como <a href="http://www.gnome.org/projects/tomboy/">Tomboy</a>, <a href="http://f-spot.org/Main_Page">Fspot</a> o <a href="http://banshee-project.org/Main_Page">Banshee</a>). <em>Para compilar aplicaciones C# para mono es necesario utilizar el <a href="http://www.mono-project.com/CSharp_Compiler">CSharp Compiler</a> (<code>cms</code>)</em>.</p>
<p>También, es posible <a href="http://www.go-mono.com/mono-downloads/download.html">descargar mono</a> para los más importantes sistemas operativos, incluyendo por supuesto sistemas Microsoft Windows. Para tal caso es posible descargar una versión completa (<a href="http://www.casidiablo.net/wordpress/index.php/2007/12/10/acerca-de-mono/">Mono</a> + <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a> + XSP), o tan solo el intérprete + <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a> para un <em>Framework .NET</em> ya instalado sobre el ordenador.</p>
<h3>Código del programa que usa Gtk#</h3>
<p><span id="more-890"></span><br />
//Ejemplo GTK (EjemploGtk.cs)<br />
using Gtk;<br />
using System;<br />
class EjemploGtk {<br />
	static void Main()<br />
	{<br />
		Application.Init ();<br />
		//Crear el boton<br />
		Button btn = new Button (&#8220;Hola monito!&#8221;);<br />
		//Asignar un evento al evento Clic del boton<br />
		btn.Clicked += new EventHandler (hola);<br />
		//Crear el objeto ventana<br />
		Window ventana = new Window (&#8220;Lindo primate!&#8221;);<br />
		//Asignar un metodo al evento Cerrar ventan<br />
		ventana.DeleteEvent += new DeleteEventHandler (cerrar_ventana);<br />
		//Asigna el ancho y alto de la ventana<br />
		ventana.DefaultWidth = 200;<br />
        ventana.DefaultHeight = 60;<br />
		//Anyadir el boton a la ventana<br />
		ventana.Add (btn);<br />
		//Mostrar la ventana<br />
		ventana.ShowAll ();<br />
		//Ejecutar la aplicacion<br />
		Application.Run ();<br />
	}<br />
	static void cerrar_ventana (object obj, DeleteEventArgs args)<br />
	{<br />
		Application.Quit ();<br />
	}<br />
	static void hola (object obj, EventArgs args)<br />
	{<br />
		Console.WriteLine(&#8220;Lindo monito!&#8221;);<br />
		Application.Quit ();<br />
	}<br />
}</p>
<p>Para compilarlo y ejecutarlo puedes usar los siguientes comandos:</p>
<p class="consola">mcs -pkg:gtk-sharp-2.0 EjemploGtk.cs<br />
mono EjemploGtk.exe</p>
<p>El resultado es el mismo tanto en Linux como en Windows:</p>
<p style="text-align: center"><img width="259" src="http://i270.photobucket.com/albums/jj96/Casidiablo/gtk-linux.png" alt="gtk sobre linux" height="91" title="gtk sobre linux" /> <img width="208" src="http://i270.photobucket.com/albums/jj96/Casidiablo/gtk-win.png" alt="gtk-sharp sobre windows" height="94" title="gtk-sharp sobre windows" /></p>
<h3>Código del programa que usa Windows Forms</h3>
<p>Este programa hace exactamente lo mismo que el anterior, pero esta vez usando Windows Forms para la interfaz gráfica:</p>
<p>//Ejemplo Windows Forms (EjemploWinForms.cs)<br />
using System.Drawing;<br />
using System.Windows.Forms;<br />
using System;<br />
class EjemploWinForms : Form{<br />
	static void Main(){<br />
		Application.Run(new EjemploWinForms());<br />
	}<br />
	public EjemploWinForms() {<br />
		//Crear e iniciar el boton, y sus propiedades<br />
		Button boton = new Button();<br />
		boton.Location = new Point(0, -1);<br />
		boton.Name = &#8220;boton&#8221;;<br />
		boton.Size = new System.Drawing.Size(193, 60);<br />
		boton.TabIndex = 0;<br />
		boton.Text = &#8220;Botoncito&#8221;;<br />
		//Asignar un evento al evento Clic del boton<br />
		boton.Click += new System.EventHandler(hola);<br />
		//Indicar el tamanyo de la ventana<br />
		ClientSize = new System.Drawing.Size(193, 60);<br />
		//Anyadir el boton<br />
		Controls.Add(boton);<br />
		Text = &#8220;Ventanita&#8221;;<br />
		ResumeLayout(false);<br />
	}<br />
	private void hola(object sender, EventArgs e) {<br />
		Console.WriteLine(&#8220;Un mensajito!&#8221;);<br />
		Close ();<br />
	}<br />
}</p>
<p>Para compilarlo y ejecutarlo puedes usar los siguientes comandos:</p>
<p class="consola">mcs -r:System.Drawing.dll,System.Windows.Forms.dll EjemploWinForms.cs<br />
mono EjemploWindowsForms.exe</p>
<p>El resultado es el mismo tanto en Linux como en Windows:</p>
<p style="text-align: center"><img width="199" src="http://i270.photobucket.com/albums/jj96/Casidiablo/winforms-linux.png" alt="windows forms sobre linux" height="92" title="windows forms sobre linux" /> <img width="208" src="http://i270.photobucket.com/albums/jj96/Casidiablo/winforms-win.png" alt="windows forms sobre windows" height="94" title="windows forms sobre windows" /></p>
<h3>Consideraciones a tener en cuenta</h3>
<p>Al momento de desarrollar aplicaciones con GUIs en C# de manera rápida, tenemos basicamente dos opciones:</p>
<ul>
<li>Podemos <strong>usar Monodevelop que incluye un editor de interfaces gráficas</strong> basado en Stetic y que por supuesto desarrolla dichas interfaces bajo <a href="http://en.wikipedia.org/wiki/Gtk_Sharp" title="Read at the Wikipedia ;)">Gtk#</a>.</li>
<li>O usar el editor de interfaces de Microsoft Visual Studio que, aunque no es libre, he de reconocer que es bastante bueno y completo. En este caso las aplicaciones correrían usando Windows Forms.</li>
</ul>
<p>Por supuesto, si deseamos usar Mono como plataforma de desarrollo no vale la pena usar herramientas Microsoft. De hecho, opino que el framework de Mono incluye librerías para ejecutar aplicaciones que usen Windows Forms, no con el fin de desarrollar aplicaciones que usen dichas librerías, sino para facilitar la migración de proyectos existentes hacia Mono.</p>
<h3>Enlaces interesantes</h3>
<ul>
<li><a href="http://www.mono-project.com/">Página oficial del proyecto Mono</a></li>
<li><a href="http://www.monodevelop.com/">Página oficial de Monodevelop</a></li>
<li><a href="http://http://www.casidiablo.net/wordpress/index.php/c-y-net/">Ejemplos de programación C#</a></li>
</ul>
<p><a href="http://www.casidiablo.net/codigos/C_Sharp/Ejemplos_Gtk_WinForms_Mono.zip" title="Descargar código fuente!" class="descargacodigo">Descargar código fuente de los ejemplos</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/aplicaciones-con-gui-en-net-%c2%bfgtk-o-windows-forms/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Un blog recomendadísimo</title>
		<link>http://casidiablo.net/un-blog-recomendadisimo/</link>
		<comments>http://casidiablo.net/un-blog-recomendadisimo/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 15:43:24 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/03/27/un-blog-recomendadisimo/</guid>
		<description><![CDATA[De nuevo online, después de que de nuevo se me agotara el ancho de banda (puto hosting). Al grano&#8230; desde hace un tiempo que he seguido por el lector de feeds al blog Gigacode, y la verdad me parece que Carlos (colombiano como yo!) hace un trabajo realmente estupendo. De sus últimas entradas interesantes destaco: [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fun-blog-recomendadisimo%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Un%20blog%20recomendad%C3%ADsimo%22%20%7D);"></div>
<p><a href="http://www.gigacode.blogspot.com/" target="_blank"></a></p>
<p style="text-align: center"><a href="http://www.gigacode.blogspot.com/" target="_blank"><img src="http://i270.photobucket.com/albums/jj96/Casidiablo/gigacode-1.png" alt="GigaCode" border="0" height="340" width="600" /></a></p>
<p>De nuevo online, después de que de nuevo se me agotara el ancho de banda (puto hosting). Al grano&#8230; desde hace un tiempo que he seguido por el lector de feeds al blog <a href="http://www.gigacode.blogspot.com/">Gigacode</a>, y la verdad me parece que Carlos (colombiano como yo!) hace un trabajo realmente estupendo. De sus últimas entradas interesantes destaco:</p>
<ul>
<li><a href="http://gigacode.blogspot.com/2008/03/coleccion-de-manuales-de-linux-pdf.html"> Coleccion de manuales de linux pdf</a></li>
<li><a href="http://gigacode.blogspot.com/2008/03/programacin-en-c-para-principiantes.html">Programación en C++ para principiantes</a></li>
<li><a href="http://gigacode.blogspot.com/2008/03/coleccion-de-manualestutoriales-en-java.html">Coleccion de Manuales,Tutoriales en java , J2ME</a></li>
<li><a href="http://gigacode.blogspot.com/2008/03/8-lenguajes-de-programacin-que-deberas.html">8 lenguajes de programación que deberías aprender</a></li>
</ul>
<p>Sin duda un gran sitio para iniciarse en el maravilloso mundo de la programación!</p>
<p>Enlace directo: <strong><a href="http://www.gigacode.blogspot.com/">Gigacode</a></strong> | <strong><a href="http://gigacode.blogspot.com/feeds/posts/default">Feeds</a></strong></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/un-blog-recomendadisimo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[código] La interfaz Runnable en Java</title>
		<link>http://casidiablo.net/java-runnable/</link>
		<comments>http://casidiablo.net/java-runnable/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 17:45:48 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/01/28/java-runnable/</guid>
		<description><![CDATA[En ejemplos anteriores hemos creado clases que heredan de la clase Thread las cuales soportan subprocesamiento múltiple; y sobreescribimos el método run para especificar las tareas a realizar concurrentemente. Sin embargo, puesto que en Java NO existe la herencia múltiple (como en C++) ¿cómo podemos hacer entonces que una clase, que ya hereda de otra [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fjava-runnable%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Bc%C3%B3digo%5D%20La%20interfaz%20Runnable%20en%20Java%22%20%7D);"></div>
<p>En <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/19/java-hilos/">ejemplos anteriores</a> <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/27/java-sincronizacion-subprocesos/">hemos creado</a> <a href="http://www.casidiablo.net/wordpress/index.php/2008/01/27/java-bufer-circular-subprocesamiento/">clases que heredan</a> <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/27/hilos-java/">de la clase</a> <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> las cuales soportan <a href="http://www.casidiablo.net/wordpress/index.php/2007/12/27/java-sincronizacion-subprocesos/">subprocesamiento múltiple</a>; y sobreescribimos el método <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#run()">run</a></code> para especificar las tareas a realizar concurrentemente. Sin embargo, puesto que en <strong><a href="http://www.casidiablo.net/wordpress/index.php/java/">Java</a></strong> NO existe la herencia múltiple (como en C++) ¿cómo podemos hacer entonces que una clase, que ya hereda de otra distinta a <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code>, soporte subprocesamiento múltiple? La respuesta es sencilla: implementar la interfaz <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code>. De hecho la clase <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> implementa a <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code>.</p>
<p>Al implementar la interfaz <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code> en una clase, un objeto puede manipular objetos de esa clase como objetos <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code>. Y tal como cuando heredamos de <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code>, debemos declarar y sobrecargar el método <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html#run()">run()</a></code>.</p>
<p>Cuando una clase utiliza un objeto <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code> para manipular subprocesos, este crea un objeto <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> y asocia el objeto <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code> con ese objeto <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> (¿enredado? para nada; sigue leyendo y verás que es muy sencillo). La clase <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> posee constructores que pueden recibir objetos <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code>, por ejemplo el constructor</p>
<p><code>public <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code>(<code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code> <code>objetoRunnable</code>)</code></p>
<p>especifica que el método <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html#run()">run()</a></code> del objeto <code>objetoRunnable</code> es el que debe invocarse cuando el subproceso comience a ejecutarse. Por otro lado, el construtor</p>
<p><code>public <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code>(<code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code> <code>objetoRunnable</code>, String nombreHilo)</code></p>
<p>crea un objeto <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html">Thread</a></code> con el nombre <code>nombreHilo</code>, y especifica que el método <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html#run()">run()</a></code> del objeto <code>objetoRunnable</code> es el que debe invocarse cuando el subproceso comience a ejecutarse. ¡Veamos un ejemplo para entender mejor!</p>
<h3>Código fuente</h3>
<p style="text-align: center"><img src="http://img521.imageshack.us/img521/3488/caracteresaleatoriosnf2.gif" /></p>
<p>El siguiente applet (<code>CaracteresAleatorios.java</code>) demuestra el uso de la interfaz <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a></code>:<span id="more-827"></span></p>
<pre class="brush: java; title: ; notranslate">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CaracteresAleatorios extends JApplet implements ActionListener {
   private String alfabeto = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;
   private final static int TAMANIO = 3;
   private JLabel salidas[];
   private JCheckBox casillasVerificacion[];
   private Thread subprocesos[];
   private boolean suspendido[];
   // configurar la GUI y establecer arreglos
   public void init()
   {
      salidas = new JLabel[ TAMANIO ];
      casillasVerificacion = new JCheckBox[ TAMANIO ];
      subprocesos = new Thread[ TAMANIO ];
      suspendido = new boolean[ TAMANIO ];
      Container contenedor = getContentPane();
      contenedor.setLayout( new GridLayout( TAMANIO, 2, 5, 5 ) );
      // crear componentes de la GUI, registrar componentes de escucha y adjuntar
      // componentes al panel de contenido
      for ( int cuenta = 0; cuenta &lt; TAMANIO; cuenta++ ) {
         salidas[ cuenta ] = new JLabel();
         salidas[ cuenta ].setBackground( Color.GREEN );
         salidas[ cuenta ].setOpaque( true );
         contenedor.add( salidas[ cuenta ] );
         casillasVerificacion[ cuenta ] = new JCheckBox( &quot;Suspendido&quot; );
         casillasVerificacion[ cuenta ].addActionListener( this );
         contenedor.add( casillasVerificacion[ cuenta ] );
      }
   } // fin del método init
   // crear e iniciar subprocesos cada vez que se hace una llamada a start (es decir, después de
   // init y cuando el usuario vuelve a visitar la página Web que contiene a este subprograma)
   public void start()
   {
      for ( int cuenta = 0; cuenta &lt; subprocesos.length; cuenta++ ) {

         // crear objeto Thread; inicializar objeto que implementa a Runnable
         subprocesos[ cuenta ] =
            new Thread( new ObjetoRunnable(), &quot;Subproceso &quot; + ( cuenta + 1 ) );

         subprocesos[ cuenta ].start(); // empezar la ejecución del objeto Thread
      }
   }
   // determinar ubicación del subproceso en el arreglo subprocesos
   private int obtenerIndice( Thread actual )
   {
      for ( int cuenta = 0; cuenta &lt; subprocesos.length; cuenta++ )
         if ( actual == subprocesos[ cuenta ] )
            return cuenta;

      return -1;
   }
   // este método se llama cuando el usuario cambia de páginas Web; detiene todos los subprocesos
   public synchronized void stop()
   {
      // establecer referencias en null para terminar el método run de cada subproceso
      for ( int cuenta = 0; cuenta &lt; subprocesos.length; cuenta++ )
         subprocesos[ cuenta ] = null;
      notifyAll(); // notificar a todos los subprocesos en espera, para que puedan terminar
   }
   // manejar eventos de botón
   public synchronized void actionPerformed( ActionEvent evento )
   {
      for ( int cuenta = 0; cuenta &lt; casillasVerificacion.length; cuenta++ ) {
         if ( evento.getSource() == casillasVerificacion[ cuenta ] ) {
            suspendido[ cuenta ] = !suspendido[ cuenta ];
            // cambiar color de la etiqueta al suspender/reanudar
            salidas[ cuenta ].setBackground(
               suspendido[ cuenta ] ? Color.RED : Color.GREEN );
            // si el subproceso se reanudó, asegurarse de que empiece a ejecutarse
            if ( !suspendido[ cuenta ] )
               notifyAll();
            return;
         }
      }
   } // fin del método actionPerformed
   // clase interna privada que implementa a Runnable para controlar los subprocesos
   private class ObjetoRunnable implements Runnable {
      // colocar caracteres aleatorios en la GUI, las variables subprocesoActual e
      // indice son finales, para poder usarlas en una clase interna anónima
      public void run()
      {
         // obtener referencia al subproceso en ejecución
         final Thread subprocesoActual = Thread.currentThread();
         // determinar la posición del subproceso en el arreglo
         final int indice = obtenerIndice( subprocesoActual );
         // la condición del ciclo determina cuándo debe detenerse el subproceso; el ciclo
         // termina cuando la referencia subprocesos[ indice ] se vuelve null
         while ( subprocesos[ indice ] == subprocesoActual ) {
            // estar inactivo de 0 a 1 segundo
            try {
               Thread.sleep( ( int ) ( Math.random() * 1000 ) );
               // determinar si el subproceso debe suspender su ejecución;
               // sincronizar con el objeto de subprograma CaracteresAleatorios
               synchronized( CaracteresAleatorios.this ) {
                  while ( suspendido[ indice ] &amp;amp;&amp;amp;
                     subprocesos[ indice ] == subprocesoActual ) {
                     // suspender temporalmente la ejecución del subproceso
                     CaracteresAleatorios.this.wait();
                  }
               } // fin del bloque synchronized
            } // fin de bloque try
            // si el subproceso se interrumpió durante su espera/inactividad, imprimir el rastreo de la pila
            catch ( InterruptedException excepcion ) {
               excepcion.printStackTrace();
            }
            // mostrar caracter en objeto JLabel correspondiente
            SwingUtilities.invokeLater(
               new Runnable() {
                  // elegir caracter aleatorio y mostrarlo
                  public void run()
                  {
                     char mostrarChar =
                        alfabeto.charAt( ( int ) ( Math.random() * 26 ) );
                     salidas[ indice ].setText(
                        subprocesoActual.getName()  + &quot;: &quot; + mostrarChar );
                  }
               } // fin de la clase interna
            ); // fin de la llamada a SwingUtilities.invokeLater
         } // fin de instrucción while
         System.err.println( subprocesoActual.getName() + &quot; terminando&quot; );
      } // fin del método run
   } // fin de la clase interna privada ObjetoRunnable
} // fin de la clase CaracteresAleatorios</pre>
<p>El código del archivo HTML que ejecuta el applet de <strong><a href="http://www.casidiablo.net/wordpress/index.php/java/">Java</a></strong> es:</p>
<pre class="brush: xml; title: ; notranslate">&lt;html&gt;
&lt;applet code=&quot;CaracteresAleatorios.class&quot; width=275 height=90&gt;
&lt;/applet&gt;
&lt;/html&gt;</pre>
<p><a href="http://casidiablo.net/descargar/Caracteres+Aleatorios" title="Descargar código fuente!" class="descargacodigo">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/java-runnable/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

