Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: the_jocker en 29 Junio 2012, 14:47 pm



Título: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 14:47 pm
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:

Código:
#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.


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 16:14 pm
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.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h> //Te faltaba este header para la funcion pow y sqrt
  4.  
  5. void opera(int n1, int m1, float *raiz1, int *potencia1); // He cambiado los ampersands por * , son variables puntero...
  6.  
  7. int main()
  8. {
  9.        int n,m,potencia;
  10.        float raiz;
  11.        printf("Ingresar un valor para n: ");
  12.        scanf("%d",&n);
  13.        printf("\nIngrese un valor para m: ");
  14.        scanf("%d",&m);
  15.        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&#243;n.
  16.        printf("\nLa raiz de n es: %.2f",raiz);
  17.        printf("\nLa potencia de n elevado a la m es: %d\n",potencia);
  18.        return 0;
  19. }
  20. void opera(int n1, int m1, float *raiz1, int *potencia1)
  21. {
  22.        *raiz1 = 0;         //Utilizo el operador de desreferencia para asignar los valores a la direcci&#243;n de memoria del puntero.
  23.        *potencia1 = 0;
  24.        *raiz1 = sqrt(n1);
  25.        *potencia1 = pow(n1,m1);
  26. }
  27.  
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!


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 16:48 pm
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í".


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 17:39 pm
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 :)


Título: Re: Problema con funcion sin tipo en C
Publicado por: do-while en 29 Junio 2012, 17:57 pm
¡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!


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 18:03 pm
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.


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 18:13 pm
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:
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. void opera(int n1, int m1, float *raiz1, int *potencia1);
  5.  
  6. main()
  7. {
  8.        int n,m,potencia;
  9.        float raiz;
  10.        printf("Ingresar un valor para n: ");
  11.        scanf("%d",&n);
  12.        printf("\nIngrese un valor para m: ");
  13.        scanf("%d",&m);
  14.        opera(n,m,&raiz,&potencia);
  15.        printf("\nLa raiz de n es: %.2f",raiz);
  16.        printf("\nLa potencia de n elevado a la m es: %d\n",potencia);
  17. }
  18. void opera(int n1, int m1, float *raiz1, int *potencia1)
  19. {
  20.        *raiz1 = 0;
  21.        *potencia1 = 0;
  22.        *raiz1 = sqrt(n1);
  23.        *potencia1 = pow(n1,m1);
  24. }
  25.  
  26.  

Este es lo que me sale

Código:
/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


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 18:23 pm
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
Código:
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


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 18:32 pm
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.


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 18:37 pm
¿Te compila ya entonces? ;D


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 18:42 pm
Si lo compile con g++ y no me chisto nada, pero voy a probar lo que decis, cualquier cosa lo posteo, gracias por tu ayuda hermano.


Título: Re: Problema con funcion sin tipo en C
Publicado por: do-while en 29 Junio 2012, 18:44 pm
¡Buenas!

Lo que no entiendo es como no te reconoce las funciones de math.h si has hecho el include... En principio no tendrias porque tener ningun problema...

¡Saludos!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

PD: Leyendo por ahi, he encontrado que a gcc hay que especificarle donde estan las funciones de math.h... Como en la solucion que has dado. XD


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 18:50 pm
the_jocker pero se supone que estas trabajando en c! deberias compilarlo con gcc no por nada sino porque se supone que el ejecercicio es en c ¿no?
do-while las funciones de math.h , más o menos , digamos que si , hay que indicarle donde están los archivos que debe linkear(donde están las funciones de esa libreria). Eso lo hacen por defecto los IDE's supongo por eso al compilar codeblocks no dice nada y supongo que con otros tampoco , sin embargo ahí estás trabajando directamente con el compilador.


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 18:55 pm
Es correcto lo que decis, es que en la facultad donde estoy son muy wondows-dependientes, entonces tengo que preogramar en dev-c++ y usar programas asi, entonces los archivos que se crean son cpp, los compila el dev-c++ y los ejecuta, es obvio que aqui en linux todo lo que se me permite en dev no me lo permite el gcc, aún asi no me quedo con esta solución, voy a entregar el trabajo asi como ellos me lo piden pero por mi cuenta quiero saber por que no me sale. Pero igual tenés razón. Gracias.


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 19:02 pm
Como en casi todos lados... A ver Dev-Cpp es un compilador de C/C++ no únicamente de C++ entonces puede crear tanto archivos de c (.c) como de c++ (.cpp) , ahora bien , no te funcionaba el primer código por lo que había dicho do-while , porque en C no se puede usar & para realizar llamadas por referencia eso es exclusivo de C++. Entonces al compilarlo con gcc (compilador de C) pues claro dice ¿eing? ¿esto que es? y dá error,y por tanto al compilar el código de tu primer post con g++ debería salirte bien.


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 19:13 pm
Es cierto, por ahí soy medio gil para explicarme, el dev-c++ el archivo .c como lo dejamos al final funcion, es decir con los apuntadore, compila bien, y de la otra forma con el archivo cambiado con los & y .cpp tambien me lo toma bien, en la consola me da problemas con la libreria math.h porque el error me lo marca en sqrt y pow, nose porque, no me animo a opinar ya que nose si vienen activado por defecto o no. Gracias.


Título: Re: Problema con funcion sin tipo en C
Publicado por: do-while en 29 Junio 2012, 19:22 pm
¡Buenas!

Si prefieres no trabajar directamente con gcc, puedes instalarte codeblocks:

