1

tengo que realizar una calculadora para la facultad, el problema que tengo es el siguiente.. Si la hago toda en main, me funciona bien. El problema es que el trabajo me pide que separe las funciones en una biblioteca aparte,y cuando hago eso me tirar errores por todos lados que no se donde mirar, no lo entiendo sinceramente.

Mi main es el siguiente

#include <stdio.h>
#include <stdlib.h>
#include "trabajopractico01.h"
int main()
{
    calculadora();

    return 0;
}

Los prototipos de funcion:

int calculadora();
int ingresoOperandos(float *primerOperando, float *segundoOperando);
int menuOpciones(float primerNumero,float segundoNumero,int *opcionElegida);
int opcionElegidaMenu(float primerNumero, float segundoNumero,int eleccion);
int suma(float primerNumero, float segundoNumero);
int resta(float primerNumero, float segundoNumero);
int multiplicacion(float primerNumero, float segundoNumero);
int division(float primerNumero, float segundoNumero);

Y el resto del codigo es:

int calculadora()
{
    float primerNumero;
    float segundoNumero;
    int opcionElegida;
    ingresoOperandos(&primerNumero, &segundoNumero);
    menuOpciones(primerNumero, segundoNumero, &opcionElegida);
    opcionElegidaMenu(primerNumero,segundoNumero,opcionElegida);

    return 0;
}
int ingresoOperandos(float *primerOperando, float *segundoOperando)
{
    float primerNumero;
    float segundoNumero;
    printf("Ingrese el primer numero: ");
    scanf("%f", &primerNumero);
    printf("Ingrese el segundo numero: ");
    scanf("%f", &segundoNumero);
    *primerOperando=primerNumero;
    *segundoOperando=segundoNumero;
    return 0;

}
int menuOpciones(float primerNumero,float segundoNumero,int *opcionElegida)
{
    int opcionAElegir;

    printf("\n Elija la operacion a realizar");
    printf("\n1. Sumar (%.2f + %.2f)", primerNumero, segundoNumero);
    printf("\n2. Restar(%.2f - %.2f)", primerNumero, segundoNumero);
    printf("\n3. Multiplicar(%.2f * %.2f)", primerNumero, segundoNumero);
    printf("\n4. Dividir(%.2f / %.2f)", primerNumero, segundoNumero);
    printf("\n5. Factorial");
    printf("\n6. Hacer todas las operaciones");
    printf("\n7. Salir");
    printf("\nDigite su opcion: ");

    scanf("%d" , &opcionAElegir);
    *opcionElegida=opcionAElegir;
    return 0;
}
int opcionElegidaMenu(float primerNumero, float segundoNumero, int eleccion)
{

    switch(eleccion)
    {
    case 1:
        suma(primerNumero, segundoNumero);
        break;
    case 2:
        resta(primerNumero, segundoNumero);
        break;
    case 3:
        multiplicacion(primerNumero, segundoNumero);
        break;
    case 4:
        division(primerNumero,segundoNumero);
        break;
    case 6:
        suma(primerNumero, segundoNumero);
        resta(primerNumero, segundoNumero);
        multiplicacion(primerNumero, segundoNumero);
        division(primerNumero, segundoNumero);
        break;
    case 7:
        break;
    }
return 0;
}
int suma(float primerNumero, float segundoNumero)
{

    float resultado;
    resultado=primerNumero+segundoNumero;
    printf("la suma es: %.2f", resultado);
    return 0;
}
int resta(float primerNumero, float segundoNumero)
{
    float resultado;
    resultado=primerNumero-segundoNumero;
    printf("\nla resta es: %.2f", resultado);
    return 0;
}
int multiplicacion(float primerNumero, float segundoNumero)
{
    float resultado;
    resultado=primerNumero*segundoNumero;
    printf("\nla multiplicacion es: %.2f", resultado);
    return 0;
}
int division(float primerNumero, float segundoNumero)
{
    float resultado;
    resultado=primerNumero/segundoNumero;
    printf("\nla division es: %.2f", resultado);
    return 0;
}

