Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fabi0lo en 19 Noviembre 2012, 21:36 pm



Título: Castear estructura en un archivo.c distinto al main
Publicado por: Fabi0lo 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??


Título: Re: Castear estructura en un archivo.c distinto al main
Publicado por: rir3760 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


Título: Re: Castear estructura en un archivo.c distinto al main
Publicado por: Fabi0lo 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...


Título: Re: Castear estructura en un archivo.c distinto al main
Publicado por: rir3760 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