• Sábado 12 de Julio de 2025, 13:01

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Leber

Páginas: [1]
1
C/C++ / Información fichero Linux
« en: Miércoles 21 de Diciembre de 2011, 15:46 »
Buenos dias,

Mi pregunta es si hay alguna manera de saber con la API de linux si cierto fichero esta siendo usado por algun proceso ( si esta abierto digamos ).
La funcion stat no sirve, ya que da todos los datos sobre el fichero pero este no, y tampoco quiero hacer una busqueda en /proc/[pids]/[fd] para saber si ahi se encuentra el fichero, ya que perderia mucho tiempo.

Se os ocurre algo?

Gracias



2
C/C++ / Algoritmo de Huffman
« en: Jueves 25 de Agosto de 2011, 13:10 »
Hola, que tal.

Llevo un par de dias intentando implementar el algoritmo de huffman ( solo por aprender un poco más ), y a pesar de haber leido varios textos todavía tengo algunas dudas que no consigo resolver, a ver si alguien puede echarme una mano.

De momento tengo hecho:

- Tabla con valor-frequencia.
- Lista enlazada con los valores de la tabla ordenada de menor a mayor.

Es decir, teniendo la frase: "hola papa":

Código: [Seleccionar]
hola papa
Table [ 0 ]      Char:           Freq: 1
Table [ 1 ]      Char: o         Freq: 1
Table [ 2 ]      Char: h         Freq: 1
Table [ 3 ]      Char: l         Freq: 1
Table [ 4 ]      Char: p         Freq: 2
Table [ 5 ]      Char: a         Freq: 3
Total r 6
List: Char:     Freq: 1
List: Char: o   Freq: 1
List: Char: h   Freq: 1
List: Char: l   Freq: 1
List: Char: p   Freq: 2
List: Char: a   Freq: 3

Segun lo leido, el arbol huffman se forma así:

Teniendo eso: [espacio](1) - o(1) - h(1) - l(1) - p(2) - a(3)

- Se toman los dos valores con menos frequencia, por ejemplo: ( [espacio] y o ) y se forma un arbol:

   (          2         )
        /               \
" "[1 peso]          o[1 peso]

Y seguimos, ahora nos quedan: h(1) - l(1) - 2 - p(2) - a(3)
Así que cogemos "h" y "l".

Mi duda es que, a mi parecer, h y l deberían quedar asi:


               (          4        )
                   /            \
(          2         )        (         2     )             
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Y nos queda:   p(2) - a(3) - 4


Cogemos p( 2 ) y a(3):

                                 (          9       )
                                    /                  \

               (          4        )                 (       5        )
                   /            \                        /          \
(          2         )        (         2     )         p(2)      a(3)     
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Y nos queda: 4:

                              (               14             )
                            /                             \

                                  (          9       )            (         4       )
                                    /                  \

               (          4        )                 (       5        )
                   /            \                        /          \
(          2         )        (         2     )         p(2)      a(3)     
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Así que de esta forma quedaría el arbol, pero creo que no es correcto.
A ver si me podéis decir donde me voy del plano y me pierdo.

Gracias de antemano

3
C/C++ / Complementos(1 y 2)
« en: Miércoles 11 de Mayo de 2011, 18:51 »
Hola, que tal.

Leyendo un libro, me surgió una duda que no logro aclarar por mas que lo leo.

He leido que en una variable de 8 bits(1 byte), usando un complemento a 2, el rango oscila de -128 a 127, mientras que usando complemento a 1, va de -127 a 127.
Estamos hablando de variables con signo claro.

He mirado el archivo limits.h:

Código: C
  1. #  define CHAR_BIT  8
  2.  
  3. /* Minimum and maximum values a `signed char' can hold.  */
  4. #  define SCHAR_MIN (-128)
  5. #  define SCHAR_MAX 127
  6.  

Así que supongo que usan complemento a 2.

Pero no logro ver porque usando complemento a 2, el numero negativo es -128, mientras que usando 1 es -127.
Por lo que he leido, el C2(complemento 2) es igual a: C1+1, pero no se si va por ahi la cosa. Estoy bastante liado la verdad.