Y me tira estos errores:

||=== Build: Debug in Calculadora (compiler: GNU GCC Compiler) ===|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'calculadora':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|6|warning: implicit declaration of function 'ingresoOperandos' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|7|warning: implicit declaration of function 'menuOpciones' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|8|warning: implicit declaration of function 'opcionElegidaMenu' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'ingresoOperandos':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|16|warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|16|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|17|warning: implicit declaration of function 'scanf' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|17|warning: incompatible implicit declaration of built-in function 'scanf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|25|error: conflicting types for 'menuOpciones'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|26|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|7|note: previous implicit declaration of 'menuOpciones' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'menuOpciones':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|29|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|39|warning: incompatible implicit declaration of built-in function 'scanf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|43|error: conflicting types for 'opcionElegidaMenu'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|44|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|8|note: previous implicit declaration of 'opcionElegidaMenu' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'opcionElegidaMenu':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|49|warning: implicit declaration of function 'suma' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|52|warning: implicit declaration of function 'resta' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|55|warning: implicit declaration of function 'multiplicacion' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|58|warning: implicit declaration of function 'division' [-Wimplicit-function-declaration]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|71|error: conflicting types for 'suma'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|72|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|49|note: previous implicit declaration of 'suma' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'suma':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|76|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|79|error: conflicting types for 'resta'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|80|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|52|note: previous implicit declaration of 'resta' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'resta':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|83|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|86|error: conflicting types for 'multiplicacion'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|87|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|55|note: previous implicit declaration of 'multiplicacion' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'multiplicacion':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|90|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|93|error: conflicting types for 'division'|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|94|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|58|note: previous implicit declaration of 'division' was here|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c||In function 'division':|
C:\Users\Sergio\Desktop\Calculadora\trabajopractico01.c|97|warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]|
||=== Build failed: 6 error(s), 17 warning(s) (0 minute(s), 0 second(s)) ===|


Lo que yo no entiendo es porque si pongo todo en una misma pagina me lo compila y funciona bien y sino no.. Desde ya gracias, intente explicar lo mejor que pude.

elgordo87
  • 61
  • 3

1 Answers1

0

Durante la compilación, todas las unidades de traducción se compilan independientemente unas de otras. Esto implica que todas han de ser autónomas y perfectamente válidas por si mismas.

Cuando tu intentas compilar tu código, generas 2 llamadas al compilador:

compilador trabajopractico01.c
compilador main.c

El problema es que compilador trabajopractico01.c no es autónomo por si mismo: desde ahí, estás usando funciones externas: printf( ), scanf( ), ...

Además, también estas usando llamadas a funciones internas (implementadas en el mismo archivo trabajopractico01.c.

Todos los errores son relativos al mismo problema: estás usando llamadas a funciones sin declararlas primero. Dentro de un mismo archivo .c, aunque el código se encuentre ahí, el prototipo ha de conocerse antes del primer uso (de la primera llamada a dicha función).

Afortunadamente, la solución es bastante sencilla: en tu trabajopractico01.c, añade los #include que necesitas:

#include <stdio.h>
#include <stdlib.h>
#include "trabajopractico01.h"

int calculadora( ) {
  ...
}

int ingresoOperandos( float *primerOperando, float *segundoOperando ) {
  ...
}

...

Ahora ya si, tu archivo es autónomo por si mismo: durante su compilación, todo aquello a lo que se hace referencia en él es conocido por anterioridad por el compilador, y el proceso se desarrolla correctamente.

Lo que yo no entiendo es porque si pongo todo en una misma pagina me lo compila y funciona bien y sino no...

Espero que lo tengas claro ya: si lo colocas todo en un mismo archivo, todos los #include están disponibles desde el principio, por lo que llegas al mismo resultado: el compilador conoce con anterioridad a su uso todas las funciones que vas a usar.

Nota: puedes echarle un ojo a Símbolo externo sin resolver ¿ Qué he hecho mal ? para mas detalles sobre el proceso.

Trauma
  • 25,297
  • 4
  • 37
  • 60