sudo apt-get install codeblocks (creo)

Asi tienes un ide y ya no tienes porque preocuparte de enlazar las librerias a mano.

¡Saludos!


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 19:27 pm
Ese problema también me salía a mí y lo puse en un post anterior que edité pero te lo pongo aquí también que me parece que no lo has visto, tienes que compilar usando esto , las primeras xxx son las de tu archivo en c y las ultimas las de el ejecutable de salida, el problema era que claro incluimos math.h que es donde están los prototipos de la funcion pero no linkeamos a donde están explicadas :
Código:
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
PD: Si al fin y al cabo vas a trabajar usando un IDE yo uso codeblocks y por lo que se vé do-while también , mi opinión perosonal es que es un buen editor...


Título: Re: Problema con funcion sin tipo en C
Publicado por: durasno en 29 Junio 2012, 19:33 pm
Hola! creo q no es necesario la ruta completa, yo lo hago asi:

gcc archivo.c -o archivo -lm

con solo agregar -lm me toma la libreria math.h



Con respecto a lo de & en la funcion o no ya te lo explicaron bien, pero lo que no me quedo claro es si te estan enseñado C o C++???


Saludos


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 19:42 pm
Voy a probar durasno y ahora te digo, es lo que he leido en internet en ingles de como solucionar el error, yo todavia no me he enterado tampoco , pero por lo que se vé supongo que C++ por lo de los valores por referencia.

EDITADO: Si durasno compila perfectamente , entonces quedaria como
Código:
gcc xxx.c -Wall -lm -o xxx


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 19:50 pm
Muchas gracias a todos por las respuestas, en realidad el problema lo solucione invocando manualmente las cabeceras, como math.h y lo hice gcc xxx.c -o xxx.exe -lm y anduvo de maravilla martinez, entonces a la otra pregunta si estoy aprendiendo C, pero creo que la razón por la cual se les paso a todos es que el dev guardan los  archivos .cpp entonces compilan y no hay ningún problema, si le cambias la extensión ahí se ven los errores, como yo edito con nano y compilo con gcc me saltaron como leche hervida, gracias por las respuestas.


Título: Re: Problema con funcion sin tipo en C
Publicado por: farresito en 29 Junio 2012, 19:51 pm
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 :)
Que es muy cutre la terminal? Sera cutre, pero es infinitamente mas potente una terminal que una GUI. Las aplicaciones de terminal tambien son desarrolladas con interes y paciencia, no solo las GUI. Y creeme, es mucho mas sencillo NANO que cualquier de los IDEs de ahi fuera. Control O para guardar, Control X para salir. Eso si, tienes que debuggear con gdb, que no es tan vistoso inicialmente como algunas GUIs...

Y sobre eso de que te autodetecta el GCC, es sencillo. Codeblocks lleva incorporado lo que se llama 'pseudoterminal'. Mediante pipes (supongo), codeblocks manda 'gcc nombredelarchivo.c' (y otros argumentos) a la terminal y esta le devuelve el resultado. Si hay errores, te los muestra, y si no, pues de maravilla.

Eso si, Codeblocks debo reconocer es un magnifico IDE. Me gusta mas VIM, pero en su momento lo use y me fue bastante bien.


Título: Re: Problema con funcion sin tipo en C
Publicado por: avesudra en 29 Junio 2012, 19:59 pm
Lo sé farresito , pero me parece muchísimo mas sencillo manejar un IDE , ya se que son desarrolladas con interés y paciencia yo mismo aunque haga aplicaciones que a nadie le sirve, me es más sencillo hacerlas en terminal . No sé ni lo que es pseudoterminal ni pipes. Bueno y perdona por si te ha dolido eso que he dicho no iba a mala inteción, ¿VIM? , la primera vez que lo escucho lo buscaré.

¡Un saludo!

PD: Pero bueno gustos hay muchos comprendo que te haya podido doler eso lo siento de verdad.


Título: Re: Problema con funcion sin tipo en C
Publicado por: the_jocker en 29 Junio 2012, 20:01 pm
Yo use un tiempo el geany, pero lo deje porque no me compilaba C, y le dije hasta la vista baby, por eso uso nano.


Título: Re: Problema con funcion sin tipo en C
Publicado por: Foxy Rider en 1 Julio 2012, 03:58 am
Te faltó enlazar la librería para matemáticas (-lm al gcc) ... respecto a Dev-Cpp, lo que usa de compilador ese IDE es MingW. MingW es la versión de Windows de GCC y algunas herramientas más que YA usás en linux ... siendo la diferencia que Dev-Cpp trae una versión súper obsoleta y compila en modo C++  por default, y el gcc tuyo es MUCHO más moderno y compila en modo C por default (aunque esto lo cambiaron en la versión de desarrollo si mal no recuerdo) ...

O sea, están usando LAS MISMAS HERRAMIENTAS ( GCC 3.2 vs 4.4 o superior supongo), pero están compilando código C (salta a la vista al ver el uso de librerías estándar de este lenguaje, evitar iostream y los features del lenguaje C++ que esta necesita), con un compilador de C++ y un sólo feature de C++ : referencias (para no usar punteros) ... los que están mal son ellos, no vos. el compilador se quejó de lo que debía quejarse.  Esto es una CHANCHADA, y tu profesor merece ser colgado de su genitales en plaza pública ... por que les vá a pegar una MUY MALA costumbre, les está enseñando MUY mal.

Saludos.