Este es el enlace que estoy leyendo, y que de ahí surgió la duda: http://users.powernet.co.uk/eton/kandr2/krx304.html

No se si me he explicado bien, llevo todo el dia con esto y tengo la cabeza muy espesa ya.

Gracias de antemano

4
C/C++ / Efiencia con punteros
« en: Miércoles 13 de Abril de 2011, 22:18 »
Hola, quizás el titulo no es muy descriptivo. Intentare explicarme:

Supongamos un array como este:

Código: C
  1. int enteros[2] = {4 ,5 };
  2.  

Para acceder a su contenido puede hacerse:

Código: C
  1. enteros[1]
  2.  

o

Código: C
  1. *(enteros + 1)
  2.  

La segunda forma, por lo que he podido comprobar, toma la dirección en la que empieza la variable enteros, y dado que un entero ocupa 4 bytes, le suma 4 a la direccion base para así obtener el contenido del segundo indice.

Sería algo como: 0x7fff00a49620(dirección del primer indice de enteros) + 4. Creo que no me equivoco, es así, no?

Ahora bien, leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera.  Y mi pregunta es, de que forma esta accediendo con enteros[1] para que sea menos rápido ?

Gracias de antemano

5
C/C++ / Casteos "raros" en C
« en: Martes 12 de Abril de 2011, 10:40 »
Hola que tal.

Estaba haciendo algo cuando me tope con la necesidad de hacer un casteo de tipo void* a int. Como no lo tenia muy claro me puse a buscar un poco por internet y me encontré una web bastante maja donde lo explicaban.

En la web había un ejemplo más o menos como este:


Código: C
  1. #include <stdio.h>
  2.  
  3. void func(void *point)
  4. {
  5.     int ret;
  6.  
  7.         ret = *(int *)point;
  8.         printf("%dn", ret );
  9. }
  10.  
  11. int main(void)
  12. {
  13.     int ret_point = 5;
  14.  
  15.     func(&ret_point);
  16.     return 0;
  17. }
  18.  
  19.  

El punto es que no entiendo muy bien esto:
Código: C
  1. ret = *(int *)point;
  2.  


(int *)point <- Esto lo entiendo, hace un casteo a un puntero de tipo int. Pero luego esto *(int *)point ya no lo entiendo.
Alguien me lo podría explicar un poco?

Gracias de antemano

6
ASM (Ensamblador) / Problema al linkar en 32bits (estando en 64)
« en: Viernes 8 de Abril de 2011, 13:07 »
Hola, que tal.

Estoy leyendo un manual de asm, pero el codigo que muestran es de 32 bits, y mi máquina es de 64. Algunos ejercicios puedo hacerlos igual, pero cuando empiezan a manejar la pila también empiezan mis dolores de cabeza.

Imaginemos este, (lo he hecho yo para probar un poco):


Código: ASM
  1. # decreases.s Decrementa un valor hasta 0
  2. .section .data
  3. number:
  4.         .int 8
  5. frase:
  6.         .asciz "Res: %dn"
  7. .section .text
  8. .globl _start
  9. _start:
  10. nop
  11. mov $1, %eax
  12. mov number, %ebx
  13. loop:
  14.         dec %ebx
  15.         je just
  16.         pushl %ebp
  17.         pushl %ecx
  18.         movl %ebx, 4(%esp)
  19.         movl $frase, (%esp)
  20.         call printf
  21.         addl $8, %esp
  22.         jmp loop
  23. just:
  24.         mov $0, %ebx
  25.         int $0x80
  26.  

Y luego hago:

Código: ASM
  1. as --32 decreases.s -o decreases.o
  2.  
y
Código: ASM
  1. ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o decreases -lc decreases.o
  2.  

Pero en mi maquina me devuelve:

Código: ASM
  1. ld: skipping incompatible /usr/lib/libc.so when searching for -lc
  2. ld: skipping incompatible /usr/lib/libc.a when searching for -lc
  3. ld: cannot find -lc
  4.  

Pero en otra maquina me lo hace correctamente.

Las diferencias son:

En mi máquina:

Código: ASM
  1. ls -l /lib/ld-linux.so.2
  2. lrwxrwxrwx 1 root root 20 2011-02-02 14:09 /lib/ld-linux.so.2 -> /lib32/ld-linux.so.2
  3.  

En la otra:

Código: ASM
  1. ls -l /lib/ld-linux.so.2
  2. lrwxrwxrwx 1 root root 9 2011-01-28 14:21 /lib/ld-linux.so.2 -> ld-2.7.so
  3.  

Tenéis alguna idea, seguramente algo estoy haciendo mal, pero no caigo.

Gracias de antemano

7
C/C++ / Estructura de Arbol
« en: Jueves 7 de Abril de 2011, 18:50 »
Hola,

Estaba buscando información sobre las EDD en arbol, pero no arboles binarios, si no arboles que puedan tener mas de 2 hijos. Buscando he encontrado algunos enlaces pero casi todos se referían a arboles binarios, o profundizaban demasiado poco en los arboles del otro tipo.

Me preguntaba si tendríais algún enlace donde explicaran minimamente bien esa parte, y mostraran como implementarlo.

Los enlaces que he mirado yo son:

http://c.conclase.net/edd/?cap=006#inicio
http://computacion.cs.cinvestav.mx/~aca ... ode57.html


------

Aprovecho también a preguntar algo, a ver si estoy enfocando bien el problema.

Imaginad una radio que va reproduciendo canciones aleatorias , pero hay la opción de que en determinado momento queramos sintonizar el artista que esta sonando en esos momentos(eso quiere decir todos los discos y canciones de ese artista), o queramos sintonizar un disco en concreto.

Lo que he pensado es que como un arbol puede tener ramas "infinitas", la estructura en arbol me serviría para ambas cosas ya que:

[SINTONIZAR ARTISTA]

[NODO ROOT]
|
|
[ARTISTA]
|
|
[Disco1 - (rama1)]---------[Disco2 - (rama2)] ---------------------etc
|                                             |
|                                             |
[Canciones disco 1]          [Canciones disco 2]---------------------etc


No se si me explico. Creo que esta estructura es la que me puede ir mejor para este caso, a ver que pensáis vosotros.

Saludos y gracias de antemano

8
C/C++ / Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 12:55 »
Hola, que tal.

Desarrollando una aplicacion, estoy usando una API de sonido que permite crear un stream(llenar el buffer) de manera asincrona sin bloquear la apliación, y una vez ha terminado, llama a un callback para procesar el sonido. Mi duda viene de que no entiendo muy bien como lo hace internamente. Para ser sinceros comprendo lo que significa hacerlo asíncrono, pero no así la manera de llevarlo a cabo.

Lo que he pensado es que quizas lo que hace es que, si se le especifica que no sea bloqueante, crea un nuevo thread para procesar esa petición y cuando termina llama a la funcion callback, de mientras el mainthread sigue su curso.

Se que no es muy bien una duda específica de C, es solo que me gustaría entender la filosofia de las llamadas asíncronas y como son tratadas. Más que nada para saber un poquito más.

No se si podriais explicarme un poco como funcionan las llamadas asíncronas.

He leido un par de links sobre esto, pero no acaba de quedarme claro del todo.

Gracias de antemano

9
C/C++ / Memoria intermedia vs disco
« en: Miércoles 30 de Marzo de 2011, 22:42 »
EDITO

Disculpa, lo escribí con prisas  :ouch:

Basicamente es:

Tienes una estructura tal que asi:

Código: C
  1. typedef struct _iobuf {
  2.     int cnt;    //Caracteres que quedan en la memoria intermedia
  3.     char *ptr;  //Puntero al siguiente carácter de la memoria intermedia
  4.     char *base; //Puntero al inicio de la memoria intermedia
  5.     int flag;   //Modo de acceso al fichero
  6.     int fd;     //Descriptor del fichero
  7. }FILE;
  8.  

Ahora, supongamos que tienes dos punteros a FILE, uno para el fichero a copiar(llamemosle flujo1), y el otro para el fichero destino(flujo2).

Entonces, lo que haces es:

