Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: shulneos en 8 Agosto 2013, 22:01 PM

Título: Problema de compilación
Publicado por: shulneos en 8 Agosto 2013, 22:01 PM
Hola buenas estoy empezando en esto de la programación y en la carrera nos piden que definamos una estructura llamada Array, y posteriormente definamos unas funciones. El problema lo tengo a la hora de definir la función ya que me tira error de compilación en la linea donde se define la función. Este es el código.

// Crea y devuelve un array de tamaño n = lsup-linf+1
// con los números enteros comprendidos entre los límites
// linf y lsup, asignados al array de forma aleatoria entre los
// índices 1 y n. El array contendrá finalmente una
// permutación con los números enteros comprendidos entre
// dichos límites.
// Req: linf<=lsup
struct Array {int *v; int n;};

Array ArrayCreaAleatorio(int linf, int lsup;)
{
     Array a;
     a.n=lsup-linf+1;
     a.v=malloc(sizeof(Array)*a.n);
     for (int i=0; i<a.n;i++)
         a.v[i]=linf+i;
     for (int j=0;j<=a.n-2;j++)
     {
         int k=EnteroAleatorio(j+1,a.n-1);
         int aux=a.v[j];
         a.v[j]=a.v[k];
         a.v[k]=aux;
     }
     return a;      
}


Si alguien me puede decir donde la estoy jodiendo, le estaría muy agradecido.
Título: Re: Problema de compilación
Publicado por: avesudra en 8 Agosto 2013, 23:08 PM
Hola buenas, suponiendo que EnteroAleatorio esté definido, el único problema es este:
Código (cpp) [Seleccionar]
Array ArrayCreaAleatorio(int linf, int lsup;)
Fíjate en el penúltimo carácter, eso no está bien, el punto y coma sobra, por lo que la línea quedaría:
Código (cpp) [Seleccionar]
Array ArrayCreaAleatorio(int linf, int lsup)

¡Un saludo!
Título: Re: Problema de compilación
Publicado por: shulneos en 8 Agosto 2013, 23:56 PM
Si EnteroAleatorio está definido en una función anterior:
int EnteroAleatorio(int linf, int lsup)
{
    return linf+rand()%(lsup-linf+1);
}


He corregido lo del ; de la función pero me sigue tirando el mismo error:
syntax error before "ArrayCreaAleatorio"

Gracias por responder
Título: Re: Problema de compilación
Publicado por: rir3760 en 9 Agosto 2013, 01:22 AM
Estas compilando ese fragmento como C++, ¿Correcto?

Con la modificación que te indico avesudra debería compilar sin problemas, si no es así por favor publica el código fuente completo.

Un saludo
Título: Re: Problema de compilación
Publicado por: shulneos en 9 Agosto 2013, 01:26 AM
No, compilo en C, no se las diferencias que habrá porque es mi primer año de carrera pero de momento C. Publico todo el código para verlo mejor.
#include <stdlib.h>
#include <stdio.h>


// Lee por teclado dos enteros linf y lsup,
// tales que linf<=lsup.

void LimitesLee(int * linf, int * lsup)
{
    printf("Introduzca dos enteros para los límites inferior y superior: \n");
    scanf ("%d %d",linf,lsup);
    while (*linf>*lsup)
    {
          printf("El limite inferior no puede ser mayor que el superior\n");
          printf("Por favor, vuelva a introducir los límites\n");
          scanf("%d %d",linf,lsup);
    }
}
// Imprime por pantalla los enteros linf y lsup con formato:
// Limites: [linf,lsup]
void LimitesImprime(int linf, int lsup)
{
    printf("Los límites inferior y superior son:[%d,%d]\n",linf,lsup);
}
// Genera y devuelve un entero aleatorio entre los límites
// linf y lsup.
int EnteroAleatorio(int linf, int lsup)
{
   return linf+rand()%(lsup-linf+1);
}
// Imprime por pantalla un entero e con formato:
// Entero: e
void EnteroImprime(int e)
{
    printf("Entero: %d \n",e);
}



