Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dieg007 en 2 Marzo 2011, 22:21 pm



Título: Problema con modularidad en programa en c
Publicado por: dieg007 en 2 Marzo 2011, 22:21 pm
Hola a todos, ojalá alguien me pueda ayudar.

Resulta que quiero implementar una lista enlazada simple en c, para
la cual no tengo problemas si coloco todo en un solo archivo (en main.c), pero al crear un archivo header.h y otro header.c el programa ya ni me funciona.

El codigo es el siguiente:

ARCHIVO 1: "main.c"
--------------------------------------------------------------------------------

#include <stdlib.h>
#include "header.h"

int main()
{
struct nodoCliente *puntero = crearNodoCliente();
Cliente nuevo;
nuevo.rut = 126;
nuevo.edad = 14;
nuevo.nombre = "pablo";
Cliente nuevo2;
nuevo2.rut = 987;
nuevo2.edad = 22;
nuevo2.nombre = "diego";

insertarNodoCliente( nuevo, puntero );
insertarNodoCliente( nuevo2, puntero );

printf( "%s\n", puntero->siguiente->cliente.nombre);
printf( "%s\n", puntero->siguiente->siguiente->cliente.nombre);

return 0;
}--------------------------------------------------------------------------------


ARCHIVO 2: "header.h"
--------------------------------------------------------------------------------

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

/* Nuevo tipo de dato llamado Cliente */

typedef struct {

int long unsigned rut;
char *nombre;
char *apellido;
int edad;
char *direccion;
int long unsigned fono;
char *email;

} Cliente;


/* Prototipos de las funciones */

struct nodoCliente *crearNodoCliente( void );

void insertarNodoCliente( Cliente, struct nodoCliente * );


/* Nuevo tipo de dato llamado nodoCliente */

struct nodoCliente {

Cliente cliente;
struct nodoCliente *siguiente;

};

#endif // HEADER_H_INCLUDED--------------------------------------------------------------------------------


ARCHIVO 3: "header.c"
--------------------------------------------------------------------------------


/* Inicializa un nodo */

struct nodoCliente *crearNodoCliente( void ) {

struct nodoCliente *ptrCliente;
ptrCliente = ( struct nodoCliente * )malloc( sizeof( struct nodoCliente ) );
ptrCliente -> siguiente = NULL;

return ptrCliente;

}

/* Insertar nuevo nodo cliente luego del nodo al que
apunta el segundo parámetro */

void insertarNodoCliente( Cliente nuevoCliente, struct nodoCliente *ptrLista ) {

struct nodoCliente *ptrNuevo = ptrLista -> siguiente;
ptrLista -> siguiente = ( struct nodoCliente * )malloc( sizeof( struct nodoCliente ) );
ptrLista -> siguiente -> cliente = nuevoCliente;
ptrLista -> siguiente -> siguiente = ptrNuevo;

}--------------------------------------------------------------------------------

Uso el IDE codeblocks y el compilador GCC, y cuando compilo me sale
el siguiente error:

error: invalid application of `sizeof' to incomplete type `nodoCliente'

pero si pongo el contenido del archivo "header.c" al final del archivo "main.c" y luego borro header.c el programa funciona perfectamente.

El programa tambien me funciona bien si coloco 2 veces la directiva #include "header.h" una al comienzo del archivo "main.c" y otra al inicio
del archivo "header.c" pero creo que no es la idea estar colocando la misma cabecera en todos los archivos.

 

Gracias


Título: Re: Problema con modularidad en programa en c
Publicado por: Ferno en 2 Marzo 2011, 23:22 pm
EDIT: Dije cualquier cosa, mis disculpas. Ahora reviso!

Bien, por lo que me he fijado, el error que marcas debe salir en el header.c. Pues el problema es simple, desde el header.c no tienes ninguna referencia hacia el struct NodoCliente. Este tipo de dato está definido en el header.h, entonces debes incluir una referencia. Esto es, debes incluir el "header.h" en el "header.c"

Más específicamente, en el header.c escribes
Código
  1. #include "header.h"

Cuéntame como te fue. Espero que hayas entendido.


Título: Re: Problema con modularidad en programa en c
Publicado por: dieg007 en 3 Marzo 2011, 00:31 am
Gracias por tu ayuda, efectivamente si coloco "header.h" en el archivo "header.c"
funciona perfecto, pero como la creacion de la lista la invoco desde el archivo
"main.c" tambien debo colocar "header.h" en el archivo "main.c", es decir debo
incluir "header.h" en 2 archivos distintos. En cambio cuando creo y utilizo otros modulos que no usan ningun tipo de struct definido por mi, solo basta con hacer una referencia en el archivo "main.c".

Existirá una forma alternativa de colocar la directiva "header.h" solo en el archivo "main.c" y no tener que colocarlo en todos los archivos que usan ese struct. ????

Nuevamente se agradece tu ayuda


Título: Re: Problema con modularidad en programa en c
Publicado por: Ferno en 3 Marzo 2011, 01:10 am
No veo cual es el problema de incluir el header.h en el main y en el .c respectivo :P

Y el tema es simple, si desde el main utilizas alguna función o tipo de dato definido en cualquiera de tus headers, debes incluirlo. Desconozco otro camino.