Problema con funcion sin tipo en C

Iniciado por the_jocker, 29 Junio 2012, 14:47 PM

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

the_jocker

Buenas, resulta de que uso linux mejor dicho ubuntu, tengo que hacer un practico de programación en c, todos usan dev-c++ pero yo nano y gcc para compilar, muestro el codigo para poder decir cual es el error:


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

void opera(int n1, int m1, float &raiz1, int &potencia1);

main()
{
        int n,m,potencia;
        float raiz;
        printf("Ingresar un valor para n: ");
        scanf("%d",&n);
        printf("\nIngrese un valor para m: ");
        scanf("%d",&m);
        opera(n,m,raiz,potencia);
        printf("\nLa raiz de n es: %.2f",raiz);
        printf("\nLa potencia de n elevado a la m es: %d\n",potencia);
        return 0;
}
void opera(int n1, int m1, int &raiz1, float &potencia1)
{
        raiz1 = 0;
        potencia1 = 0;
        raiz1 = sqrt(n1);
        potencia1 = pow(n1,m1);
}



El error que me da gcc es que se esperaba ';' o ',' before '&' .
No entiendo ya que asi como esta en dev-c++ lo toma, compila bien. Yo pense que podia ser porque talvez tiene demasiados argumentos la funcion pero no creo, desde ya gracias por su ayuda.

avesudra

#1
La verdad no llego a comprender que quiere decir  el ampersand delante de la raiz1 , o potencia1 , se supone que éstos deberían ser punteros , apuntando a una dirección de memoria, yo tengo como IDE Codeblocks 10.05 y como compilador gcc , ahí tienes el código , a mí me funciona.
#include <stdio.h>
#include <stdlib.h>
#include <math.h> //Te faltaba este header para la funcion pow y sqrt

void opera(int n1, int m1, float *raiz1, int *potencia1); // He cambiado los ampersands por * , son variables puntero...

int main()
{
        int n,m,potencia;
        float raiz;
        printf("Ingresar un valor para n: ");
        scanf("%d",&n);
        printf("\nIngrese un valor para m: ");
        scanf("%d",&m);
        opera(n,m,&raiz,&potencia); //Le paso la direccion de memoria de las variables raiz y potencia, y las reciben las variables puntero de la función.
        printf("\nLa raiz de n es: %.2f",raiz);
        printf("\nLa potencia de n elevado a la m es: %d\n",potencia);
        return 0;
}
void opera(int n1, int m1, float *raiz1, int *potencia1)
{
        *raiz1 = 0;         //Utilizo el operador de desreferencia para asignar los valores a la dirección de memoria del puntero.
        *potencia1 = 0;
        *raiz1 = sqrt(n1);
        *potencia1 = pow(n1,m1);
}

Una función en C puede tomar muchísimos argumentos por eso no era, pero la verdad el ampersand se que es para extraer el valor de memoria de la variable pero es que esa variable no apunta a nada! O eso creo que me abran los ojos si no lo veo...
¡Un saludo!
Regístrate en

the_jocker

Gracias por responder amigo, resulta que en el prototipo de la función opera los & pasan valores por referencia, eso es lo que me dijeron en la escuela, por eso lo declaro en el prototipo de la función y en la declaración, y también la modifico con el 1 al final, para diferenciarla, osea &raiz1 pasa el valor a raiz y &potencia1 pasa el valor a potencia, igual como vos me lo planteas me da conflicto en la llamada a la función, es decir se soluciona con los apuntadores pero ahora en la llamada me dice "tipos en conflicto para opera", "la declaración de opera estaba aquí".

avesudra

#3
Bueno te creo porque yo todavia no he llegado a la facultad y tu si, faltan unos añitos aún  :( , pues no sé la verdad , lo único que te puedo decir es que pruebes a bajarte codeblocks , no tienes que configurar nada incluso el solo te autodetecta el gcc ...

PD: Si sí es así como dices // Nunca me gustó el terminal es muy cutre , prefiero valorar las herramientas que desarrollan otros con todo su interés y paciencia, además  si hay algo mas fácil¿porque no utilizarlo? y gratis!!, si lo que quieres es cojer experiencia con la consola , con ubuntu ya lo haces , no solo compilando :)
Regístrate en

do-while

¡Buenas!

Si estas trabajando con C no puedes utilizar & para realizar llamadas por referencia. En C no existen las referencias propiamente dichas, eso es cosa de C++. Tendras que utilizar punteros para simular referencias. Por lo tanto, tanto en el prototipo como en la definicion de la funcion, tendras que utilizar punteros en la lista de parametros, y en la llamada a la funcion tendras que pasar la direccion de la variable (&).

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

avesudra

En el código que le he puesto yo le sigue dando errores do-while , pero por lo visto el error que le da es el típico "tipos en conflicto para opera", "la declaración de opera estaba aquí".Como si hubiese definido antes la función.
Regístrate en

the_jocker

Gracias por responder, lo del editor nose, me gusta la pantalla negra, es todo, nano es mi amigo, pero volviendo al problema entiendo lo que me dicen con lo del los apuntadores, ahora todos en la facultad lo hacen con el dev-c++, y les funciona como yo lo tenia, posteo lo que tengo y les muestro el error:

#include <stdio.h>
#include <math.h>

void opera(int n1, int m1, float *raiz1, int *potencia1);

main()
{
        int n,m,potencia;
        float raiz;
        printf("Ingresar un valor para n: ");
        scanf("%d",&n);
        printf("\nIngrese un valor para m: ");
        scanf("%d",&m);
        opera(n,m,&raiz,&potencia);
        printf("\nLa raiz de n es: %.2f",raiz);
        printf("\nLa potencia de n elevado a la m es: %d\n",potencia);
}
void opera(int n1, int m1, float *raiz1, int *potencia1)
{
        *raiz1 = 0;
        *potencia1 = 0;
        *raiz1 = sqrt(n1);
        *potencia1 = pow(n1,m1);
}



Este es lo que me sale


/tmp/cc4qmQWd.o: In function `opera':
ejemplo.c:(.text+0xee): undefined reference to `sqrt'
ejemplo.c:(.text+0x10d): undefined reference to `pow'
collect2: ld devolvió el estado de salida 1

avesudra

#7
Claro! A todo el mundo le pueden gustar cosas diferentes  :) , y ¿donde está el error que me dijiste antes the_jocker? el de "tipos en conflicto para opera", "la declaración de opera estaba aquí". Igual es porque tenian un archivo de c++ .cpp en vez de uno de .c  , recuerda que desde c++ se pueden utilizar las librerías de c ... Yo he intentado compilarlo con la consola también y me ha dado los mismos errores que a tí , asi que ya ni idea.

¡Un saludo!

EDITADO : Ya he encontrado la solución , el problema es al linkear , tienes que hacer gcc -Wall xxx.c /usr/lib/....../libm.a -o xxx tienes que encontrar el libm.a y poner su dirección completa en mi Ubuntu 11.10 está en /usr/lib/x86_64-linux-gnu/libm.a
Regístrate en

the_jocker

avesudra, genial lo tuyo, yo ni me había percatado de la extensión del archivo, claro, los archivos son cpp, asi compilan perfecto sin ningun problema, pero aqui como es c puro no lo agarra ni en pedo, es decir que el error sigue, me dice que no esta definida sqrt ni pow, pero ahora me di cuenta recian gracias.

avesudra

Regístrate en