<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:#808040;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
span.EstiloCorreo17
        {mso-style-type:personal-reply;
        font-family:Arial;
        color:navy;}
@page Section1
        {size:595.3pt 841.9pt;
        margin:70.85pt 3.0cm 70.85pt 3.0cm;}
div.Section1
        {page:Section1;}
-->
</style>

</head>

<body lang=ES link="#808040" vlink=purple>

<div class=Section1>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Hola Ismael.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>No te desesperes, en c/c++ los punteros al
principio suelen llevar al caos, jejeje.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Bien tratare antes que nada de explicarte
el error.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>En la estructura:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>struct telfs <o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>{<br>
       char telf[9], nombre[64];<br>
}BaseTelfs[10];<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Estas declarando char telf[9], que no es
mas que un array de caracteres, esto quiere decir que ‘telf’ es un
puntero que apunta a la direccion de memoria del primer carácter o lo que es lo
mismo:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>*telf = telf[0];<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>haber:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>char telf[9];       // esto hace que se
cree en memoria 9 bloques de tipo char, asi pues a ‘telf’ (que
realmente es un puntero) se le asignara la direccion del primer carácter, y
puedes manejar este puntero como cualquier otro (teniendo en cuenta que un
array realmente, es un puntero constante).<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Asi pues en tu ejemplo la funcion ‘</span></font>char
BuscarPorNombre (char inNombre[64])’, <font size=2 color=navy face=Arial><span
style='font-size:10.0pt;font-family:Arial;color:navy'>tiene que devolver un
char, pero tu le devuelves</span></font> ‘return BaseTelfs[i].telf;’
<font size=2 color=navy face=Arial><span style='font-size:10.0pt;font-family:
Arial;color:navy'>como ‘telf’ es un puntero a un array, te salta el
error.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>2 opciones:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Si quieres devolver el puntero tienes que
cambiar ‘</span></font>char BuscarPorNombre’ <font size=2
color=navy face=Arial><span style='font-size:10.0pt;font-family:Arial;
color:navy'>por</span></font> ‘char* BuscarPorNombre’<font size=2
color=navy face=Arial><span style='font-size:10.0pt;font-family:Arial;
color:navy'>, si por lo contrario quieres devolver una copia del carácter
tienes que cambiar</span></font> ‘return BaseTelfs[i].telf;’ por ‘return
BaseTelfs[i].telf[numero de carácter]’.<o:p></o:p></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Pero por lo que veo quieres devolver el
nombre completo con lo que deberias hacer la primera opcion</span></font> ‘char*
BuscarPorNombre’.<font size=2 color=navy face=Arial><span
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Asi, luego podrias hacer:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Char* nombre = BuscarPorNombre(“pepito”);       //
Ahora en el puntero char tendrias la direccion donde comienza el nombre ‘*char’.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Para entender muy bien c/c++, tienes que
tener en cuenta como gestiona el procesador el codigo ensamblador, de ahí que
se diga que c/c++ esta entre un lenguaje de bajo nivel y uno de alto nivel, y
esta potencia se la dan los punteros. Realmente en un procesador todo son
punteros (todo menos lo que se pueda guardara en un registro de 32 bits), asi
pues, un puntero tan solo es un entero(32bits) que contiene una direccion de
memoria, y tu puedes incrementar o decrementar ese puntero para apuntar a la
direccion de memoria que quieras, asi un array de cualquier tipo, simplemente
es un bloque de memoria asignada al array, y ¿como se recorre ese bloque de
memoria?, con un puntero.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Cuando tu llamas a una funcion el
procesador realiza un CALL que realiza una llamada a una subrutina del codigo,
si alguna vez has depurado en ensamblador veras que antes del call crea lo que
se conoce como marco de pila que es donde guarda la direccion de retorno del
call, y los parámetros que se pasan a la funcion, si ese parámetro es un entero
se puede guardar en el registro EAX(32Bits), pero si es una cadena, no existe
ningun registro en el procesador para guardar un tamaño mayor de 32bits, con lo
que en lugar de insertar la cadena lo que hace el procesador es insertar en EAX
la direccion de memoria donde se guarda la cadena, y luego EAX + 1 es el
segundo entero de la cadena, EAX + 20 es el entero numero 20 de la cadena, asi
pues realmente con c/c++ es donde mas te hacercas al tipo de programación del
procesador, mientras que en otros lenguajes esto se abstrae, haciendo de ellos
un lenguaje mas facil.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Espero no haberte confundido mucho, creo
que he pasado escribiendo, jejeje.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<div>

<p class=MsoNormal align=right style='text-align:right'><font size=2
color=navy face=Arial><span style='font-size:10.0pt;font-family:Arial;
color:navy'>.: ZeLion :.</span></font><o:p></o:p></p>

</div>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div class=MsoNormal align=center style='text-align:center'><font size=3
face="Times New Roman"><span style='font-size:12.0pt'>

<hr size=2 width="100%" align=center tabindex=-1>

</span></font></div>

<p class=MsoNormal><b><font size=2 face=Tahoma><span style='font-size:10.0pt;
font-family:Tahoma;font-weight:bold'>De:</span></font></b><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'>
cconclase-bounces@listas.conclase.net
[mailto:cconclase-bounces@listas.conclase.net] <b><span style='font-weight:
bold'>En nombre de </span></b>Ismael Ramón<br>
<b><span style='font-weight:bold'>Enviado el:</span></b> martes, 02 de octubre
de 2007 18:39<br>
<b><span style='font-weight:bold'>Para:</span></b>
cconclase@listas.conclase.net<br>
<b><span style='font-weight:bold'>Asunto:</span></b> [C con Clase] Conversión
inválida de char a char. Estructuras de datos. ¿Qué pasa?</span></font><o:p></o:p></p>

</div>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>Hola de nuevo, primero gracias por responder tan rápido a mi duda
anterior. Esta vez hice una función (que se supone que compara el nombre
introducido por el usuario con los de la estructura para hallar el número de
teléfono asociado) para el primer ejercicio de estructuras del curso, y
quisiera saber qué falla en ella que el compilador no ejecuta el programa e
indica que estoy realizando una conversión inválida de `char*' a `char' en la
línea del return. <br>
<br>
char BuscarPorNombre (char inNombre[64]) {<br>
     int i;<br>
     for (i=0; i<10; i++)<br>
          {<br>
          if (inNombre ==
BaseTelfs[i].nombre)<br>
            
{break;}<br>
          }<br>
     return BaseTelfs[i].telf; <br>
}<br>
<br>
<br>
Les dejo también aquí la estructura:<br>
<br>
struct telfs {<br>
       char telf[9],nombre[64];<br>
       }BaseTelfs[10];<br>
<br>
<br>
¿Qué puede estar pasando?<br>
<br>
Me parece que no acabo de entender la sistemática de las cadenas en C++, <br>
¿Por qué no pueden compararse con el operador ==?<br>
¿Qué debo hacer entonces para compararlas?<br>
<br>
<br>
Aiss, a veces cuando me estanco en este tipo de cosas llego a pensar que soy
subnormal xD<br>
<br>
Saludos.<o:p></o:p></span></font></p>

</div>

</div>

</body>

</html>