Foros del Web » Programación para mayores de 30 ;) » C/C++ »

mergesort errores

Estas en el tema de mergesort errores en el foro de C/C++ en Foros del Web. **ordenar leyendo con mergesort un archivo con una lista de N numeros . aqui dejo mi codigo pero me tira errores quien me ayuda #include<stdio.h> ...
  #1 (permalink)  
Antiguo 02/05/2010, 20:48
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Sonrisa mergesort errores

**ordenar leyendo con mergesort un archivo con una lista de N numeros . aqui dejo mi codigo pero me tira errores quien me ayuda

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

void merge(int lo, int m, int hi)
{
int i,j,k;
for(i=lo ; i<hi; i++)
{
b[i]=a[i];
i=lo;
j=m+1;
k=lo;
while(i<=m && j<=hi)
{
if(b[i] && j<=hi)
{
a[k++]=b[i++];
}
else
{
a[k++]=b[j++];
}
while( i <=m )
{
a[k++] = b[i++];
}
}
}
}



void mergesort (int first, int last, int a)
{
if (last - first > 1)
{
int middle = first + (last - first);
mergesort(first, middle, a);
mergesort(middle, last, a);
merge(first, middle, last, a);
}
}


int main ()
{
float total,inicio, final;
inicio=clock();

FILE *ofp, *ifp;

ifp = fopen("aleatorio.txt","r"); //leo la cantidad N de datos a ordenar.
int N, aux, i;
fscanf(ifp,"%i", &N);
int d[N];
i=0;
for(i=0;i<N;i++)
{
fscanf(ifp,"%i", &d[i]);
}

ofp = fopen("merge_dec.txt","w");
int n;
n=N;

for(i=0;i<n;i++)
{
fprintf(ofp,"%i \n",mergesort(d[0], d[N]), N);
}


fclose(ofp);
fclose(ifp);

final=clock();
total=(final-inicio)/(double) CLOCKS_PER_SEC;
printf("%f\n",total);

return 0;
}
______________

ERRORES

merge_dec.c: In function ‘merge’:
merge_dec.c:10: error: ‘b’ undeclared (first use in this function)
merge_dec.c:10: error: (Each undeclared identifier is reported only once
merge_dec.c:10: error: for each function it appears in.)
merge_dec.c:10: error: ‘a’ undeclared (first use in this function)
merge_dec.c: In function ‘mergesort’:
merge_dec.c:41: error: too many arguments to function ‘merge’
merge_dec.c: In function ‘main’:
merge_dec.c:69: error: too few arguments to function ‘mergesort’
make: *** [merge_dec] Error 1


saludos
  #2 (permalink)  
Antiguo 02/05/2010, 21:06
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: mergesort errores

Para empezar en la funcion merge los array a,b no estan definidos en ningun lado.

Despues fijate que en la linea 41 a la funcion merge le pasas demasiados argumentos, como tambien en la linea 69 a mergesort. Algo esta sobrando.

Por otro lado no le encuentro mucho sentido a tu mergesort. fijate que para empezar, en el main solo le pasas dos valores de tu "lista" de numeros. Entonces cuando entras a la funcion mergesort, no tiene ni idea del array.
Deberias checkear un poco el codigo. Aunque te compiles no va a funcionar.
  #3 (permalink)  
Antiguo 03/05/2010, 16:29
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Respuesta: mergesort errores

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

int merge(int a[], int low, int high, int mid)
{
int i, j, k, c[50];
i=low;
j=mid+1;
k=low;
while((i<=mid)&&(j<=high))
{
if(a[i]<a[j])
{
c[k]=a[i];
k++;
i++;
}
else
{
c[k]=a[j];
k++;
j++;
}
}

while(i<=mid)
{
c[k]=a[i];
k++;
i++;
}

while(j<=high)
{
c[k]=a[j];
k++;
j++;
}

for(i=low;i<k;i++)
{
a[i]=c[i];
}
}

int *mergesort(int a[], int low, int high)
{
int mid;

if(low<high)
{
mid=(low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,high,mid);
}
if(high==low)
{
return a;
}
return(0);
}


int main ()
{
float total,inicio, final;
inicio=clock();

FILE *ofp, *ifp;

ifp = fopen("aleatorio.txt","r");
int N, i;

fscanf(ifp,"%i", &N);
int d[N];
int *j;
for(i=0;i<N;i++)
{
fscanf(ifp,"%i", &d[i]);
}

ofp = fopen("merge_dec.txt","w");
int * temp = (int *)malloc(sizeof(int)*(N));
j = mergesort(d, 0, N);
for(i=0;i<N;i++)
{
fprintf(ofp,"%i\n",d[i]);
}


fclose(ofp);
fclose(ifp);

final=clock();
total=(final-inicio)/(double) CLOCKS_PER_SEC;
printf("%f\n",total);

return 0;
}



ARREGLE UN POCO MAS EL CODIGO COMPILA, PERO ME ARROJA
Fallo de segmentación (`core' generado) :(

tal vez sea un error en los punteros :/ ya me tiene sin neuronas el codigo. una ayudita porfa .
  #4 (permalink)  
Antiguo 03/05/2010, 16:43
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Respuesta: mergesort errores

ARREGLE UN POCO MAS EL CODIGO COMPILA, PERO ME ARROJA
Fallo de segmentación (`core' generado) :(

tal vez sea un error en los punteros :/ ya me tiene sin neuronas el codigo. una ayudita porfa .


Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5.  
  6. int merge(int a[], int low, int high, int mid)
  7. {
  8.   int i, j, k, c[50];
  9.   i=low;
  10.   j=mid+1;
  11.   k=low;
  12.   while((i<=mid)&&(j<=high))
  13.   {
  14.     if(a[i]<a[j])
  15.       {
  16.       c[k]=a[i];
  17.       k++;
  18.       i++;
  19.       }
  20.       else
  21.       {
  22.       c[k]=a[j];
  23.       k++;
  24.       j++;
  25.       }
  26.   }
  27.  
  28.   while(i<=mid)
  29.   {
  30.     c[k]=a[i];
  31.     k++;
  32.     i++;
  33.   }
  34.  
  35.   while(j<=high)
  36.   {
  37.     c[k]=a[j];
  38.     k++;
  39.     j++;
  40.   }
  41.  
  42.   for(i=low;i<k;i++)
  43.   {
  44.     a[i]=c[i];
  45.   }
  46. }
  47.  
  48. int *mergesort(int a[], int low, int high)
  49. {
  50.   int mid;
  51.  
  52.   if(low<high)
  53.     {
  54.       mid=(low+high)/2;
  55.       mergesort(a,low,mid);
  56.       mergesort(a,mid+1,high);
  57.       merge(a,low,high,mid);
  58.     }
  59.     if(high==low)
  60.       {
  61.       return a;
  62.       }
  63.   return(0);
  64. }
  65.  
  66.  
  67. int main ()
  68. {
  69.   float total,inicio, final;
  70.   inicio=clock();
  71.  
  72.   FILE *ofp, *ifp;
  73.  
  74.   ifp = fopen("aleatorio.txt","r");
  75.   int N, i;
  76.  
  77.   fscanf(ifp,"%i", &N); /*guardo tamaño del arreglo total que viene del archivo abierto*/
  78.   int d[N];
  79.   int *j;
  80.     for(i=0;i<N;i++)
  81.     {
  82.       fscanf(ifp,"%i", &d[i]); /*arreglo de numeros aleatorios*/
  83.     }
  84.      
  85.   ofp = fopen("merge_dec.txt","w");
  86.   int * temp = (int *)malloc(sizeof(int)*(N));
  87.   j = mergesort(d, 0, N);
  88.   for(i=0;i<N;i++)
  89.     {
  90.     fprintf(ofp,"%i\n",d[i]);
  91.     }
  92.  
  93.  
  94. fclose(ofp);
  95. fclose(ifp);
  96.  
  97. final=clock();
  98. total=(final-inicio)/(double) CLOCKS_PER_SEC;
  99. printf("%f\n",total);
  100.  
  101. return 0;
  102. }
  #5 (permalink)  
Antiguo 03/05/2010, 16:50
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: mergesort errores

te paso esta funcion merge hecha por mi. Fiajte si funciona con esa...
Código C:
Ver original
  1. void merge(int *a, int l, int r, int n)
  2. {
  3.     int n1 = n-l+1, n2 = r-n, i,j,k;
  4.     int  b[n-l+2], c[r-n+1];
  5.     int t;
  6.     b[n1] = c[n2] = 2147483647;
  7.  
  8.     for(i=0;i<n1;i++) b[i] = a[l+i];
  9.     for(i=0;i<n2;i++) c[i] = a[n+1+i];
  10.     i = j =  0;
  11.  
  12.     for(k=l;k<=r;k++){
  13.         if (b[i] <= c[j])
  14.             a[k] = b[i++];
  15.         else
  16.             a[k] = c[j++];
  17.     }
  18.     return;
  19. }
  #6 (permalink)  
Antiguo 03/05/2010, 18:02
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Respuesta: mergesort errores

borre una parte pequeña que me parece no afectaba el funcionamiento y agrege el codigo que me dices me envia el siguiente error

merge_dec2.c: In function ‘main’:
merge_dec2.c:67: warning: format ‘%i’ expects type ‘int’, but argument 3 has type ‘void *’







Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5.  
  6. void merge(int *a, int l, int r, int n)
  7. {
  8.     int n1 = n-l+1, n2 = r-n, i,j,k;
  9.     int  b[n-l+2], c[r-n+1];
  10.     int t;
  11.     b[n1] = c[n2] = 2147483647;
  12.  
  13.     for(i=0;i<n1;i++) b[i] = a[l+i];
  14.     for(i=0;i<n2;i++) c[i] = a[n+1+i];
  15.     i = j =  0;
  16.  
  17.     for(k=l;k<=r;k++){
  18.         if (b[i] <= c[j])
  19.             a[k] = b[i++];
  20.         else
  21.             a[k] = c[j++];
  22.     }
  23.     return ;
  24. }
  25.  
  26. void *mergesort(int a[], int low, int high)
  27. {
  28.   int mid;
  29.  
  30.   if(low<high)
  31.     {
  32.       mid=(low+high)/2;
  33.       mergesort(a,low,mid);
  34.       mergesort(a,mid+1,high);
  35.       merge(a,low,high,mid);
  36.     }
  37.     if(high==low)
  38.       {
  39.       return a;
  40.       }
  41.   return(0);
  42. }
  43.  
  44.  
  45. int main ()
  46. {
  47.   float total,inicio, final;
  48.   inicio=clock();
  49.  
  50.   FILE *ofp, *ifp;
  51.  
  52.   ifp = fopen("aleatorio.txt","r");
  53.   int N, i;
  54.  
  55.   fscanf(ifp,"%i", &N);
  56.   int d[N];
  57.   int *j;
  58.     for(i=0;i<N;i++)
  59.     {
  60.       fscanf(ifp,"%i", &d[i]);
  61.     }
  62.      
  63.   ofp = fopen("merge_dec.txt","w");
  64.  
  65.   for(i=0;i<N;i++)
  66.     {
  67.     fprintf(ofp,"%i\n",mergesort(d,0,N));
  68.     }
  69.  
  70.  
  71. fclose(ofp);
  72. fclose(ifp);
  73.  
  74. final=clock();
  75. total=(final-inicio)/(double) CLOCKS_PER_SEC;
  76. printf("%f\n",total);
  77.  
  78. return 0;
  79. }
  #7 (permalink)  
Antiguo 03/05/2010, 18:56
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Respuesta: mergesort errores

jajaja le estaba pasando void para imprimir por eso alega el compilador, tanto mergesort y merge eran int , ahora solo me alega por un puntero en la linea 39

merge_dec2.c: In function ‘mergesort’:
merge_dec2.c:39: warning: return makes integer from pointer without a cast
  #8 (permalink)  
Antiguo 03/05/2010, 19:32
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: mergesort errores

Eso es una advertencia:

pasa que tu funcion es del tipo Void * (Puntero a void) y vos estas devolviendo un int * (putero a entero). El compilador te avisa que distinto tipo. Pero es solo un aviso, el programa se pudo compilar y pero avisa que capas que no funcione como es esperado por ese error de tipo.

cambia el tipo de tu funcion a " int *mergesort(int a[], int low, int high) "
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:03.