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

[SOLUCIONADO] Problema con CodeBlocks C++

Estas en el tema de Problema con CodeBlocks C++ en el foro de C/C++ en Foros del Web. Muy buenos días, tardes, noches según la hora en la que lean. Paso a comentarles mi situación, estoy realizando un programa simple, el cual extraiga ...
  #1 (permalink)  
Antiguo 21/03/2016, 23:58
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años, 1 mes
Puntos: 0
Exclamación Problema con CodeBlocks C++

Muy buenos días, tardes, noches según la hora en la que lean. Paso a comentarles mi situación, estoy realizando un programa simple, el cual extraiga los promedios de ciertos alumnos, el profesor pidió que el programa esté dividido en un main.cpp y otro funcion.cpp donde contenga la resolución al problema de los "promedios". El tema es el siguiente, el programa sólo compilado en MAIN.cpp funciona a la perfección, ahora bien, no puedo compilar ambos .cpp porque me da un error de
Cita:
C:\Users\XXXXX\Desktop\Programacion PRUEBAS\Promedios\Promedio\funpromedio.cpp|5|multi ple definition of `funcpromedio(int, int, int, int)'| obj\Debug\funpromedio.o:C:\Users\XXXXX\Desktop\Pro gramacion PRUEBAS\Promedios\Promedio\funpromedio.cpp|5|first defined here|
||error: ld returned 1 exit status|
El código del main.cpp es el siguiente:
Cita:
#include <iostream>
#include "funpromedio.cpp"


int funcpromedio(int nota1, int nota2, int nota3, float promedio);

using namespace std;

int main()
{
int nota1;
int nota2;
int nota3;


cout<<"Ingrese la nota del primer trimestre"<< endl;
cin>> nota1;
cout<<"Ingrese la nota del segundo trimestre"<< endl;
cin>> nota2;
cout<<"Ingrese la nota del tercer trimestre"<< endl;
cin>> nota3;

return 0;
}
El código de la función "funpromedio.cpp":
Cita:
#include "funcpromedio.h"
#include <iostream>
using namespace std;
int funcpromedio(int nota1, int nota2, int nota3, float promedio)
{

if(nota1>5)
cout<<"Aprobado. 1er trimestre"<< endl;

else if(nota1==5||nota1==4)
cout<<"Regular, desaprobado, puede recuperar. 1er trimestre"<< endl;

else
cout<<"Aplazado. 1er trimestre"<< endl;

if(nota2>5)
cout<<"Aprobado. 2do trimestre"<< endl;

else if(nota2==5||nota2==4)
cout<<"Regular, desaprobado, puede recuperar. 2do trimestre"<< endl;

else
cout<<"Aplazado. 2do trimestre"<< endl;

if(nota3>5)
cout<<"Aprobado. 3er trimestre"<< endl;

else if(nota3==5||nota3==4)
cout<<"Regular, desaprobado, puede recuperar. 3er trimestre"<< endl;

else
cout<<"Aplazado. 3er trimestre"<< endl;

promedio= (nota1 + nota2 + nota3) / 3;

if(promedio>5)
cout<<"Alumno aprobado"<<endl;
else
cout<<"Alumno desaprobado"<<endl;
return 0;

}
El del header, que es más que obvio, pero por si las dudas lo pongo:
Cita:

int funcpromedio(int nota1, int nota2, int nota3, float promedio);

Si me pueden dar una mano, les agradecería. Muchas gracias gente.
  #2 (permalink)  
Antiguo 22/03/2016, 01:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problema con CodeBlocks C++

Buenas (Si hablas por un medio en el que el tiempo es algo relativo es mejor dar un saludo atemporal).

Cuando dices que la cabecera es obvia cometes un par de errores:
  • Asumes que la cabecera es obvia
  • Das por hecho que es sencilla y que está bien hecha.
En C++ no hay cosas obvias y eso es algo que irás aprendiendo.

Un problema con tu cabecera es que no tiene guardas.

¿En qué afecta eso a tu problema? Si miramos el error:

Cita:
multiple definition of `funcpromedio(int, int, int, int)'
Es decir, el programa está encontrando múltiples definiciones de la función... las guardas sirven precisamente para corregir ese problema.

El programa te da ese error porque al no tener guarda la cabecera ésta puede ser cargada varias veces desde distintas fuentes y eso puede confundir al compilador.

La guarda más conocida (por ser más estándar) es esta, aunque imagino que te sonará:

Código C++:
Ver original
  1. #ifdef ALGO
  2. #define ALGO
  3.  
  4. // Contenido de la cabecera
  5.  
  6. #endif

Luego hay otra guarda que es

Código C++:
Ver original
  1. #pragma once
  2.  
  3. // Contenido de la cabecera

Pero en este caso, al no ser parte del estándar, puedes encontrarte con algun compilador que no la soporte.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 22/03/2016, 08:25
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Problema con CodeBlocks C++

Cita:
Iniciado por eferion Ver Mensaje
Buenas (Si hablas por un medio en el que el tiempo es algo relativo es mejor dar un saludo atemporal).

Cuando dices que la cabecera es obvia cometes un par de errores:
  • Asumes que la cabecera es obvia
  • Das por hecho que es sencilla y que está bien hecha.
En C++ no hay cosas obvias y eso es algo que irás aprendiendo.

Un problema con tu cabecera es que no tiene guardas.

¿En qué afecta eso a tu problema? Si miramos el error:


Es decir, el programa está encontrando múltiples definiciones de la función... las guardas sirven precisamente para corregir ese problema.

