Problema de compilación

Iniciado por shulneos, 8 Agosto 2013, 22:01 PM

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

shulneos

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.

avesudra

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!
Regístrate en

shulneos

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

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

shulneos

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;
}

xiruko

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.

shulneos

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.