[C con Clase] no puedo usar una funcion mas de 2 veces sinoexplota el programa

lboquillon en gmail.com lboquillon en gmail.com
Lun Mar 14 11:49:24 CET 2011


Una pequeña corrección C++ no es ANSI. El actual estándar es ISO.
Este mensaje ha sido enviado gracias al servicio BlackBerry de Movilnet

-----Original Message-----
From: Steven Davidson <srd4121 en njit.edu>
Sender: cconclase-bounces en listas.conclase.net
Date: Sun, 13 Mar 2011 22:07:29 
To: Lista de correo sobre C y C++<cconclase en listas.conclase.net>
Reply-To: Lista de correo sobre C y C++ <cconclase en listas.conclase.net>
Subject: Re: [C con Clase] no puedo usar una funcion mas de 2 veces sino
 explota el programa

Hola Jadder,

On 3/13/2011 4:55 PM, Jadder Antonio Moya Urbáez wrote:
> Muchas gracia croe que ha sido la mejor ayuda, hay muchas cosas que
> tengo que analizar de las que me has dicho,.
>
> Tengo un lio entre char y string, si usaba switch( string ) me daba
> un error al no ser constante, y para resolver eso, tenia que pasar
> los valores en grupo de 3 al char, pero si usaba un char me daba
> error tenia que usar char[3], para que me aceptara el switch..
>
> bueno tendre pendiente todos tus puntos para aplicarlo.
>
> cual quier otras aclaraciones mejor :)
>

Bueno, pues te aclaro algunas cosas acerca del tema. En primer lugar, 
debes distinguir entre lo que ofrece el lenguaje y las bibliotecas 
estándares de ANSI C/C++.

En el lenguaje usamos un array de tipo 'char' para representar una 
cadena de caracteres, teniendo cuidado de guardar el carácter nulo, 
'\0', para indicar el final de la información; o sea, el final de la 
cadena. El lenguaje sólo sabe de las cadenas de caracteres literales, 
que son de tipo 'const char *'. Por ejemplo,

char szCadena[] = "Hola";

cout << szCadena << " Mundo" << endl;

En ANSI C++, podemos usar la clase estándar 'string' que se define en 
<string>. Esta clase sobrecarga algunos operadores, como [] para acceder 
a elementos, algunos de asignación, como = y +=, otros más como los de 
comparación. Por ejemplo,

string sCadena( "Hola" );
sCadena += " Mundo";

cout << sCadena << endl;

Hagas lo que hagas con estos objetos, siguen siendo objetos y por tanto, 
su definición y su funcionalidad depende de la biblioteca y no 
directamente del lenguaje.

En segundo lugar, creo que deberías mirar otra vez la sintaxis de 
'switch/case', que es,

switch ( <expresión_de_enteros> )
{
   case <expresión_constante_1>: <sentencia_1>
   case <expresión_constante_2>: <sentencia_2>
   ...
   default: <sentencia>
}

Como puedes ver, bajo cada 'case', lo que le sigue debe ser una 
expresión constante. Esto es porque el compilador debe conocer 
exactamente el valor de cada caso. Al usar un objeto, éste no es 
directamente un entero, pero aún así no existirían valores constantes 
conocidos por el compilador para los casos. Por ejemplo,

switch( sCadena )  // Incorrecto
{
   case string("Hola"):  ...
   case string("Mundo"):  ...
   ...
}

Tampoco tiene mucho sentido usar 'char *', ya que las cadenas literales 
serán direcciones de memoria. Por ejemplo,

char szCadena[64];
...
switch( szCadena )  // Incorrecto
{
   case "Hola":  ...
   case "Mundo":  ...
   ...
}

Al fin y al cabo, un array ES una dirección de memoria, por lo que cada 
caso se basa en una dirección diferente de memoria. Básicamente, estás 
comparando punteros y no los contenidos de las cadenas.


De todas maneras, lo que te interesa es comparar cada carácter. Esto lo 
puedes hacer tanto con objetos de la clase 'string' como con arrays de 
tipo 'char', en ambos casos usando el operador []. Por ejemplo,

switch( sCadena[0] )  // Correcto: seleccionamos en base a 'char'
{
   case 'H':  ...
   case 'M':  ...
   ...
}


Sugiero que consultes el capítulo 5 de sentencias:
http://c.conclase.net/curso/index.php?cap=005c#Se_switch

y los capítulos 8 y 10 para cadenas de caracteres y arrays en general:
http://c.conclase.net/curso/index.php?cap=008#inicio
http://c.conclase.net/curso/index.php?cap=010#inicio


Espero que esto te oriente.

Steven


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase