Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Gallu en 27 Abril 2010, 01:22 am



Título: Problema con arbol en ubuntu
Publicado por: Gallu en 27 Abril 2010, 01:22 am
Buenas a todos , estoy intentando crear operaciones para un árbol binario y no se que sucede,  el compilador me da estos resultados
Código
  1. diego@diego-desktop:~/Documentos/fuente$ gcc arbol.c -o arbol
  2. arbol.c: En la función ‘main’:
  3. arbol.c:24: aviso: declaración implícita incompatible de la función interna ‘malloc
  4. arbol.c: En la función ‘insertar’:
  5. arbol.c:43: aviso: declaración implícita incompatible de la función interna ‘malloc
  6. arbol.c: En la función ‘arbol_to_array’:
  7. arbol.c:76: aviso: declaración implícita incompatible de la función interna ‘realloc
  8. arbol.c:81: aviso: declaración implícita incompatible de la función interna ‘realloc
  9. diego@diego-desktop:~/Documentos/fuente$
  10.  
Pero cuando ejecuto me aparece los siguiente
Código
  1. *** glibc detected *** ./arbol: realloc(): invalid pointer: 0xbfe00bd8 ***
  2. ======= Backtrace: =========
  3. /lib/tls/i686/cmov/libc.so.6[0xb7640604]
  4. /lib/tls/i686/cmov/libc.so.6(realloc+0x242)[0xb7645022]
  5. /lib/tls/i686/cmov/libc.so.6(realloc+0x42)[0xb7644e22]
  6. ./arbol[0x804872f]
  7. ./arbol[0x8048519]
  8. /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb75e7775]
  9. ./arbol[0x80483a1]
  10. ======= Memory map: ========
  11. 08048000-08049000 r-xp 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  12. 08049000-0804a000 r--p 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  13. 0804a000-0804b000 rw-p 00001000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  14. 08ffa000-0901b000 rw-p 08ffa000 00:00 0          [heap]
  15. b75d0000-b75d1000 rw-p b75d0000 00:00 0
  16. b75d1000-b772d000 r-xp 00000000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
  17. b772d000-b772e000 ---p 0015c000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
  18. b772e000-b7730000 r--p 0015c000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
  19. b7730000-b7731000 rw-p 0015e000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
  20. b7731000-b7734000 rw-p b7731000 00:00 0
  21. b7734000-b7741000 r-xp 00000000 08:05 327701     /lib/libgcc_s.so.1
  22. b7741000-b7742000 r--p 0000c000 08:05 327701     /lib/libgcc_s.so.1
  23. b7742000-b7743000 rw-p 0000d000 08:05 327701     /lib/libgcc_s.so.1
  24. b7743000-b7746000 rw-p b7743000 00:00 0
  25. b7746000-b7747000 r-xp b7746000 00:00 0          [vdso]
  26. b7747000-b7763000 r-xp 00000000 08:05 328221     /lib/ld-2.9.so
  27. b7763000-b7764000 r--p 0001b000 08:05 328221     /lib/ld-2.9.so
  28. b7764000-b7765000 rw-p 0001c000 08:05 328221     /lib/ld-2.9.so
  29. bfded000-bfe02000 rw-p bffeb000 00:00 0          [stack]
  30. Cancelado
  31.  
Agradeceria cualquier sugerencia , el código es el siguiente
Código
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.    int  info;
  5.    void *izq , *der;
  6. }Nodo;
  7.  
  8. //definimos el tipo puntero a nodo
  9. typedef Nodo * PtrNodo;
  10.  
  11.  
  12. void insertar(PtrNodo *ptrNodo, int info);
  13. int esVacio(PtrNodo nodo);
  14. int buscar(PtrNodo nodo, int elem);
  15. int nodos(PtrNodo nodo);
  16. int arbol_to_array(PtrNodo nodo, int **array, int numEle);
  17.  
  18. int main(){
  19.    PtrNodo raiz = NULL;
  20.    int array[] ={8,1,4,2,6,7};
  21.    int info = 4;
  22.    int  *elem;
  23.    int i = 0;
  24.    elem = (int*)malloc(sizeof(int));
  25.    insertar(&raiz , array[0]);
  26.    insertar(&raiz , array[1]);
  27.    insertar(&raiz , array[2]);
  28.    insertar(&raiz , array[3]);
  29.    insertar(&raiz , array[4]);
  30.    insertar(&raiz , array[5]);
  31.    if(arbol_to_array(raiz, &elem , 0)){
  32.        while(i < 5){
  33.            printf("\nValor %d",elem[1]);
  34.            i++;
  35.        }
  36.    }
  37.    return 0;
  38. }
  39.  
  40.  
  41. void insertar(PtrNodo *ptrNodo, int info){
  42.    if(esVacio(*ptrNodo)){
  43.        *ptrNodo = (PtrNodo) malloc(sizeof(Nodo));
  44.        (*ptrNodo)->info = info;
  45.        (*ptrNodo)->izq = (*ptrNodo)->der = NULL;
  46.    }
  47.    else if ((*ptrNodo)->info < info) insertar((void*)(&(*ptrNodo)->der), info);
  48.    else if ((*ptrNodo)->info > info) insertar((void*)(&(*ptrNodo)->izq), info);
  49. }
  50.  
  51.  
  52. int esVacio(PtrNodo nodo){
  53.    if(nodo == NULL)return 1;
  54.    return 0;
  55. }
  56.  
  57. int buscar(PtrNodo nodo, int elem){    
  58.  if (nodo == NULL) return 0;
  59.  else if (nodo->info < elem) return buscar(nodo->der, elem);
  60.  else if (nodo->info > elem) return buscar(nodo->izq, elem);
  61.  else return 1;
  62. }
  63.  
  64. int nodos(PtrNodo nodo){
  65.    if(!nodo)return 0;
  66.    else return(1 + nodos(nodo->izq) + nodos(nodo->der));
  67. }
  68. int arbol_to_array(PtrNodo nodo, int **array, int numElem){    
  69.    if(!nodo){
  70.        return 0;
  71.    }else{        
  72.        *array[numElem] = nodo->info;
  73.        printf("\nPos:%d  ele:%d",numElem ,*array[numElem]);
  74.        if(nodo->izq){
  75.            numElem++;
  76.            realloc(array , (numElem + 1) * sizeof(int));
  77.            arbol_to_array(nodo->izq , array , numElem);
  78.        }
  79.        if(nodo->der){
  80.            numElem++;
  81.            realloc(array , (numElem + 1) * sizeof(int));
  82.            arbol_to_array(nodo->der , array , numElem);
  83.        }
  84.        return 1;
  85.    }
  86. }
  87.  
  88.  
  89.  


