Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Constantinoplero en 17 Diciembre 2011, 23:58 pm



Título: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 17 Diciembre 2011, 23:58 pm
Codeblocks me tira un error en la línea 3 tal que:

Citar
error:expected ';', ',' or ')' before '&' token

Código
  1. /*Código para intercambiar dos números*/
  2.  
  3. #include <stdio.h>
  4.  
  5. void Intercambiar(int &x, int &y);       //Linea 3
  6.  
  7. int main()
  8. {
  9.  
  10. int num1, num2;
  11.  
  12. printf("Dame un numero: ");
  13. scanf("%d", &num1);
  14.  
  15. printf("Dame otro numero: ");
  16. scanf("%d", &num2);
  17.  
  18. Intercambiar (num1, num2);
  19.  
  20. printf("Los he intercambiado: %d %d", num1, num2);
  21.  
  22. return 0;
  23.  
  24. }
  25.  
  26. void Intercambiar(int &x, int &y)
  27. {
  28.  
  29. int aux;
  30.  
  31. aux=x;
  32. x=y;
  33. y=aux;
  34.  
  35. }
  36.  

No entiendo para nada porqué me da ese error. Si alguien me ayuda se lo agradecería. Un saludo.


Título: Re: ¿Error en cabecera de funciones?
Publicado por: bdoX en 18 Diciembre 2011, 00:08 am
Debes aprende a usar bien punteros en C.

Código
  1. /*Codigo para intercambiar dos números*/
  2.  
  3. #include <stdio.h>
  4.  
  5. void Intercambiar(int *x, int *y);
  6. //void Intercambiar(int *, int *);       //tambien puede ser de esta forma
  7.  
  8. int main ( )
  9. {
  10.    int num1, num2;
  11.  
  12.    printf ( "Dame un numero: " );
  13.    scanf ( "%d", &num1 );
  14.  
  15.    printf ( "Dame otro numero: " );
  16.    scanf ( "%d", &num2 );
  17.  
  18.    Intercambiar (&num1, &num2);
  19.  
  20.    printf ( "Los he intercambiado: %d %d", num1, num2 );
  21.  
  22.    setbuf ( stdin, NULL );
  23.    getchar ( );
  24.  
  25.    return 0;
  26.  
  27. }
  28.  
  29. void Intercambiar(int *x, int *y)
  30. {
  31.    int aux;
  32.  
  33.    aux = *x;
  34.    *x = *y;
  35.    *y = aux;
  36. }
  37.  
  38.  

Lo que tu muestras es de C++


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 18 Diciembre 2011, 00:16 am
Verdaderamente sigo sin saber porqué, pero ahora funciona.

Mi profesora usa '&' antes de los argumentos que van a volver por referencia, igual que yo en las prácticas que hacemos en la universidad (con Codeblocks también) y sí funciona.

En los apuntes dice que usemos '&'. ¿Cómo es que funciona con '*' y no con '&'?

Saludos y gracias.


Título: Re: ¿Error en cabecera de funciones?
Publicado por: bdoX en 18 Diciembre 2011, 00:36 am
C no admite void Intercambiar(int &x, int &y);, C++ si. A eso se le llama referencia, y de esta forma void Intercambiar(int *x, int *y); se le llama desreferencia. Fijate que el archivo sea guardado con *.cpp cuando lo hagas de esta forma void Intercambiar(int &x, int &y);.

Yo uso Dev-c++, si guardo tu programa *.c (Es de C) y compilo tu programa me da ese error, y si lo guardo con *.cpp (Es de c++) no me da error. No conozco todos los IDE's pero como todos saben, Dev-c++ puedo compilar codigo de C y de C++, pero tienes que tener cuidado con la extensión con la que guardas

PD: C++ también admite con *

La idea de la programación es que sea portable tu codigo, y que pueda compilar con cualquier IDE sin ningun problema (No quiero hablar de las plataformas). Si tu compilas un codigo en un IDE y ese IDE te admite cosas como por ejemplo que puedas compilar codigo C con extensión *.cpp despues vas a tener problemas cuando uses otro IDE. No puedes mezclar cosas, o programas en C, o en c++, no en ambos.