El programa te da ese error porque al no tener guarda la cabecera ésta puede ser cargada varias veces desde distintas fuentes y eso puede confundir al compilador.

La guarda más conocida (por ser más estándar) es esta, aunque imagino que te sonará:

Código C++:
Ver original
  1. #ifdef ALGO
  2. #define ALGO
  3.  
  4. // Contenido de la cabecera
  5.  
  6. #endif

Luego hay otra guarda que es

Código C++:
Ver original
  1. #pragma once
  2.  
  3. // Contenido de la cabecera

Pero en este caso, al no ser parte del estándar, puedes encontrarte con algun compilador que no la soporte.

Un saludo.
Muchísimas gracias por los consejos eferion, tanto por el gramático como por los de C++, la verdad es que soy relativamente nuevo en el tema. Respecto al problema; Cuando lo hago en linux, con el IDE Geany, no establezco las guardas y aún así el resultado es el mismo, ¿Problema? El profesor exige que sea en CodeBlocks o en su defecto VS 2015.
Al poner las guardas, de la siguiente manera:
Cita:
#ifndef FUNCPROMEDIO_H_INCLUDED
#define FUNCPROMEDIO_H_INCLUDED

int funcpromedio(int nota1, int nota2, int nota3, float promedio, float division);

#endif // FUNCPROMEDIO_H_INCLUDED
Me sigue dando el mismo error a la hora de compilar, la verdad que es un programa sencillo, pero a la hora de compilar, es un problema, y no logró entender cuál. Gracias por tu respuesta. Tenga usted una buena jornada.
  #4 (permalink)  
Antiguo 22/03/2016, 08:57
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problema con CodeBlocks C++

Código C++:
Ver original
  1. #include <iostream>
  2. #include "funpromedio.cpp"
  3.  
  4.  
  5. int funcpromedio(int nota1, int nota2, int nota3, float promedio);
  6.  
  7. using namespace std;
  8.  
  9. int main()

Para que nos orientemos, es parte de tu fichero main.cpp.

Si resulta que tienes un funpromedio.h que incluye una declaración de funcpromedio... ¿Por qué no usas dicha cabecera en main.cpp? Es una mala práctica incluir ficheros de código y su uso debería vigilarse ya que los resultados pueden no ser buenos como ahora entenderás.

Esto es lo que esperaría encontrarse cualquier programador de C++.

Código C++:
Ver original
  1. #include <iostream>
  2. #include "funpromedio.h"
  3.  
  4.  using namespace std;
  5.  
  6. int main()

¿Cual es el problema? Básicamente que al incluir funpromedio.cpp estabas incluyendo también funpromedio.h (sí, ese include en funpromedio.cpp), y recordemos que funpromedio.h tiene una declaración de la función funcpromedio. Y después de tanto include añades una segunda declaración de la función funcpromedio(la que tienes en tu versión del main.cpp). ¿Resultado? El compilador encuentra dos declaraciones de la misma función y eso no le mola.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 22/03/2016, 10:06
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Problema con CodeBlocks C++

Muchas gracias por tu tiempo. El resultado sigue siendo el mismo, es decir, incluí el header de funpromedio.h quitando la declaración del main.cpp de funcpromedio, sigo incluyendo a "funpromedio.cpp" debido a que si no lo incluyo, ¿De dónde sacaré la función para resolver el problema? Me vengo partiendo la cabeza con un problema tan simple desde ayer, reitero, muchas gracias por tu tiempo y dedicación. Un saludo
  #6 (permalink)  
Antiguo 22/03/2016, 10:31
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problema con CodeBlocks C++

Cita:
Iniciado por alanjo Ver Mensaje
sigo incluyendo a "funpromedio.cpp" debido a que si no lo incluyo, ¿De dónde sacaré la función para resolver el problema?
Generar un programa a partir de código fuente, en C++, es un proceso que se genera en dos pasos.

En primer lugar actúa el compilador. Este programita coge tus ficheros de código uno a uno y genera lo que se denomina código objeto. El código objeto es una suerte de código compilado a medias ya que aun falta información, como el tamaño de los saltos. El compilador lo más que necesita es la declaración de funciones y tipos para poder preparar correctamente el código.

Una vez que el compilador ha hecho su trabajo pasa a actuar el linker. Este otro programita coge todos los ficheros de código objeto y los une en un ejecutable o librería. Como en este proceso ya se tiene toda la información se pueden calcular correctamente el valor de los saltos y otros ajustes finales.

Como ves, el compilador procesa unidades individuales de código y es tarea del linker coser dichas unidades para formar un código ejecutable.

Por cierto, normalmente compilador y linker vienen juntos en un único ejecutable. Se elige una u otra opción por línea de comandos.

Dicho con código. Para compilar tu programa se podrían lanzar las siguientes instrucciones
Código BASH:
Ver original
  1. gcc -c funpromedio.cpp
  2. gcc -c main.cpp

Como ves cada fichero de código se compila por separado.

Una vez compilado todo el código se pasa el linker

Código BASH:
Ver original
  1. gcc -o programa.exe main.o funpromedio.o

Y fíjate que ahora sí se van a procesar los dos ficheros.

Moraleja: No necesitas incluir funpromedio.cpp en main.cpp. En el proceso de linkado se fusionarán el código de ambos ficheros y el programa funcionará correctamente.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 22/03/2016, 19:27
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Problema con CodeBlocks C++

Muchas gracias por tu orientación, ahora funciona perfectamente. Sinceramente, gracias. Marco el tema como solucionado.

Etiquetas: funcion, int, programa
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 03:32.