Cosas que comentarte:
- Al pasarle los parámetros a la función "operación" , éstos tienen que tener el mismo nombre que el que has puesto en el prototipo dado que tu puedes pasarle cualquier variable del mismo tipo...Me refiero a esta línea:
operacion(n1, n2, oper, *resul, *error);
Donde:
-No están declaradas ni n1 ni n2 ni oper. Y resul no existe, es result.
- Al pasarle a la función un parámetro por referencia le tienes que pasar la dirección de memoria de la variable, con el operador &.Me refiero a la misma línea de antes quedando:
operacion(num1,num2,&result,&error);
Dado que el prototipo es un puntero y le tienes que pasar una dirección de memoria, como por ejemplo result que es donde se va a guardar el resultado.
-En la función fact, vuelves a llamar a la misma función pero esta se llama fact no factorial

return n1*factorial(n1-1);
El código lo he corregido así por encima:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//PROTOTIPS
void operacion(int n1, int n2, char oper, float *resul, int *error);
float fact(float n1);
//BLOC PRINCIPAL
int main()
{
char opcio;
int num1 = 0,num2 = 0,error;
float result = 0;
//Demanem 2 numeros a l'usuari
printf("Introdueix el primer numero:\n");
printf("Introdueix el segon numero:\n"); /*Limpio stdin (el buffer de entrada) porque a mí no me funciona...
*Las llaves son para marcar bloques,así la variable c no existirá despues de ese bloque.
*/
{
char c = 5;
while( (c != EOF) && c != '\n')
{
}
}
//Mostrem el menú
do
{
printf("* --> MULTIPLICAR\n");
//Usuari tria una opció
printf("Selecciona una opcio:\n");
//Cridem el procediment
operacion(num1, num2, opcio, &result, &error);
/* Esto tampoco me funciona a mí y tengo que poner dos getchar o limpiar el buffer de nuevo.*/
{
char c = 5;
while( (c != EOF) && c != '\n')
{
}
}
system("cls");// "clear" en linux... //Condició de sortida de while
}
while(opcio!='s');
return 0;
}
//PROCEDIMENT
void operacion(int n1, int n2, char oper, float *resul, int *error)
{
*error=1;
switch(oper)
{
case '+':
*resul=n1+n2;
break;
case '-':
*resul=n1-n2;
break;
case '*':
*resul=n1*n2;
break;
case '/':
if(n2==0)*error=-1;
else *resul=n1/n2;
break;
case '^':
break;
case '!':
if(n1==0 || n2==0)*error=-1;
else
printf("El factorial de n1 es: %lf\n",fact
(n1
)); break;
case 's':
break;
default:
printf("No has escollit una opcio correcta\n"); }
}
//FUNCIÓ
float fact(float n1)
{
if(n1==0 || n1==1)
return 1;
else
return n1*fact(n1-1);
}
Lo de limpiar el buffer no es algo que me guste, lo veo chapucero, pero bueno...
Creo que el problema es que sigues sin tener soltura con las funciones,y entonces si ya te meten punteros... Una función la declaras:
int miFuncion(int miParametro1,int miParametro2);
Y después al llamarla puedes pasarle la variable que quieras siempre respetando que sea un entero! Así por ejemplo:
valorDeRetorno = miFuncion(1,2);
O :
valorDeRetorno = miFuncion(num1,num2);
En el caso del paso de parámetros por referencia, lo que se le pasa es la dirección de la variable en vez de copiar su valor, un programa de ejemplo vale más que mi palabras:
#include <stdio.h>
/*
* Se copian los valores en direcciones de memoria distintas.
* @param[in] miParametro1 Valor de una variable.
* @param[in] miParametro2 Valor de otra variable.
* @return Multiplicación de miParámetro1 por miParametro2.
*/
int miFuncionNormal(int miParametro1,int miParametro2);
/*
* Se pasan las direcciones a esos valores.
* @param[in] miParametro1 Dirección de variable.
* @param[in] miParametro2 Dirección de otra variable.
* @return Multiplicación de miParámetro1 por miParametro2.
*/
int miFuncionPorReferencia (int * miParametro1,int * miParametro2);
/*
* Las variables de los parámetros asumen la dirección de la variables pasadas.
* @param[in] miParametro1 Variable.
* @param[in] miParametro2 Variable.
* @return Multiplicación de miParámetro1 por miParametro2.
*/
int miFuncionPorReferencia2(int &miParametro1,int &miParametro2);
int main(int argc, char *argv[])
{
int miNumero1 = 1;
int miNumero2 = 2;
printf("Direccion de memoria de miNumero1: \t 0x%X \t Valor: %d\n",&miNumero1
,miNumero1
); printf("Direccion de memoria de miNumero2: \t 0x%X \t Valor: %d\n",&miNumero2
,miNumero2
); /*
* Pasamos los valores.
*/
miFuncionNormal(miNumero1,miNumero2);
/*
* Pasamos las direcciones de memoria.
*/
miFuncionPorReferencia(&miNumero1,&miNumero2);
/*
* Pasamos las direcciones de memoria y se les hace el cast.
*/
miFuncionPorReferencia2(miNumero1,miNumero2);
return 0;
}
int miFuncionNormal(int miParametro1, int miParametro2)
{
printf("\n\nDireccion de memoria de miParametro1: 0x%X \t Valor: %d\n",&miParametro1
,miParametro1
); printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",&miParametro2
,miParametro2
); printf("Direcciones de memoria diferentes a las de miNumero, pero valores iguales.\n\n"); return miParametro1 * miParametro2;
}
int miFuncionPorReferencia (int * miParametro1,int * miParametro2)
{
printf("Direccion de memoria de miParametro1: 0x%X \t Valor: %d\n",miParametro1
,*miParametro1
); printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",miParametro2
,*miParametro2
); printf("Direcciones de memoria iguales a las de miNumero, accediendo a los mismos valores obviamente.\n\n"); /*
* Accediendo a los valores de las direcciones de memoria con el operador '*'.
*/
return *miParametro1 * *miParametro2;
}
int miFuncionPorReferencia2(int &miParametro1,int &miParametro2)
{
printf("\n\nDireccion de memoria de miParametro1: 0x%X \t Valor: %d\n",&miParametro1
,miParametro1
); printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",&miParametro2
,miParametro2
); printf("Direcciones de memoria diferentes a las de miNumero, pero valores iguales.\n\n"); return miParametro1 * miParametro2;
}
La función miFuncionPorReferencia2 no la tengo muy clara,se utilizarla pero no se explicarla resulta raro pero así es, a ver si alguno de aquí te lo puede explicar mejor.Ejecuta ese programa y mira detenidamente las salidas, te dejo mi salida por si no puedes o lo que sea:
Direccion de memoria de miNumero1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miNumero2: 0x1A9CBD3C Valor: 2
Direccion de memoria de miParametro1: 0x1A9CBD0C Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD08 Valor: 2
Direcciones de memoria diferentes a las de miNumero, pero valores iguales.
Direccion de memoria de miParametro1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD3C Valor: 2
Direcciones de memoria iguales a las de miNumero, accediendo a los mismos valores obviamente.
Direccion de memoria de miParametro1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD3C Valor: 2
Direcciones de memoria diferentes a las de miNumero, pero valores iguales.