Primeramente lees 1024 bytes(por decir algo) del flujo1, los pones en un puntero (char *base) y luego haces ptr = base.
Entonces, cada vez que haces un getc para tomar el siguiente carácter, se hace una comprobación, si nos hemos quedado sin memoria intermedia (--flujo1->cnt <0) , la volvemos a llenar, si todavía tenemos se toma el caracter de flujo1->ptr++

Cuando haces un putc, para copiar el carácter al fichero, también se comprueba si hay memoria intermedia. Si no la hay, se reserva memoria para el puntero flujo2->base del tamaño de 1024 bytes y hacemos que flujo2->ptr = flujo2->base, y se van colocando los caracteres en
Código: C
  1. flujo2->ptr++ = caracter_a_poner
  2.  
a media que
Código: C
  1. flujo2->cnt
  2.  
se decrementa como antes.
Una vez flujo2->cnt llega a 0, se escribe en el fichero lo contenido en
Código: C
  1. flujo2->ptr
  2.  
, se coloca de nuevo el puntero al inicio de la memoria intermedia
Código: C
  1. flujo2->ptr = flujo2->base
  2.  
y se vuelve a reservar memoria.

Entonces, como ves, unicamente se copia a disco cuanto
Código: C
  1. flujo2->ptr
  2.  
contiene los 1024 bytes que hemos leido con antes. Mi duda era porque no copiarlos de golpe, sin esperar a que la memoria intermedia este llena?

Espero que ahora me haya explicado mejor

10
C/C++ / Ascii + arrowkeys
« en: Lunes 28 de Marzo de 2011, 13:54 »
Hola, que tal.

Con un proyecto que estoy haciendo, necesito capturar eventos a base de teclas, y de momento va bien hasta que me topo con la necesidad de usar las arrowkeys, que como algunas otras teclas, no tienen un codigo ascii, sino dos.

Segun esta web: http://www.jimprice.com/jim-asc.shtml , el primer codigo es una tecla de escape que varia segun el lenguaje. En C parece ser el 27, (codigo que pertenece a la tecla ESC). Pero el segundo codigo que me sale no me cuadra demasiado, ya que me dice que cualquiera de las 4 flechas tiene el codigo 91.

Aqui os dejo el codigo que hago servir, quiza es que este haciendo algo mal.


Código: C
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.  
  6.     int key;
  7.  
  8.         key = getchar();
  9.         printf("%dn", key);
  10.  
  11.         if(key == 27) {
  12.             key = getchar();
  13.             printf("%dn", key);
  14.         }
  15.  
  16.         return 0;
  17. }
  18.  

Y aqui la salida:

Presionando el '+':
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. +
  3. 43
  4.  

