• Sábado 12 de Julio de 2025, 12:55

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.


Mensajes - Leber

Páginas: 1 [2] 3
26
C/C++ / Re: Problema de novato con clases
« en: Miércoles 13 de Abril de 2011, 18:33 »
Puedes leerlos a traves de comparaciones para saber cual esta seleccionado, o puedes mostrar su valor (aunque el valor sera un entero que no te servira de mucho).
Mira, aquí te dejo un ejemplo:


Código: C
  1. #include <stdio.h>
  2.  
  3. enum {
  4.         FUET,
  5.         CHORIZO,
  6.         QUESO
  7.         }embutido;
  8.  
  9. int main(int argc, char **argv)
  10.  
  11. {
  12.  
  13.     embutido = FUET;
  14.  
  15.         printf("%dn", embutido);
  16.  
  17.         switch( embutido ) {
  18.  
  19.             case FUET:      printf("Fuetn");
  20.                             break;
  21.  
  22.             case CHORIZO:   printf("Chorizon");
  23.                              break;
  24.  
  25.             case QUESO:     printf("Quesoon");
  26.                              break;
  27.  
  28.         }
  29.  
  30.         return 0;
  31. }
  32.  

27
C/C++ / Re: Casteos "raros" en C
« en: Martes 12 de Abril de 2011, 13:41 »
Cita de: "m0skit0"
El asterisco de más es para recoger el valor al que apunta el puntero. Esto viene en cualquier libro de C  :P

Si, eso si que lo se, simplemente me lie con el ( tipo *).

saludos  ^_^

28
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

29
ASM (Ensamblador) / Re: Problema al linkar en 32bits (estando en 64)
« en: Viernes 8 de Abril de 2011, 13:44 »
Entonces supongo que tendré que instalarme un SO de 32bits. Yo creía que diciendole que generara código de 32bits podía salvar esto.

Gracias por responder  ^_^

30
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

31
C/C++ / Re: estrucutras, punteros
« en: Jueves 7 de Abril de 2011, 23:52 »
En verdad, mi compilador casi se rompe. Tu código contenía bastantes erratas de sintaxis.
Faltaban ";" , habías puesto mail en lugar de email. una P cuando tenia que ser p, el prototipo de la función nuevonodo estaba incompleta.

Despues de corregir eso, tu código queda así:

A mi me lanza un error porque no tengo la libreria conio (que no es estandart):

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5.  
  6. struct agenda{
  7.     char nombre [50];
  8.     char telefono[25];
  9.     char email[50];
  10.     };
  11.     struct nodo{
  12.         struct agenda dato;
  13.         struct nodo *proximo;    
  14.         } ;
  15.    
  16.     struct nodo *nuevonodo(void);
  17.            int colavacia(struct nodo *);
  18.     struct nodo *creacola (struct nodo *, struct agenda);
  19.    
  20.     void mostrar (struct nodo *);
  21.    
  22.     void main()
  23.     {
  24.         struct nodo *pri=NULL, *ult=NULL;
  25.         struct agenda x;
  26.        
  27.         printf ("ingrese nombre: ");
  28.         gets(x.nombre);
  29.         while (strcmp(x.nombre, "fin"))
  30.    
  31.     {
  32.         printf ("ingrese telefono: ");
  33.         gets (x.telefono);
  34.         printf ("ingrese mail: ");
  35.         gets(x.email);
  36.         ult=creacola(ult,x);
  37.         if (pri==NULL) pri=ult; //si es la 1 pasada pongo en pri el valor del primer nodo
  38.         printf ("ingrese nombre: ");
  39.         gets(x.nombre);
  40.     }
  41.     if (colavacia(pri)==1)
  42.     {
  43.     printf ("No se ingresaron registros");getch();
  44.     }
  45.     else mostrar(pri);
  46.    
  47.     }
  48.     struct nodo *nuevonodo()
  49.     {
  50.         struct nodo *p;
  51.         p=(struct nodo *)malloc(sizeof(struct nodo));
  52.         if(p==NULL)
  53.         {
  54.             printf ("memoria ram llena");
  55.             getch();
  56.             exit(0);
  57.         }
  58.         return p;
  59.     }
  60.    
  61.     struct nodo *creacola(struct nodo *ult, struct agenda x)
  62.     {
  63.         struct nodo *p;
  64.         p=nuevonodo();
  65.         (*p).dato=x;
  66.         (*p).proximo=NULL;
  67.         if(ult!=NULL) (*ult).proximo=p; //si hay nodo anterior en prox pongo la direccion del nodo actual
  68.         return p;
  69.     }
  70.    
  71.     int colavacia(struct nodo *pri)
  72.     {
  73.         if(pri==NULL) return 1;
  74.         else
  75.         return 0;
  76.     }
  77.    
  78.     void mostrar (struct nodo *pri)
  79.     {
  80.         struct nodo *aux;
  81.        
  82.     while(pri!=NULL)
  83.     {
  84.         printf("Nombre: %s - telefono: %s - Mail: %s n",
  85.         pri->dato.nombre,pri->dato.telefono,pri->dato.email);
  86.         aux=pri;
  87.         pri=(*pri).proximo;
  88.         free(aux);
  89.     }
  90. }
  91.  

32
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

33
C/C++ / Re: Problemilla con Estructuras?
« en: Martes 5 de Abril de 2011, 14:23 »
Tu código tiene bastantes errores, y son más de atención que no de otra cosa.

Por empezar:

Código: C
  1. typedef struct datos
  2.  

Esto no sirve de nada si luego haces esto:

Código: C
  1. typedef struct datos{
  2.         char nombre[13];
  3.         char apellido[13];
  4.         int edad;
  5.         char sexo;
  6.         float altura;
  7. }inf_datos;
  8.  

Para coger cadenas con scanf, se hace:

Código: C
  1. scanf("%s",alumno[i].apellido);
  2.  

Y no:

Código: C
  1. scanf("%s",&alumno[i].apellido);
  2.  

Luego, el campo sexo es de 1 byte, y tu estas cogiendo como una cadena de bytes:

Código: C
  1. scanf("%s",&alumno[i].sexo);
  2.  

Debería ser:

Código: C
  1. scanf("%c",&alumno[i].sexo);
  2.  

Añadiendole más leña:

Código: C
  1. printf("nEl Nombre del Alumno es: %s",alumno[j].edad);
  2.  

edad es de tipo entero, por qué lo muestras como si fuera una cadena?

Creo que deberías coger un libro y mirartelo un poco, ya que son errores de no prestar atención.

Saludos

34
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 17:35 »
Bueno, me refería a que cuando leia los tutoriales que mostraban como usar hilos con pthreads, no vi que las variables que usaban los distintos hilos fuesen volatile.

35
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 17:02 »
Hostia, pues que raro, en ninguno de los manuales que lei acerca de hilos en POSIX hablaban acerca de esto.

36
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 16:24 »
Yo había he usado hilos, en códigos mios para aprender, y si que se que para modificar secciones críticas lo mejor es bloquear el mutex y luego desbloquearlo, lo que no sabía es que las variables debían ser volatiles.

Saludos

37
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 14:42 »
Cita de: "m0skit0"
Aún así estás usando multihilo o multiproceso, aunque sea de forma transparente

Igualmente estoy casi convencido que lo hará con hilos u otro proceso si no necesita acceder a la memoria/código de tu proceso.

Segun tengo entendido, los hilos a diferencia de los procesos, comparten memoria y código, no? Así que no habría mucho problema si un hilo auxiliar necesita modificar, por ejemplo, una variable global.

38
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 14:27 »
Hola rfog.

Si, entiendo como funciona una callback, lo que me mantiene un poco más en vilo es como la función logra desvincularse para hacer su tarea en segundo plano. Son un poco manias mias, ya seguiré investigando.

Gracias por la información =)

39
C/C++ / Re: Programación Asíncrona
« en: Viernes 1 de Abril de 2011, 14:03 »
Si, como yo tampoco lo tengo estoy un poco jodido xD, pero bueno, era más que nada para saber. Había leido que una forma sencilla era implementarlo con hilos, pero no me imagino una manera de hacer algo asíncrono sin hilos, quiero decir, si una aplicacion es ejecutada secuencialmente, no lo veo muy viable.

Gracias  ^_^

40
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

41
C/C++ / Re: Memoria intermedia vs disco
« en: Viernes 1 de Abril de 2011, 10:35 »
Si, algo lei acerca de esto, sobre el buffer cache y las llamadas a fsync para escribir a disco la información que todavía este en el buffer.

Gracias m0skito  ^_^

42
C/C++ / Re: Memoria intermedia vs disco
« en: Viernes 1 de Abril de 2011, 10:22 »
Uhm, más o menos sabía que iba por aquí el asunto, pero no acaba de afinarlo.

Entonces, es más rápido llenar un array, esperar a que este completo, y luego escupir todo esto a disco, que ir byte por byte, hasta ahi más o menos lo tengo claro.
Lo que ocurre es que me estoy liando.

Las llamadas al sistema, por ejemplo write y read, supongo que también trabajan con este tipo de memoria intermedia. Al fin y al cabo, se puede decir que un programa que no trabaje con memoria intermedia, sería tal que así:

Código: C
  1. read(0, buffer, 1);
  2.  

Y uno que si:

Código: C
  1. read(0, buffer, 1024);
  2.  

Gracias por responder

43
C/C++ / Re: Memoria intermedia vs disco
« en: Jueves 31 de Marzo de 2011, 00:26 »
Edite la primera entrada, ya que me di cuenta que lo habia explicado de un modo bastante horrible  :no:

44
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

45
C/C++ / Re: Como Evitar error ....
« en: Martes 29 de Marzo de 2011, 23:39 »
Quizá quieras ayudarte de fgets y sscanf, van bastante mejor, al menos en mi experiencia, y no son tan propensos a errores como scanf.

Saludos

46
C/C++ / Re: lista ordenada
« en: Martes 29 de Marzo de 2011, 23:28 »
Si no sabes cuantas listas tendrás, puedes hacer con edd (estructuras de datos dinámicas)
Algo asi:

Código: C
  1. struct ficha {
  2.     char nombre[20];
  3.     char apellido[20];
  4.     unsigned int nota;
  5.     struct ficha *next;
  6. };
  7.  

Si lo sabes, puedes hacer un array de estructuras.
Después de entrar todas las fichas que necesites, puedes ordenarlo:

Algo como esto:

Código: C
  1. if (ficha[0].nota > ficha[1].nota) {
  2.       ficha_auxiliar = ficha[1];
  3.       ficha[1] = ficha[0];
  4.       ficha[0] = ficha_auxiliar;
  5.   }
  6.  

Ficha auxiliar sería un tipo de ficha temporal, usarlo solo como auxiliar. Ese método seria por bubblesort, que aunque no es el más eficiente, sirve para esto.

Saludos

47
C/C++ / Re: Ascii + arrowkeys
« en: Lunes 28 de Marzo de 2011, 16:23 »
Uhm, no habia caido en eso. Como lo has sabido?

Gracias  ^_^

48
C/C++ / Re: Ascii + arrowkeys
« en: Lunes 28 de Marzo de 2011, 14:08 »
El código de tecla si, es igual, me referia al de escape. Dicen que a veces se antepone un 0, o a veces un 27.

No se, pense que igual que podía capturar la tecla ESC, la tecla +, el espacio, (estos tres no me dan ningun problema), podría hacer lo mismo con las arrowkeys.
Estaba usando GTK para la interfaz, y tiene eventos para capturar teclas, no hay problema, es lo que estoy usando, más que nada era curiosidad de saber como las recupera el.

Gracias por responder

49
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

50
C/C++ / Re: Confundido con código en C
« en: Viernes 25 de Marzo de 2011, 18:43 »
En verdad, puedes hacer algo asi.

Imagina que tienes un array de enteros,: int numeros[100]

Código: C
  1. Bucle {
  2.    Lees el numero
  3.    si es 0 salimos del bucle
  4.    }
  5.  

Dado que necesitamos mínimo dos números, si hemos introducido menos salimos del programa.

Si no, continuamos. Entonces, podemos sumar los dos primeros números del array,
  • + [1], y a partir de ahí sumas o restas dependiendo del indice del bucle.

Dado que hemos sumado los dos primeros, el tercero se restaría, el 4 se sumaria.

Yo lo haría según el resto que de el indice del segundo bucle % 2.

Ejemplo:

Código: C
  1. indice2 < numero_total_de_numeros_entrados
  2. si indice %2 != 0
  3.   restamos el numero
  4. si indice %2 == 0
  5.   sumamos el numero
  6.  

No se si me he explicado bien, estoy algo cansado pero espero que te sirva mas o menos

Saludos

Páginas: 1 [2] 3