Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Incluir ficheros de cabecera en C

Estas en el tema de Incluir ficheros de cabecera en C en el foro de C/C++ en Foros del Web. Hola a todos, Estoy aprendiendo a programar en C con el IDE Dev C++. Estoy intentando importar un fichero de cabecera, llamado ordenacion.h, con las ...
  #1 (permalink)  
Antiguo 20/11/2017, 11:24
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Incluir ficheros de cabecera en C

Hola a todos,

Estoy aprendiendo a programar en C con el IDE Dev C++.

Estoy intentando importar un fichero de cabecera, llamado ordenacion.h, con las definiciones de funciones de ordenación de arrays, que tengo implementadas en el fichero ordenacion.c.

Me he creado un fichero con un main, y quiero usar estas funciones que tengo implementadas. Si incluyo el fichero ordenacion.c, todo funciona bien, pero si incluyo ordenacion.h, e intento llamar a una de las funciones implementadas, obtengo un error de compilación por que no reconoce el nombre de la función.

¿Qué está ocurriendo?

Gracias de antemano.

Saludos
  #2 (permalink)  
Antiguo 21/11/2017, 02:30
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Incluir ficheros de cabecera en C

Sería conveniente que posteases el código y los errores que te da. Ten en cuenta que no somos adivinos.

Saludos,
  #3 (permalink)  
Antiguo 22/11/2017, 11:06
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Incluir ficheros de cabecera en C

Hola,
Gracias por contestar.

La pregunta es genérica, no importa mucho el código, pero ahí va:

Código:
#include <stdio.h>
#include "ordenacion.c"
float media(int*,int);
int maximo(int*,int);
int minimo(int*,int);
float semisuma(int,int);
void main (void){
	
	int num_valores;
	int i,num;
	int array[10];
	printf ("Introduce el numero de valores con los que desea trabajar, menor o igual que 10\n");
	scanf("%d",&num_valores);
	
	for (i=0; i<num_valores; i++){
		
		printf ("Introduce el valor de la posicion %d\n", i);
		scanf ("%d",&num);
		array[i]=num;
	}
	int maximo_valor = maximo(array,num_valores);
	int minimo_valor = minimo(array,num_valores);
	float valor_semisuma = semisuma(maximo_valor,minimo_valor);
	
	printf ("La media de los valores introducidos es %.2f\n", media(array,num_valores));
	printf ("El máximo de los valores introducidos es %d\n", maximo_valor);
	printf ("El mínimo de los valores introducidos es %d\n", minimo_valor);
	printf ("El valor de la semisuma de los valores maximo y minimo es %.2f\n", valor_semisuma);
}

float media (int *array, int size){
	
	int suma=0;
	int i;
	for (i=0; i<size; i++){
		suma += array[i];
	}
	
	return (float)suma/(float)size;
}
int maximo (int *array, int size){
	metodo_insercion(array,size);
	
	return array[size-1];
}
int minimo (int *array, int size){
	metodo_burbuja(array,size);
	
	return array[0];
}
float semisuma (int maximo, int minimo){
	return ((float)maximo + (float)minimo)/2;
}
Los dos métodos señalados, están implementados en el fichero ordenacion.c, que incluyo arriba.
También tengo en el mismo directorio, un ordenacion.h, con el prototipo de las funciones implementadas en ordenación.c.
El código funciona bien tal cual lo he posteado. En cambio, si incluyo ordenación.h, en lugar de ordenación.c, tengo los siguientes errores:

Código:
C:\Users\marodal\AppData\Local\Temp\ccQjHnu6.o	Ejercicio3.c:(.text+0x1ab): undefined reference to `metodo_insercion'
C:\Users\marodal\AppData\Local\Temp\ccQjHnu6.o	Ejercicio3.c:(.text+0x1e4): undefined reference to `metodo_burbuja'
¿Alguna idea de cual es el problema?
Gracias
  #4 (permalink)  
Antiguo 23/11/2017, 03:25
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Incluir ficheros de cabecera en C

Esos errores no te los da el compilador, sino el linker (enlazador, es el que se encarga de 'conectar' las llamadas a función con las funciones en sí).

Cuando #incluyes "ordenacion.c", estás ya incluyendo el código de las funciones que has implementado en ese archivo, y el programa te funciona. Dado que lo haces al principio, no hay problemas, puesto que las funciones están implementadas antes de su empleo.

En cambio, cuando #incluyes "ordenacion.h", solamente incluyes los prototipos, pero NO LAS FUNCIONES EN SÍ. Por eso, el compilador no da errores (el código es correcto, al menos sintácticamente), pero el linker te da ese error, para decirte que no dispone de esas funciones.

La manera de hacerlo es:

- Tienes un archivo 'ordenacion.h', con los prototipos de funciones y estructuras de datos que tienes en 'ordenacion.c', que es donde implementas esas funciones.

- Tienes un archivo, llamémoslo 'mi_programa.c', que necesita de esas funciones que tienes en 'ordenacion.c'.

La manera de compilar el programa es:

Archivo 'ordenacion.c': Tienes que #incluir 'ordenacion.h'.
Archivo 'mi_programa.c': Tienes que #incluir 'ordenacion.h'.

Proyecto en Dev-C++: Tendrás que crear un proyecto y añadirle los archivos 'ordenacion.h', 'ordenacion.c' y 'mi_programa.c'. Al crear el ejecutable (con Make), ya se encarga de todo. (yo no he utilizado Dev-C++, pero todos los entornos de desarrollo funcionan de manera similar).

Compilar por línea de comando: Depende de cada compilador, probablemente será algo similar a
"compila mi_programa.c ordenacion.c mi_programa.exe"

Importante: Aunque no sea ilegal, NO DEBES incluir código fuente en un programa en la forma en que lo has hecho en el código que has posteado. No es ilegal, pero puede dar muchos problemas a la hora de utilizar algún depurador o, simplemente, volverse loco con los números de línea al reportar errores de compilación.

Saludos,
  #5 (permalink)  
Antiguo 23/11/2017, 13:03
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Incluir ficheros de cabecera en C

Hola,

Muchísimas gracias, perfectamente explicado.

Mi problema es que estaba intentando compilarlo en Dev C++ sin crear el proyecto, sino con los archivos fuentes por separado.

He creado el proyecto incluyendo los ficheros, y compila sin problemas.

Gracias y un saludo!

Etiquetas: cabecera, ficheros, incluir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:50.