Saludos


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 18 Diciembre 2011, 01:45 am
O sea que es porque es C y no C++... En la uni igual se guarda automáticamente en .cpp

¿Sabes porque me arroja este código error en la misma zona?

Código
  1. #include <stdio.h>
  2.  
  3. bool EsPrimo(char letra);
  4.  
  5. int main()
  6.  
  7. {
  8.    int numero;
  9.  
  10.    printf("Dame un numero: ");
  11.    scanf("%d", &numero);
  12.  
  13.    if (EsPrimo(numero)==true)
  14.        printf("Es un numero primo");
  15.  
  16.    else
  17.        printf("No es un numero primo");
  18.  
  19.    return 0;
  20.  
  21. }
  22.  
  23. bool EsPrimo(char letra)
  24. {
  25.    int numero, i, divisor;
  26.    bool v=true;
  27.    i=numero-1;
  28.  
  29.    do
  30.    {
  31.        divisor=numero%i;
  32.        i--;
  33.    }
  34.    while(i>1 || divisor==0);
  35.  
  36.    if (divisor==0)
  37.        bool v=false;
  38.  
  39.    return v;
  40.  
  41. }
  42.  
  43.  
  44.  

Saludos y de nuevo gracias


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Ferno en 18 Diciembre 2011, 02:05 am
Por lo mismo. El tipo de dato "bool" es específico de C++ y no es un tipo de dato del lenguaje C.


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 18 Diciembre 2011, 02:12 am
Me lo suponía, pero es que al intentar cambiar la extensión del archivo a .cpp se me ejecuta pero dice que el programa debe cerrarse inmediatamente y no funciona...

P.D.: He cambiado la librería a cstdio al pasarlo a C++


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Ferno en 18 Diciembre 2011, 02:20 am
La variable "letra" no está definida en ningún lado, y la estás utilizando!


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 18 Diciembre 2011, 12:18 pm
Perdón, ya lo cambié. Era 'numero' sobre lo que quiero que actúe la función.
Aún así me sigue saliendo el mismo problema... Se ejecuta, me pide el número, y dice que debe cerrarse.


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Ferno en 18 Diciembre 2011, 15:28 pm
¿En la función EsPrimo también lo cambiaste?
Fijate que le estás pasando algo por parámetro y no lo estás usando, además, declaraste otra variable "número" en dicha función, la cual NO estás inicializando y la estás utilizando para inicializar la variable "i".
Si esa variable número es la que pediste en la función main, no debes declararla nuevamente en la función EsPrimo, y debes pasarlo como parámetro.


Título: Re: ¿Error en cabecera de funciones?
Publicado por: bdoX en 18 Diciembre 2011, 15:47 pm
Código
  1. #include <stdio.h>
  2.  
  3. int EsPrimo (int numero);
  4. //int EsPrimo (int); // también se puede de esta forma
  5.  
  6. int main ( )
  7. {
  8.    int numero;
  9.  
  10.    printf("Dame un numero: ");
  11.    scanf("%d", &numero);
  12.  
  13.    if (EsPrimo (numero) == 1)
  14.        printf("Es un numero primo");
  15.  
  16.    else
  17.        printf("No es un numero primo");
  18.  
  19.    setbuf (stdin, NULL);
  20.    getchar ( );
  21.    return 0;
  22.  
  23. }
  24.  
  25. int EsPrimo (int numero)
  26. {
  27.    int i, divisor, v;
  28.  
  29.    v = 1;
  30.    i = (numero - 1);
  31.  
  32.    do
  33.    {
  34.        divisor = (numero % i);
  35.        i--;
  36.    } while ((i > 1) && (divisor != 0));
  37.  
  38.    if ( divisor == 0 )
  39.        v = 0;
  40.  
  41.    return v;
  42. }
  43.  


Título: Re: ¿Error en cabecera de funciones?
Publicado por: Constantinoplero en 18 Diciembre 2011, 20:55 pm
¿Y alguno sabe por qué el argumento por referencia (perimetro) no me sale bien al ejecutar el programa? Compila pero es obvio que ese no es el perímetro...

Siento preguntar tanto pero estoy teniendo problemas para entender esto.

