[C con Clase] Conversión inválida de char a char. Estructuras de datos. ¿Qué pasa?

ZeLion Zelion_cracking en yahoo.es
Jue Oct 4 08:40:26 CEST 2007


Hola Ismael.

No te desesperes, en c/c++ los punteros al principio suelen llevar al caos,
jejeje.

Bien tratare antes que nada de explicarte el error.

En la estructura:

 

struct telfs 

{
       char telf[9], nombre[64];
}BaseTelfs[10];

 

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:

 

*telf = telf[0];

 

haber:

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).

 

Asi pues en tu ejemplo la funcion ‘char BuscarPorNombre (char
inNombre[64])’, tiene que devolver un char, pero tu le devuelves ‘return
BaseTelfs[i].telf;’ como ‘telf’ es un puntero a un array, te salta el error.

2 opciones:

 

Si quieres devolver el puntero tienes que cambiar ‘char BuscarPorNombre’ por
‘char* BuscarPorNombre’, si por lo contrario quieres devolver una copia del
carácter tienes que cambiar ‘return BaseTelfs[i].telf;’ por ‘return
BaseTelfs[i].telf[numero de carácter]’.

 

Pero por lo que veo quieres devolver el nombre completo con lo que deberias
hacer la primera opcion ‘char* BuscarPorNombre’.

Asi, luego podrias hacer:

 

Char* nombre = BuscarPorNombre(“pepito”);       // Ahora en el puntero char
tendrias la direccion donde comienza el nombre ‘*char’.

 

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.

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.

 

Espero no haberte confundido mucho, creo que he pasado escribiendo, jejeje.

 

 

.: ZeLion :.

  _____  

De: cconclase-bounces en listas.conclase.net
[mailto:cconclase-bounces en listas.conclase.net] En nombre de Ismael Ramón
Enviado el: martes, 02 de octubre de 2007 18:39
Para: cconclase en listas.conclase.net
Asunto: [C con Clase] Conversión inválida de char a char. Estructuras de
datos. ¿Qué pasa?

 

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. 

char BuscarPorNombre (char inNombre[64]) {
     int i;
     for (i=0; i<10; i++)
          {
          if (inNombre == BaseTelfs[i].nombre)
             {break;}
          }
     return BaseTelfs[i].telf; 
}


Les dejo también aquí la estructura:

struct telfs {
       char telf[9],nombre[64];
       }BaseTelfs[10];


¿Qué puede estar pasando?

Me parece que no acabo de entender la sistemática de las cadenas en C++, 
¿Por qué no pueden compararse con el operador ==?
¿Qué debo hacer entonces para compararlas?


Aiss, a veces cuando me estanco en este tipo de cosas llego a pensar que soy
subnormal xD

Saludos.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20071004/9d05a8cc/attachment.html>


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