Ayuda porfavor! a function-definition is not allowed here

Iniciado por Lorena09, 15 Febrero 2021, 05:30 AM

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

Lorena09

Hola! La verdad me da un poco de pena preguntar, sé que es algo muy básico, pero apenas entré a la universidad y voy empzando.
Les voy a mostrar mi código, me muestra un error que dice "a function-definition is not allowed here '{'token"
ya comparé con los que nos entrego el profesor y he revisado algunos libros, pero no encuentro mi error, ojala alguien pueda ayudarme  :(

Código (cpp) [Seleccionar]

#include<iostream>
#include<stdio.h>
using namespace std;
main()
{
int result;
result=0;
int product(int a,int b)
{
for(i=1;i<=min(a,b);i++)
{
result=result+max(a,b);
}
}
cout<<product(5,5);
}




MOD: El código debe estar entre etiquetas de Código GeSHi

K-YreX

#1
Antes de nada, el código debe publicarse entre etiquetas de Código GeSHi para facilitar su lectura. Puedes seleccionar las etiquetas mediante el deplegable que dice "Código GeSHi", encima del cuadro de texto o escribiendo manualmente:
[code=cpp]
Aquí escribes tu código
[/code]


Todos tuvimos nuestros inicios y todos nos hemos hecho preguntas y hemos tenido problemas con cosas que luego se vuelven muy básicas.   :-X

El problema es que estás definiendo una función: product() dentro de otra función: main(). Existe la posibilidad de hacer esto de varias formas pero no es nada recomendable. Lo suyo es definir las funciones fuera de otras funciones.
Además hay 2 formas de hacerlo:
  • Implementar la función antes de utilizarla:
    Código (cpp) [Seleccionar]

    #include <iostream>
    using namespace std;

    void saludar() {
     cout << "Hola" << endl;
    }

    int main() {
     saludar(); // La salida sera: Hola
     return 0;
    }


  • Definir la función antes e implementarla después. Para programas muy pequeños parece innecesario pero para códigos grandes te evitará muchos dolores de cabeza (ya lo irás viendo):
    Código (cpp) [Seleccionar]

    #include <iostream>
    using namespace std;

    void saludar(); // Escribes la definicion de la funcion (valor de retorno, nombre de la funcion y parametros)

    int main() {
     saludar();
    }

    // Implementas la funcion que has definido antes
    void saludar() {
     cout << "Hola" << endl;
    }





    Además como un par de consejos más de inicio:
  • Está bien ir conociendo para qué sirve cada biblioteca (las cabeceras) y así usar sólo las necesarias. La cabecera <iostream> es la que contiene todo lo necesario para la entrada/salida estándar de C++ (cout, cin,...) mientras que <stdio.h> es la cabecera de entrada/salida propia de C (printf, scanf,...). Las funciones min() y max() que utilizas se encuentran concretamente en la cabecera <algorithm> aunque bajo mi punto de vista sería mejor que crearás tus propias funciones para mejorar tu lógica y ganar experiencia, sobre todo al principio.
  • Las cabeceras que terminan en '.h' son propias de C. Estas también funcionarán en C++ pero puedes usar su propia versión cuyo nombre es igual pero eliminando el '.h' del final y añadiendo una 'c' al principio. <stdio.h> (C) -> <cstdio> (C++)
  • Aunque se puede hacer, no se recomienda crear la función main() sin un tipo de retorno. Esta función en C++ (y en C también) devuelve un int. Por convención se suele devolver 0 si todo va bien y otro número (1, -1,...) si algo falla. Lo escribas o no, el compilador añadirá un 'return 0;' al final de la función main() siempre.

    Te dejo un par de enlaces bastante buenos para conocer funciones, saber qué cabeceras necesitas y cómo funcionan:
    http://www.cplusplus.com/
    https://en.cppreference.com/w/

    Es bastante información para ya irás aprendiendo poco a poco según vayas avanzando y practicando. En programación da igual cuánto estudies si no practicas. Suerte  :-X



    EDIT: Y ahora que me doy cuenta, tu función product() devuelve un int según lo has definido pero te falta añadir un 'return' al final. Te dará un error si no lo pones.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

#2
Código (cpp) [Seleccionar]
int result;
result=0;


Puedes definir el valor de result en la propia declaración:
int result = 0;

En la primera sentencia del bucle for, se te olvidó declarar el tipo de i:
for(int i = 0; bla bla bla

Puedes usar += para tu asignación a result dentro del bucle:
result+=max(a,b);

Como te comenta el compañero, tienes que hacer return del resultado de la funciones que declares con cualquier tipo que no sea void.

En tu función tendrías que retornar result trás el bucle for. En el código que compartes tienes result declarado antes de la función product, pero nunca lo usas fuera. Debe estár dentro de la función.

Código (cpp) [Seleccionar]
#include <iostream> // input(entrada) output(salida) stream(<< >>) cout es C salida, cin es C entrada

using namespace std; // te ahorra poner std::cout std::cin std::string std::getline ...

// Prototipo de funciones
int min(int, int);
int max(int a, int b); // aconsejable añadirle los nombres de los parametros que vas a usar abajo tambien aqui, para facilitar la comprension del codigo, a pesar de no ser estrictamente necesario.
int product(int, int);


// función principal
int main(int argc, char **argv) { /* deberías declarar así siempre la funcion principal del programa. El primer argumento contiene el número de datos enviados por consola en el caso de correr el programa desde la cmd de Windows o la terminal de Linux.
Por ejemplo en la cmd, miPrograma.exe 5 5
Los argumentos se encuentran en el segundo parametro si lo recorres utilizando argv como tamaño, puedes obtenerlos para utilizarlos en tu programa en lugar de usar cin. Así es como se progaman los comandos de windows y linux.
Te lo comento no porque tenga gran relevancia o sea algo que tengas que saber de memoria ahora mismo, si no para que no te suenen a chino cuando los veas en clase. */

 cout << "El resultado es: " << product(5, 5) << endl;
 cin.get(); // Se suele utilizar para pausar el programa y que no se cierre sin que te de tiempo a ver los resultados.
 return 0;
}



// declaracion de funciones. Al estar debajo de main, tienen que tener su prototipo definido antes de main.

// Se aconseja comentar el código para entenderlo mejor. Ej:
/* Retorna el entero menor de dos enteros */
int min(int num1, int num2) {
 if (num1 < num2) { /* si el primer parametro es menor que el segundo, entonces: */
   return num1; // retorna el primer parametro
 }
 return num2; // retorna el segundo. Una vez se retorna una función, se sale de ella, asique si se retorna num2 es porque no se complio la condicion anterior que retornaba num1
}

/* Esta funcion hace lo mismo que la anterior, pero retorna el mayor en lugar del menor */
int max(int a, int b) {
 if (a > b) {
   return a;
 } else { // En este caso da igual que se añada el else o no. Si en el if anterior hubiese un cout en lugar de un return, entonces si que sería importante el else. Debido a que no se retornaría a, se imprimiría, y sin el else la ejecucion continuaria retornando b despues de imprimir en pantalla a.
   return b;
 }
}


int product(int num1, int num2) {
 int res = 0;
 for(int i = 1; i <= min(num1, num2); ++i) {
   res += max(num1, num2);
 }
 return res;
}



Practica! Haz por ejemplo un programa que imprima en pantalla los números impares situados entre los 2 números que indique el usuario.
Otro al que le pidas al usuario su nombre y su apellido en minúsculas, y le pongas ambas iniciales en mayúsculas.
Un programa que te diga el número de letras y palabras que tiene una frase.
...

Vas practicando con las cosas más sencillas que se te ocurran y según vas mejorando, vas haciendo cosas cada vez más difíciles.

Para la programación te recomiendo 80% práctica y  20% teoría, y no al revés como solemos hacer muchos al inicio. Cada cosa que leas la tienes que usar 20 veces antes de leer la siguiente. Si no, se te acumulan una cantidad de conceptos en la cabeza que no puedes plasmar. Se te olvidan otras, mezclas varias...