// Crea y devuelve un array de tamaño n = lsup-linf+1
// con los números enteros comprendidos entre los límites
// linf y lsup, asignados al array de forma aleatoria entre los
// índices 1 y n. El array contendrá finalmente una
// permutación con los números enteros comprendidos entre
// dichos límites.
// Req: linf<=lsup
struct Array {int *v; int n;}

Array ArrayCreaAleatorio(int linf, int lsup)
{
     Array a;
     a.n=lsup-linf+1;
     a.v=malloc(sizeof(Array)*(a.n));
     for (int i=0; i<a.n;i++)
         a.v[i]=linf+i;
     for (int j=0;j<=a.n-2;j++)
     {
         int k=EnteroAleatorio(j+1,a.n-1);
         int aux=a.v[j];
         a.v[j]=a.v[k];
         a.v[k]=aux;
     }
     return a;      
}



int main()
{
   char nombre[10];
   int  edad;
   printf ("Hola mundo\n");
   printf ("Dime tu nombre: ");
   scanf  ("%s",nombre);
   printf ("Dime tu edad: ");
   scanf  ("%d",&edad);
   while(edad<0)
             {
             printf("Edad erronea, introduce edad: ");
             scanf("%d",&edad);
             }
   printf ("Hola %s tienes %d tacos\n",nombre,edad);
   
   int linf=0;
   int lsup=0;
   int ernd=0;
   int opcion=0;
   Array a=ArrayCreaAleatorio(linf,lsup);
   while (opcion!=7)
   {
         printf("1. Imprimir en pantalla los límites actuales.\n");
         printf("2. Imprimir en pantalla el entero aleatorio actual.\n");
         printf("3. Imprimir en pantalla el array actual.\n");
         printf("4. Leer desde teclado nuevos límites.\n");
         printf("5. Generar un nuevo entero aleatorio dentro de los límites actuales.\n");
         printf("6. Generar un nuevo array aleatorio dentro de los limites actuales.\n");
         printf("7. Salir.\n");
         printf("Introducir opción (1-5):\n");
         scanf("%d",&opcion);
         switch(opcion)
         {
             case 1:LimitesImprime(linf,lsup);break;
             case 2:EnteroImprime(ernd);break;
             case 3:break;
             case 4:LimitesLee(&linf,&lsup);
                    LimitesImprime(linf,lsup);break;
             case 5:ernd=EnteroAleatorio(linf,lsup);
                    EnteroImprime(ernd);break;
              case 6:break;
             case 7:break;
             default: printf("Error, la opción ha de estar comprendida entre 1-5\n");
         }
                     
                       
   }
       system("pause");
   return 0;
}
Título: Re: Problema de compilación
Publicado por: xiruko en 9 Agosto 2013, 06:10 AM
struct Array {int *v; int n;};

Te faltó el ';' al final de la declaración del struct. Debajo tienes la siguiente declaración:

Array ArrayCreaAleatorio(int linf, int lsup)
{
      Array a;
      //...


Y bueno para declarar el tipo de retorno de la función y la variable de esta manera deberías usar lo siguiente para declarar el struct:

typedef struct {int *v; int n;} Array;

Si quieres declarar el struct tal y como lo tenías antes entonces deberías declarar el tipo de retorno y la variable de esta manera:

struct Array ArrayCreaAleatorio(int linf, int lsup)
{
      struct Array a;
      //...


No sé si tendrás el mismo error en otras líneas, pero bueno eso ya te lo dejo a ti.

Saludos.
Título: Re: Problema de compilación
Publicado por: shulneos en 9 Agosto 2013, 13:31 PM
Muchas gracias, estaba cometiendo el error al declarar la estructura, he utilizado typedef para definirla y no me ha causado problemas. Muchas gracias por todos los que me han respondido. Espero ser yo el que ayude la proxima vez. Aunque por ahora sólo sepa programar en ensamblador y Pascal.