Presionando ESC:
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[
  3. 27
  4. 10
  5.  

Presionando Uparrow
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[[A
  3. 27
  4. 91
  5.  

Presionando Leftarrow
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[[C
  3. 27
  4. 91
  5. test@sistemes-test:~/c/dl$
  6.  

Gracias de antemano

11
C/C++ / Lista doblemente enlazada circular[SOL]
« en: Martes 16 de Diciembre de 2008, 17:52 »
Buenas a todos, tengo una duda al liberar una lista doblemente enlazada circular:

Aqui os adjunto el codigo que tengo:

Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct __double_list
  5. {
  6.         int num;
  7.         struct __double_list *next,
  8.                              *prev;
  9. };
  10.  
  11. int __creat_head(struct __double_list **list);
  12. int __insert(struct __double_list **list, int __number);
  13. void show(struct __double_list *head);
  14. void destroy(struct __double_list **list);
  15.  
  16. int
  17. main()
  18. {
  19.  
  20.         struct __double_list *__list = NULL;
  21.         int __number_to_put;
  22.  
  23.         if( (__creat_head(&__list)) != 0)
  24.                 return -1;
  25.  
  26.         for( __number_to_put = 0 ; __number_to_put < 5 ; __number_to_put++)
  27.         {
  28.                 if( (__insert(&__list, __number_to_put)) != 0)
  29.                 {
  30.                         printf("Error de memn");
  31.                         return -1;
  32.                 }
  33.  
  34.         }
  35.  
  36.         show(__list);
  37.         destroy(&__list);
  38.         //show(__list); Es para probar si esta bien liberada
  39.         return 0;
  40.  
  41. }
  42.  
  43. int __creat_head(struct __double_list **list)
  44. {
  45.         *list = (struct __double_list *)malloc(sizeof(struct __double_list));
  46.  
  47.         if(*list == NULL)
  48.         {
  49.                 perror("Error de mem");
  50.                 return -1;
  51.         }
  52.  
  53.         (*list)->next = (*list)->prev = *list;
  54.  
  55.         return 0;
  56. }
  57.  
  58. int __insert(struct __double_list **list, int __number)
  59. {
  60.         struct __double_list *new;
  61.  
  62.         new = (struct __double_list *)malloc(sizeof(struct __double_list));
  63.  
  64.         if(new == NULL)
  65.         {
  66.                 perror("Error new");
  67.                 return -1;
  68.         }
  69.  
  70.         printf("Number-> %dn",__number);
  71.  
  72.  
  73.         new->num = __number;
  74.         new->next = *list;
  75.         new->prev = (*list)->prev;
  76.         (*list)->prev->next = new;
  77.         (*list)->prev = new;
  78.  
  79.         return 0;
  80. }
  81.  
  82. void show(struct __double_list *head)
  83. {
  84.         struct __double_list *node;
  85.  
  86.         node = head->next;
  87.  
  88.         while(node != head)
  89.         {
  90.                 printf("Node num->%dn",node->num);
  91.                 node = node->next;      
  92.         }
  93. }
  94.  
  95. void destroy(struct __double_list **list)
  96. {
  97.         struct __double_list *node, *aux;
  98.  
  99.         node = (*list)->next;
  100.  
  101.         while(node != *list)    
  102.         {
  103.                 aux = node;
  104.                 node = node->next;
  105.                 free(aux);
  106.         }      
  107.         *list = NULL;
  108. }
  109.  

No me convence, porque si vuelvo a mostrar la lista, me muestro 20 veces numeros muy extraños, cuando no deberia de mostrar nada, deberia salir del bucle y ya esta, es por eso que creo que esta mal la funcion de borrar la lista.

A ver si me podeis echar un cable;

Gracias de antemano & saludos


----------------

Ya lo solucione, fue un fallo bastante grave, jeje, al final la funcion quedo asi:

Código: Text
  1. void destroy(struct __double_list **list)
  2. {
  3.         struct __double_list *node, *aux;
  4.  
  5.         node = (*list)->next;
  6.  
  7.         while(node != *list)    
  8.         {
  9.                 aux = node;
  10.                 aux->next->prev = aux->prev;
  11.                 aux->prev->next = aux->next;
  12.                 node = node->next;
  13.                 free(aux);
  14.         }      
  15.         *list = NULL;
  16. }
  17.  

Gracias

12
C/C++ / Saber el tipo de un fichero
« en: Miércoles 10 de Diciembre de 2008, 23:28 »
Buenas señores, bueno, veran, tengo una duda: Como hacer para saber el tipo de fichero
Es decir, lo mismo que hace la utilidad "file" de linux, por ejemplo:

Código: Text
  1.  < /dev/null > file Vendeta.mpg
  2. Vendeta.mpg: MPEG sequence, v1, system multiplex
  3. < /dev/null > file amule_download
  4. amule_download: symbolic link to `.aMule/Incoming/'
  5.  


He buscado en el man, y veo que recoje la informacion de /etc/file/magic, mirando los magic numbers y demas, y me he estado ojeando el archivo, pero no acabo de aclararme.
He probado de buscar el src de la utilidad "file", para fijarme en el codigo y ver como trabaja para saber como puedo hacerlo y, pero no lo encuentro.

Agradeceria cualquier idea, aporte, documento etc..

Gracias de antemano

13
C/C++ / Documentacion FMOX EX
« en: Jueves 30 de Octubre de 2008, 00:05 »
Buenas, escribo esto porque he intentado buscar documentacion, o algun tutorial de fmod Ex, pero solo he encontradoa cerca de fmod3, y era para a ver si alguien podia facilitarme algun link sobre fmod ex, algun manual basico donde se explique su funcionamento, cualquier cosa para empezar en C (si es en cualquier otro lenguage no pasa nada, solo es para ver el funcionamiento, y aprender un poco).

Uso FMOD EX 4.18 bajo linux.

Gracias de antemano

14
C/C++ / Problema con estructuras
« en: Jueves 16 de Octubre de 2008, 00:53 »
Buenas, tengo un problema:

Ayer hice una pequeña agenda de notas para practicar un poco, un fichero binario con estructuras, todo funciona bien menos al mostrarme los datos, que hay algunas notas que se repiten( esto no se si es problema de al mostrar datos, o al escribirlos en el fichero)

Por ejemplo:

Yo le inserto en Catalan la nota 1 y hago un listado de notas y me muestra:


Código: Text
  1. Notas [Catalan]:
  2. > 1
  3. Notas [Castellano]:
  4. Notas [Matematicas]:
  5. Notas [Ingles]:
  6.  


Luego inserto la nota 5 en matematicas y al hacer el listado, sorpresa:



Código: Text
  1. Notas [Catalan]:
  2. > 1
  3. > 1
  4. Notas [Castellano]:
  5. Notas [Matematicas]:
  6. > 5
  7. Notas [Ingles]:
  8.  


Como ven, salen 2 "1", uno lo puse yo, pero y el otro? He revisado una y otra vez el codigo y no encuentro nada que pueda ser:

Las estructuras son estas:

Código: Text
  1.  
  2. typedef struct
  3. {
  4.     int nota_catalan;
  5.     int nota_castellano;
  6.     int nota_mates;
  7.     int nota_ingles;
  8.  
  9. }MATERIAS;
  10.  
  11. typedef struct __notas
  12. {
  13.    
  14.     int trimestre;
  15.     MATERIAS m;
  16.     struct __notas *sig;
  17.  
  18. }NOTAS;
  19.  


Las funciones de escribir, leer son estas:

Escribe en un fichero la estructura con las notas


 
Código: Text
  1. int
  2. carga_fichero(int nota, int materia, int trimestre)
  3. {
  4.  
  5. int df;
  6.    nodo p;
  7.  
  8.               if(( df = open("notas.dat",O_WRONLY | O_APPEND | O_CREAT,0600)) == -1)
  9.               {
  10.                       perror("notas.dat");
  11.                  return -1;
  12.               }
  13.  
  14.               p=inicializa(p);
  15.  
  16.               if(!p)
  17.                       return -1;
  18.  
  19.               if( materia == 1)
  20.                       p->m.nota_catalan=nota;
  21.                   else if( materia == 2 )
  22.                       p->m.nota_castellano=nota;
  23.                   else if( materia == 3)
  24.                       p->m.nota_mates=nota;
  25.                   else if( materia == 4)
  26.                       p->m.nota_ingles=nota;
  27.                   else
  28.                   {
  29.                       fprintf(stderr,"Materia [%d] desconocidan",materia);
  30.                       return -1;
  31.                   }
  32.                  
  33.                  
  34.                   p->trimestre=trimestre;
  35.                  
  36.                   write(df,p,sizeof(NOTAS));
  37.  
  38.               free(p);
  39.  
  40.               close(df);
  41.  
  42.       return 0;
  43.  
  44. }
  45.  


Lee fichero y devuelve estructura:



Código: Text
  1. lista
  2. carga_notas(void)
  3. {
  4.     nodo p;
  5.     int d_n;
  6.     int r_bytes;
  7.     lista l=NULL;
  8.     int indice=0;
  9.                       if(( d_n = open("notas.dat",O_RDONLY)) == -1)
  10.                             {
  11.                                 perror("2datos.dat");
  12.                                 return NULL;
  13.                             }
  14.                            
  15.                             p=inicializa(p);
  16.                            
  17.                             if(!p)
  18.                                 return NULL;
  19.                            
  20.                             while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
  21.                      {
  22.                                 p->sig=l;
  23.                                 l=p;
  24.                                 p=inicializa(p);
  25.                             }
  26.  
  27.                      free(p);
  28.  
  29.                      close(d_n);
  30.  
  31.            return l;
  32.  
  33. }
  34.  


Muestra notas




Código: Text
  1. void mostrar_total_notas(lista l, unsigned int assig)
  2. {
  3.     nodo p;
  4.  
  5.        p=l;
  6.  
  7.             while(p)
  8.               {
  9.                   if(assig == 0)
  10.                   {
  11.                      
  12.                       if ( p->m.nota_catalan != 0)
  13.                       {
  14.                           printf("NOTAS CATALANn");
  15.                          printf("> %dn",p->m.nota_catalan);
  16.                       }
  17.                   }
  18.               else if(assig == 1)
  19.                   {
  20.                       if(p->m.nota_castellano != 0)
  21.                       printf("> %dn",p->m.nota_castellano);
  22.                   }
  23.                   else if(assig == 2)
  24.                   {
  25.                       if(p->m.nota_mates != 0)
  26.                       printf("> %dn",p->m.nota_mates);
  27.                   }
  28.                   else
  29.                   {
  30.                       if(p->m.nota_ingles != 0)
  31.                       printf("> %dn",p->m.nota_ingles);
  32.                   }
  33.  
  34.                   p=p->sig;
  35.               }
  36. }
  37.  


Yo no le veo nada extraño, y de hecho no se porque me lo hace..., a ver si alguien puede arrojar un poco de luz, porque estoy algo preucupado.

Muchas gracias

15
C/C++ / Error Con Free()
« en: Martes 25 de Marzo de 2008, 17:50 »
Buenas, estaba haciendo un programilla que buscara ficheros acabdos en ~, pero hay un problema. Primero les enganchare el codigo y luego lo comento:

Código: Text
  1. void buscar(char *home,const char *destino)
  2. {
  3.   DIR *dirp;
  4.   struct dirent *dir;
  5.   int fd,i,de,ds,nbytes;
  6.   char *duplicado;
  7.   char *pathdest;
  8.   char *pathhome;
  9.   char buffer[BUFSIZ];
  10.  
  11.                         if((dirp=opendir(home))==NULL)
  12.                           {
  13.                             perror(home);
  14.                             exit(-1);
  15.                           }
  16.  
  17.            
  18.        
  19.           if((pathdest=(char *)calloc(80,sizeof(char)))==NULL)
  20.                            {
  21.                               perror(&#34;malloc&#34;);
  22.                               exit(-1);
  23.                            }
  24.  
  25.                          if((pathhome=(char *)calloc(80,sizeof(char)))==NULL)
  26.                            {
  27.                               perror(&#34;malloc home&#34;);
  28.                               exit(-1);
  29.                            }
  30.                      printf(&#34;memoria reservada&#092;n&#34;);
  31.      
  32.                     while((dir=readdir(dirp))!=NULL)
  33.                       {
  34.        
  35.                          
  36.                
  37.                printf(&#34;empezando while&#092;n&#34;);
  38.        
  39.                          duplicado=strdup(dir-&#62;d_name);
  40.  
  41.                             for(i=strlen(dir-&#62;d_name)-1;i&#62;0;i--)
  42.                                if(duplicado[i]=='~')
  43.                            {
  44.                                  
  45.                             pathhome=(char *)realloc(pathhome,((strlen(home))+((strlen(dir-&#62;d_name)))));
  46.                                   pathdest=(char *)realloc(pathdest,((strlen(destino))+((strlen(duplicado)))));
  47.              
  48.                                
  49.                                    sprintf(pathhome,&#34;%s/%s&#34;,home,duplicado);
  50.                              sprintf(pathdest,&#34;%s/%s&#34;,destino,duplicado);
  51.                                    
  52.                
  53.                                     if((fd=creat(pathdest,0666))==-1)
  54.                                 {
  55.                                 perror(pathdest);
  56.                           exit(-1);
  57.                          }
  58.            
  59.                        if((de=open(pathhome,O_RDONLY))==-1)
  60.                                      {
  61.                     perror(pathhome);
  62.                                       exit(-1);
  63.                          }
  64.                    
  65.                        if((ds=open(pathdest,O_WRONLY))==-1)
  66.                          {
  67.                                       perror(pathdest);
  68.                                       exit(-1);
  69.                                      }
  70.                      
  71.                      while((nbytes=read(de,buffer,sizeof(buffer)))&#62;0)
  72.                        if((write(ds,buffer,nbytes))!=nbytes)
  73.                                    fprintf(stderr,&#34;Error de escritura en %s&#092;n&#34;,ds);
  74.          
  75.        
  76.                         close(de);
  77.                                     close(ds);
  78.  
  79.                        if((unlink(pathhome))==-1)
  80.                         {
  81.                                       perror(pathhome);
  82.                                       exit(-1);
  83.                                     }
  84.                         // printf(&#34;petando aqui&#092;n&#34;);
  85.                                      
  86.            
  87.                         }
  88.                                //printf(&#34;hola&#092;n&#34;);
  89.                                
  90.                    printf(&#34;repitiendo while&#092;n&#34;);
  91.              }
  92.       printf(&#34;acabando&#092;n&#34;);
  93.      
  94.  
  95.   closedir(dirp);
  96.   free(source);
  97.  printf(&#34;source liberado&#092;n&#34;);
  98.   free(destdir);
  99.   printf(&#34;des liberado&#092;n&#34;);
  100.   free(pathdest);
  101.   printf(&#34;pathdest liberado&#092;n&#34;);
  102.   free(duplicado);
  103.   printf(&#34;duplicado liberado&#092;n&#34;);
  104.   free(pathhome);
  105.   printf(&#34;pathhome liberado&#092;n&#34;);
  106.   }
  107.  

El error esta en free(pathhome), ya que me peta ahi, cuando libero la memoria de pathhome. Como ven primero le asigno 80 bytes al empezar el programa, luego cada vez que se encuentra un fichero acabado en ~, le reasigno la lontigud del directorio mas la del nombre del fichero, y bueno, todo va bien hasta el momento de liberar la memoria que acaba con un:

Código: Text
  1. *** glibc detected *** ./backups: free(): invalid next size (fast): 0x0804c0c8 ***
  2. ======= Backtrace: =========
  3. /lib/i686/cmov/libc.so.6[0xb7e9b915]
  4. /lib/i686/cmov/libc.so.6(cfree+0x90)[0xb7e9f380]
  5. ./backups[0x8049092]
  6. ./backups[0x8048cb0]
  7. /lib/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e46450]
  8. ./backups[0x80487f1]
  9. ======= Memory map: ========
  10. 08048000-0804a000 r-xp 00000000 08:06 639238 /home/null/mis_programas/backups
  11. 0804a000-0804b000 rw-p 00001000 08:06 639238 /home/null/mis_programas/backups
  12. 0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
  13. b7d00000-b7d21000 rw-p b7d00000 00:00 0
  14. b7d21000-b7e00000 ---p b7d21000 00:00 0
  15. b7e15000-b7e21000 r-xp 00000000 08:02 354860 /lib/libgcc_s.so.1
  16. b7e21000-b7e22000 rw-p 0000b000 08:02 354860 /lib/libgcc_s.so.1
  17. b7e2f000-b7e30000 rw-p b7e2f000 00:00 0
  18. b7e30000-b7f77000 r-xp 00000000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  19. b7f77000-b7f78000 r--p 00147000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  20. b7f78000-b7f7a000 rw-p 00148000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  21. b7f7a000-b7f7d000 rw-p b7f7a000 00:00 0
  22. b7f89000-b7f8c000 rw-p b7f89000 00:00 0
  23. b7f8c000-b7fa8000 r-xp 00000000 08:02 354818 /lib/ld-2.7.so
  24. b7fa8000-b7faa000 rw-p 0001b000 08:02 354818 /lib/ld-2.7.so
  25. bfb95000-bfbaa000 rw-p bfb95000 00:00 0 [stack]
  26. ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
  27. Abortado
  28.  

El error es : " free(): invalid next size (fast): 0x0804c0c8", y como ven todo va bien hasta que se intenta liberar su memoria:

acabando
source liberado
des liberado
pathdest liberado
duplicado liberado



Peta ahi. La verdad no se que estoy haciendo mal, si alguien pudiera ayudarme... se lo agradeceria mucho.

Gracias de antema

Páginas: [1]