Título: Re: Problema con arbol en ubuntu
Publicado por: SeC en 27 Abril 2010, 02:13 am
Código
  1. #include <stdlib.h>


Título: Re: Problema con arbol en ubuntu
Publicado por: Gallu en 27 Abril 2010, 17:53 pm
Lo probaré en casa en ubuntu , pero aqui en el curro , con windows , se ejecuta una vez el print de arbol_to_array y peta
Código
  1.  printf("\nPos:%d  ele:%d",numElem ,*array[numElem]);
espero que se solucione solo con agregarle la libreria...


Título: Re: Problema con arbol en ubuntu
Publicado por: Gallu en 28 Abril 2010, 00:45 am
Nada de nada sec la salida de la ejecución del programa peta , alguien sabe que es lo que debo aprender para interpretar el resultado que me muestra la consola?
Código
  1. *** glibc detected *** ./arbol: realloc(): invalid pointer: 0xbf85d614 ***
  2. ======= Backtrace: =========
  3. /lib/tls/i686/cmov/libc.so.6[0x699ff1]
  4. /lib/tls/i686/cmov/libc.so.6(realloc+0x2b8)[0x69fa38]
  5. /lib/tls/i686/cmov/libc.so.6(realloc+0x2d0)[0x69fa50]
  6. ./arbol[0x8048735]
  7. ./arbol[0x8048549]
  8. /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x645b56]
  9. ./arbol[0x80483c1]
  10. ======= Memory map: ========
  11. 00492000-00493000 r-xp 00000000 00:00 0          [vdso]
  12. 0062f000-0076d000 r-xp 00000000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
  13. 0076d000-0076e000 ---p 0013e000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
  14. 0076e000-00770000 r--p 0013e000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
  15. 00770000-00771000 rw-p 00140000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
  16. 00771000-00774000 rw-p 00000000 00:00 0
  17. 00b25000-00b41000 r-xp 00000000 08:05 327685     /lib/libgcc_s.so.1
  18. 00b41000-00b42000 r--p 0001b000 08:05 327685     /lib/libgcc_s.so.1
  19. 00b42000-00b43000 rw-p 0001c000 08:05 327685     /lib/libgcc_s.so.1
  20. 00c72000-00c8d000 r-xp 00000000 08:05 327732     /lib/ld-2.10.1.so
  21. 00c8d000-00c8e000 r--p 0001a000 08:05 327732     /lib/ld-2.10.1.so
  22. 00c8e000-00c8f000 rw-p 0001b000 08:05 327732     /lib/ld-2.10.1.so
  23. 08048000-08049000 r-xp 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  24. 08049000-0804a000 r--p 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  25. 0804a000-0804b000 rw-p 00001000 08:05 10223911   /home/diego/Documentos/fuente/arbol
  26. 080ff000-08120000 rw-p 00000000 00:00 0          [heap]
  27. b78db000-b78dc000 rw-p 00000000 00:00 0
  28. b78ec000-b78ef000 rw-p 00000000 00:00 0
  29. bf84a000-bf85f000 rw-p 00000000 00:00 0          [stack]
  30. Pos:0  ele:8Cancelado
  31.  
  32.  


Título: Re: Problema con arbol en ubuntu
Publicado por: Gallu en 28 Abril 2010, 12:24 pm
Estoy viendo que el problemas es el realloc  que no me reserva más memoria , el puntero *array en arbol_to_array  siempre mide 4 , alguien sabe por que sucede?