Autor Tema: Lio con los archivos de cabecera.  (Leído 2299 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Lio con los archivos de cabecera.
« en: 17 de Octubre de 2007, 09:43:47 »
Hola, tengo un código en C18 bastante largo y me he decidido ha organizarlo un poquillo por librerías... el caso es que por ahora no consigo hacerlo pues me lio bastante en como crear los archivos de cabecera :?

Hasta ahora pensaba que bastaba con crear un archivo .c con el código de las funciones y poner un #include de un archivo de cabecera con las declaraciones de los prototipos de las funciones. El caso es que no me funciona. Hago algo así:

Código: [Seleccionar]
//archivo mi_funcion.c
#include "mi_funcion.h"
void mi_funcion(void){}

Código: [Seleccionar]
//archivo mi_funcion.h
void mi_funcion(void); //prototipo

Incluyo el .c en el proyecto y cuando compilo me da error en la linea del .h donde está el prototipo de la función. Si quito esta linea me compila bien, pero claro cuando llamo a la función desde main() al compilar me aparece el warning de: "falta prototipo de función".

Lo único que he conseguido es poner el prototipo de la funcion en un .h pero no enlazarlo(#include) con el archivo que tiene el cuerpo de la función sino incluirlo en el proyecto: entonces si que funciona bien.

El caso es que tengo incluidas otras librerias(de las que vienen con C18) en las que sí está hecho como yo lo intenté al principio, pero en cambio a mi no me funciona...

¿Alguien prodría explicarme la forma correcta? Estoy bastante liadillo...

Gracias de antemano
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Lio con los archivos de cabecera.
« Respuesta #1 en: 17 de Octubre de 2007, 10:30:16 »
no entiendo porque en el archivo principal (main) colocas el prototipo de las funciones del archivo de cabecera (*.h) , bueno yo lo hacia en el mismo aarchivo de cabecera y luego en el main solo invocaba a las funciones para su aplicacion. podrias derepente subir esos dos archivos el main o una parte de este (pues dices que es algo extenso) y el archivo de cabecera a ver si liga, ah te sale error en el mplab o solo ese warning? o simplemente no hace lo que has programado? saludos!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Lio con los archivos de cabecera.
« Respuesta #2 en: 17 de Octubre de 2007, 12:26:22 »
Hola, al final creo que lo solucioné. Lo hago como tu dices micro_cadaver(como lo intenté al principio) y ahora si q me funciona. Parece ser que cuando C18 compila si en los archivos .c tienes alguna función con un tipo de dato o una etiqueta que no reconoce porque se te olvidó definirla en el .h, en vez de darte el error en el cuerpo de la función(como pasa cuando la función está en el mismo archivo que el main()) te da el error en la linea donde tienes declarado el prototipo(archivo de cabecera .h) y no te explica nada más....

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Lio con los archivos de cabecera.
« Respuesta #3 en: 17 de Octubre de 2007, 14:36:29 »
Trato de aportar algo...Nomrmalmente es buen criterio de programacion colocar en un archivo "h" las funciones que un modulo exporta, solo esas, las funciones que son de uso interno solo deberian ser visibles al mismo modulo, estas deberian ser declaradas con static. Todo esto mantiene el concepto de modularidad de los programas. No conozco realmente el C18, pero es muy importante el concepto de prototipos porque hay compiladores que si no encuentran un prototipo asumen que la funcion es del tipo int Function( void ) y si la misma devuelve otra cosa que no sea int ahi se producen los problemas.
Con respecto a tu caso en particular suele suceder a veces que el error de compilacion que te muestra el mismo no tenga nada que ver con la linea donde esta realmente el error, a veces por el parser o a veces simplemente porque el compilador no es muy bueno que digamos, para estos caso sugiero, si es que es posible, listar unicamente la salida del preprocesador, normalmente corrre como aplicacion independiente, y analizando esto podes detectar mejor el error, me pasado con macros bastante complicadas encontrar bugs que de otra manera me resultaron imposibles.
Pero repito no conozco el C18 asi que no se si esto se puedo hacer.
Salu2!

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Lio con los archivos de cabecera.
« Respuesta #4 en: 17 de Octubre de 2007, 18:56:27 »
Encontré una cosa graciosa también: no se si alguien se dio cuenta¿?. Normalmente lo que hago es diseñar las funciones en el archivo fuente y despues copiar y pergar las definicones en el archivo de cabecera y añadir el punto y coma para dejar los prototipos. Pues bien, me di cuenta que cuando haces esto en C18: si dejas el puntero del ratón tal cual donde acabaste de pegar la definicion de la función y poner el punto y coma, si compilas(mi vesrión es 7.52) obtienes un error en el último de los prototipos de las funciones(archivo .h). Si tecleas intro y el puntero queda una linea más abajo, vuelves a compilar y el error desaparece...

...realmente este es un mundo desconcertante.... :D :D :D :D :D

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Lio con los archivos de cabecera.
« Respuesta #5 en: 22 de Octubre de 2007, 19:13:43 »
Tuve ese problemita hace tiempo y en los foros de Microchip dicen que todos los compiladores de microchip requieren una linea en blanco al final del codigo para poder compilar.