Código
  1. #include <stdio.h>
  2.  
  3. unsigned calcular_area(unsigned base, unsigned lado, unsigned &perimetro);
  4.  
  5. int main()
  6.  
  7. {
  8.    unsigned lado, base, p;
  9.  
  10.    printf("Dime la base de tu rectangulo: ");
  11.    scanf("%u", &base);
  12.  
  13.    printf("Dame el lado de tu rectangulo: ");
  14.    scanf("%u", &lado);
  15.  
  16.  
  17.  
  18.    printf("Tu area es: %u y su perimetro %u", (calcular_area(base, lado, perimetro)), p);
  19. }
  20.  
  21. unsigned calcular_area(unsigned base, unsigned lado, unsigned &perimetro)
  22.  
  23. {
  24.    unsigned area;
  25.  
  26.    area=base*lado;
  27.    perimetro=lado*2+base*2;
  28.  
  29.    return area;
  30.  
  31. }


Título: Re: ¿Error en cabecera de funciones?
Publicado por: bdoX en 19 Diciembre 2011, 00:53 am
Perimetro no está declarado dentro de la main(). No se como es que te compiló

Ecá está en C++ con referencia

Código
  1. #include <iostream>
  2.  
  3. unsigned calcular_area (unsigned base, unsigned lado, unsigned &perimetro);
  4.  
  5. using namespace std;
  6.  
  7. int main ( )
  8. {
  9.    unsigned lado, base, p;
  10.  
  11.    cout << "Dime la base de tu rectangulo: ";
  12.    cin >> base;
  13.  
  14.    cout << "Dame el lado de tu rectangulo: ";
  15.    cin >> lado;
  16.  
  17.    cout << "Tu area es: " << calcular_area (base, lado, p) << " y su perimetro es: " << p << endl;
  18.  
  19.    cin.ignore ( );
  20.    cin.get ();
  21.  
  22.    return 0;
  23. }
  24.  
  25. unsigned calcular_area (unsigned base, unsigned lado, unsigned &perimetro)
  26. {
  27.    unsigned area;
  28.  
  29.    area = (base * lado);
  30.    perimetro = (lado * 2) + (base * 2);
  31.  
  32.    return area;
  33. }
  34.  

En C++ pero con desreferencia

Código
  1. #include <iostream>
  2.  
  3. unsigned calcular_area (unsigned base, unsigned lado, unsigned *perimetro);
  4.  
  5. using namespace std;
  6.  
  7. int main ( )
  8. {
  9.    unsigned lado, base, p;
  10.  
  11.    cout << "Dime la base de tu rectangulo: ";
  12.    cin >> base;
  13.  
  14.    cout << "Dame el lado de tu rectangulo: ";
  15.    cin >> lado;
  16.  
  17.    cout << "Tu area es: " << calcular_area (base, lado, &p) << " y su perimetro es: " << p << endl;
  18.  
  19.    cin.ignore ( );
  20.    cin.get ();
  21.    return 0;
  22. }
  23.  
  24. unsigned calcular_area (unsigned base, unsigned lado, unsigned *perimetro)
  25. {
  26.    unsigned area;
  27.  
  28.    area = (base * lado);
  29.    *perimetro = (lado * 2) + (base * 2);
  30.  
  31.    return area;
  32. }
  33.  

Y acá está en C

Código
  1. #include <stdio.h>
  2.  
  3. unsigned calcular_area (unsigned base, unsigned lado, unsigned *perimetro);
  4.  
  5. int main( )
  6. {
  7.    unsigned lado, base, p;
  8.  
  9.    printf ( "Dime la base de tu rectangulo: " );
  10.    scanf ( "%u", &base );
  11.  
  12.    printf ( "Dame el lado de tu rectangulo: " );
  13.    scanf ( "%u", &lado );
  14.  
  15.    printf ( "Tu area es: %u y su perimetro %u", calcular_area (base, lado, &p), p );
  16.  
  17.    setbuf (stdin, NULL)
  18.    getchar ( );
  19.    return 0;
  20. }
  21.  
  22. unsigned calcular_area (unsigned base, unsigned lado, unsigned *perimetro)
  23. {
  24.    unsigned area;
  25.  
  26.    area = (base * lado);
  27.    *perimetro = (lado * 2) + (base * 2);
  28.  
  29.    return area;
  30. }
  31.  

Saludos!!