elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Castear estructura en un archivo.c distinto al main
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Castear estructura en un archivo.c distinto al main  (Leído 2,728 veces)
Fabi0lo

Desconectado Desconectado

Mensajes: 29


Ver Perfil WWW
Castear estructura en un archivo.c distinto al main
« en: 19 Noviembre 2012, 21:36 pm »

Buenas, estoy haciendo una tarea y de momento me topé en una duda que no se como resolver.

Necesito ingresar un tipo de estructura como parámetro pero con (void*) a un archivo.c distinto al main.c

Esto es lo que tengo definido en el main.c:
Código
  1. struct str{
  2. int numLinea;
  3. char* inputFile;
  4. } Estructura;

y esto es lo que recibo en lectura.c:
Código
  1. char** leer(void* Estructura){
  2. str* Parquete = (str*) Estructura;

Al compilar, me da error, la estructura str está definido en el main.c, pero no en lectura.c

PD: Necesito hacer uso de void*, ya que (tengo entendido que) con pthread funciona así.

¿Tengo que redefinir la estructura en lectura.c? no importa si sea redundante??


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Castear estructura en un archivo.c distinto al main
« Respuesta #1 en: 19 Noviembre 2012, 23:39 pm »

¿Tengo que redefinir la estructura en lectura.c? no importa si sea redundante?
Tienes que incluir la declaración del tipo:
Código
  1. struct str {
  2. int numLinea;
  3. char* inputFile;
  4. };
En todas las unidades (archivos de código fuente) que así lo requieran (donde se declaren variables de ese tipo).

La convención en estos casos es colocar las declaraciones de tipos y macros en archivos (usualmente con la extensión ".h") y utilizar la directiva:
Código
  1. #include "algun_nombre"
Para sustituir esa linea con el contenido del archivo indicado (las declaraciones).

Y no hay problema con tener la declaración en varios archivos.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Fabi0lo

Desconectado Desconectado

Mensajes: 29


Ver Perfil WWW
Re: Castear estructura en un archivo.c distinto al main
« Respuesta #2 en: 20 Noviembre 2012, 19:47 pm »

Gracias, ahora que lo intento (como siempre) me esta tirando una pifia

Código
  1. struct str{
  2. int numLinea;
  3. char* inputFile;
  4. };
  5.  
  6. struct str Estructura = { 0, "Hola" };
  7.  
  8. void* getStruct(){
  9. Estructura.numLinea++;
  10. return (void*) Estructura;
  11. }

con
Código
  1. gcc -c Input.c
me tira este error
Código
  1. Input.c: En la funcion 'getStruc':
  2. Input.c:10:2: error: no se puede convertir a un tipo puntero
y eso que aun no implemento la cabecera...
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Castear estructura en un archivo.c distinto al main
« Respuesta #3 en: 20 Noviembre 2012, 23:29 pm »

El error se emite porque "Estructura" es una variable, no puedes (en la función "getStruct") utilizarla como si fuera una dirección de memoria:
Código
  1. struct str Estructura = { 0, "Hola" };
  2.  
  3. /* ... */
  4.  
  5. return (void*) Estructura; /* <== */

Si la intención es retornar la dirección en memoria de esa variable debes utilizar el operador "dirección de" (el '&'):
Código
  1. struct str Estructura = { 0, "Hola" };
  2.  
  3. /* ... */
  4.  
  5. return &Estructura;

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines