• Miércoles 12 de Marzo de 2025, 04:47

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 - Rombus

Páginas: [1]
1
GNU/Linux / GDB en Karmic
« en: Domingo 14 de Marzo de 2010, 17:17 »
Hola gente, hace unos días necesité del GDB y probando con todos los IDE's que me crucé me di cuenta que hay un bug en Ubuntu relativo al GDB.

Obtengo este error:
Citar
> aviso: GDB: Failed to set controlling terminal: Operación no permitida

Buscando no encontré la solución a este problema y no importa que IDE use, el error está en otro lado.

¿Alguna idea?

2
C/C++ / Simple Case Error
« en: Lunes 29 de Diciembre de 2008, 19:32 »
Hola gente!

estoy haciendo un programa con una sentencia switch muy extensa, y me encontre con un error bastante simple que no eh podido eliminar.

el codigo reducido al problema es este (esta hecho para wingdows):

Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main(void){
  6.     char caracter;
  7.    
  8.     printf("%dn",VK_NUMPAD0);
  9.     printf("%dnn",VK_NUMPAD9);
  10.  
  11.     printf("%dn",'1');
  12.     printf("%dnn",'9');
  13.  
  14.     printf("%dn",'A');
  15.     printf("%dnn",'Z');
  16.  
  17.     for(caracter = 0; caracter < 256; caracter++){
  18.             switch(caracter){
  19.                 case 'A'||'B'||'C'||'D'||'E'||'F'||
  20.                      'G'||'H'||'I'||'J'||'K'||'L'||
  21.                      'M'||'N'||'O'||'P'||'Q'||'R'||
  22.                      'S'||'T'||'U'||'V'||'W'||'X'||
  23.                      'Y'||'Z'||
  24.  
  25.                      '1'||'2'||'3'||'4'||'5'||
  26.                      '6'||'7'||'8'||'9'||'0':
  27.                             printf("aguante...n");
  28.  
  29.                     break;  
  30.                 case VK_NUMPAD0||VK_NUMPAD1||VK_NUMPAD2||VK_NUMPAD3||VK_NUMPAD4||
  31.                      VK_NUMPAD5||VK_NUMPAD6||VK_NUMPAD7||VK_NUMPAD8||VK_NUMPAD9:                    
  32.                         printf("..el metal!!n");                                      
  33.                     break;
  34.             }
  35.     }
  36.  
  37.     return 0;
  38. }
  39.  

el error q obtengo es el de que el valor case '1' ya ha sido utilizado.
Lo extraño , o capaz mi mal interpretacion del error, es que ninguna constante usada en los cases es 1, imprimi sus valores al comienzo del programa y demuestra que no hay valores repetidos.

sera que estoy utilizando mal la sentencia switch case?


saludos!

3
C/C++ / Asignacion de punteros
« en: Viernes 24 de Octubre de 2008, 05:18 »
Hola gente!

estoy realizando un arbol generico y me encuentro con el problema (despues de depurar bastante) que no estoy asignando bien los hijos de los nodos.


mi codigo es el siguiente, como siempre, listo para compilar:

Código: C
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4.  
  5. typedef int (*_funCmp_t)(void *a, void *b);
  6. typedef void (*_funPrint_t)(void *a);
  7.  
  8. ///Arbol
  9. typedef struct _nodo{
  10.     void *valor;
  11.     struct _nodo *iz;
  12.     struct _nodo *der;
  13. }nodo_t;
  14.  
  15. ///Estructura administrativa
  16. typedef struct {
  17.     int sizeTipo;           //Tamaño del dato a almacenar
  18.     nodo_t *raiz;
  19.     _funCmp_t funCmp;       //Funcion de comparacion
  20.     _funPrint_t funPrint;   //Funcion de impresion
  21. }arbol_t;
  22.  
  23. int comparaEnteros(void *a, void *b){
  24.     return *((int *)a) - *((int *)b);
  25. }
  26. void imprimeEnteros(void *a){
  27.     printf("lol: %d",*(int *)a);
  28. }
  29.  
  30. arbol_t *arbolCreate(int sizeTipo, _funCmp_t funCmp, _funPrint_t funPrint){
  31.     arbol_t *arbol = (arbol_t *)malloc(sizeof(arbol_t));
  32.     assert(arbol);
  33.  
  34.     arbol->sizeTipo = sizeTipo;
  35.     arbol->funCmp = funCmp;
  36.     arbol->funPrint = funPrint;
  37.     arbol->raiz = NULL;
  38.     return arbol;
  39. }
  40.  
  41. nodo_t *creaNodo(arbol_t *arbol, void *valor, nodo_t *der, nodo_t *iz){
  42.     nodo_t *nodo = (nodo_t *)malloc(sizeof(nodo_t));
  43.     assert(nodo);
  44.  
  45.     nodo->valor = valor;
  46.     nodo->der = der;
  47.     nodo->iz = iz;
  48.    
  49.     return nodo;
  50. }
  51. nodo_t *arbolInsert(arbol_t *arbol, nodo_t *nodo, void *aIngresar){
  52.     if(!nodo)
  53.         return creaNodo(arbol, aIngresar, NULL, NULL);
  54.    
  55.     if(arbol->funCmp(nodo->valor, aIngresar) > 0)
  56.         nodo->iz = arbolInsert(arbol, nodo->iz, aIngresar);
  57.     else if(arbol->funCmp(nodo->valor, aIngresar) < 0)
  58.         nodo->der = arbolInsert(arbol, nodo->der, aIngresar);
  59.     return nodo;
  60. }
  61. void printArbol(arbol_t *arbol, nodo_t *nodo){  //Preorden
  62.     if(nodo)
  63.         arbol->funPrint(nodo->valor);
  64.  
  65.     if(nodo->iz)
  66.         printArbol(arbol, nodo->iz);
  67.     if(nodo->der)
  68.         printArbol(arbol, nodo->der);
  69. }
  70.  
  71. int main(void){
  72.     arbol_t *arbol = arbolCreate(sizeof(int),comparaEnteros, imprimeEnteros);
  73.     int i = 5;
  74.  
  75.     arbol->raiz = arbolInsert(arbol, arbol->raiz, (void *)&i);
  76.     i =4;
  77.     arbol->raiz = arbolInsert(arbol, arbol->raiz, (void *)&i);
  78.     i =3;
  79.     arbol->raiz = arbolInsert(arbol, arbol->raiz, (void *)&i);
  80.     i = 7;
  81.     arbol->raiz = arbolInsert(arbol, arbol->raiz, (void *)&i);
  82.    
  83.    
  84.     printArbol(arbol, arbol->raiz);
  85.     return 0;
  86. }
  87.  

el problema creo q esta en la funcion arbolInsert(); ya que nunca entra ni en el IF ni el ELSE IF de dicha funcion, siempre termina devolviendo el return creaNodo(); lo que genera que no se forme un arbol.. siempre se inserta en la cabeza y lo que habia antes se pierde.

esto se debe a que la comparacion que contemplan los if's: arbol->funCmp(nodo->valor, aIngresar) , siempre da 0, y es porque tanto el valor que recibe como parametro nodo_t *nodo y  void *aIngresar es el mismo :O!, imprimo las direcciones de memoria y los valores y siepmre compara (por ejemplo) A con A, B con B, y en la funcion de comparacion cuando las cadenas son iguales devuelve 0.

entiendo que es lo que pasa... lo que no me sale es como arreglarlo :S


alguien sabe como evitar esto?

gracias de antemano!

4
C/C++ / Punteros A Funcion
« en: Sábado 18 de Octubre de 2008, 17:39 »
Hola gente!

estoy realizando una estructura generica de lista (sigo con mis estructuras genercias XD) y estoy teniendo un problema a la hora de implementar una funcion insertaOrdenado(); que lo que debe hacer es , justamente, insertar nodos de manera ordenada segun el campo a comparar que se le sea especificado con un puntero a funcion.


el codigo con el problema aislado es el siguiente, esta completo para poder probarlo directamente:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #define FALSE 0
  6. #define TRUE !FALSE
  7. typedef char boolean;
  8. typedef int (*list_funCmp_t)(void *a, void *b);
  9. typedef void (*list_funPrint_t)(void *a);
  10.  
  11. #define INT 0
  12. /*
  13. #define STRING 0
  14. #define CHAR 0
  15. */
  16.  
  17. typedef struct lPtr{
  18.     void *valor;
  19.     struct lPtr *next;
  20. }list_t;
  21.  
  22. typedef struct{
  23.     list_t *entrada;    //Entrada a la lista;
  24.     int sizeTipo;
  25.     list_funCmp_t funCmp;
  26.     list_funPrint_t funPrint;
  27. }listAdm_t;
  28.  
  29.  
  30. ///Funciones de COMPARACION---------------------------------------///
  31. int comparaEnteros(void *a, void *b){
  32.     return *(int *)a - *(int *)b;
  33. }
  34. int comparaCadenas(void *a, void *b){
  35.     return ((int)strcpy((char *)a, (char*)b));  //0 si son iguales, > 1 si b < a; < 1 si a < b
  36. }
  37.  
  38. ///Funciones de IMPRESION----------------------------------------///
  39. void imprimeEnteros(void *a){
  40.     printf("%d",*(int *)a);
  41. }
  42. void imprimeCadenas(void *a){
  43.     printf("%s",(char *)a);
  44. }
  45.  
  46. ///Servicios de LISTA
  47. listAdm_t *lAdmCreate(int sizeTipo, list_funCmp_t funCmp, list_funPrint_t funPrint){    //Crea La estructura administrativa
  48.     listAdm_t *listAdm = (listAdm_t *)malloc(sizeof(listAdm_t));
  49.     assert(listAdm);
  50.  
  51.     listAdm->funCmp = funCmp;
  52.     listAdm->funPrint = funPrint;
  53.  
  54.     listAdm->sizeTipo = sizeTipo;
  55.     listAdm->entrada = NULL;
  56.  
  57.     return listAdm;
  58. }
  59. list_t *creaNodo(listAdm_t *lista, list_t *pNext, void *elemento){  //necesito la estructura administrativa para el peso de dato
  60.     list_t *nodo = (list_t *)malloc(sizeof(list_t));
  61.     assert(nodo);
  62.  
  63.     nodo->valor = malloc(lista->sizeTipo);      assert(nodo->valor);
  64.     nodo->next = pNext;
  65.     memcpy((char *)nodo->valor, (char *)elemento, lista->sizeTipo);
  66.  
  67.     return nodo;
  68. }
  69. list_t *lInsertOrdered(listAdm_t *listAdm, list_t *lista, void *elemento){  //Ordenado de menor a mayor
  70.     if( !lista || (listAdm->funCmp(lista->valor,elemento)) >= 0  ){
  71.         return creaNodo(listAdm, listAdm->entrada, elemento);
  72.     }
  73.     lista->next = lInsertOrdered(listAdm, lista->next, elemento);
  74.     return lista;
  75. }
  76. void printList(listAdm_t *listAdm, list_t *list){
  77.     if(list){   //Si existe la lista
  78.         listAdm->funPrint(list->valor);
  79.         printf(" - ");
  80.         printList(listAdm, list->next);
  81.     }
  82. }
  83.  
  84. int main(void){
  85.     #ifdef STRING
  86.         char i[50] = "iber", b[50] = "jose";
  87.         listAdm_t *lista = lAdmCreate(sizeof(i), comparaCadenas,imprimeCadenas);
  88.     #endif
  89.     #ifdef CHAR
  90.         char i = 'a', b = 'g';
  91.         listAdm_t *lista = lAdmCreate(sizeof(char), comparaCaracteres,imprimeCaracteres);
  92.     #endif
  93.     #ifdef INT
  94.         int i= 6, b = 9;
  95.         listAdm_t *lista = lAdmCreate(sizeof(int), comparaEnteros,imprimeEnteros);
  96.         printf("hellon");
  97.     #endif
  98.  
  99.     lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&i);
  100.     lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&b);
  101.  
  102.     printList(lista, lista->entrada);
  103.     return 0;
  104. }
  105.  

tiene un par de ifndefs para realizarle distintas pruebas con los diferentes tipos de datos y verificar que en verdad sea generica.
ahora lo que pasa es q se queda iterando hasta un segmentation fault en el ciclo de impresion, antes habia logrado que funcione correctamente la inserta ordenado pero solo lo hacia con int's (poco generico q digamos XD).

esca esta la funcion problematica (tambien esta en el codigo anterior pero para que se vea mas directo)
Código: C
  1. list_t *lInsertOrdered(listAdm_t *listAdm, list_t *lista, void *elemento){  //Ordenado de menor a mayor
  2.     if( !lista || (listAdm->funCmp(lista->valor,elemento)) >= 0  ){
  3.         return creaNodo(listAdm, listAdm->entrada, elemento);
  4.     }
  5.     lista->next = lInsertOrdered(listAdm, lista->next, elemento);
  6.     return lista;
  7. }
  8.  

la logica creo q esta bien.
si no tengo lista, o si el valor es menor al que tengo en la lista inserto a la cabeza, sino llamo recursivamente a la funcion pasandole el siguiente elemento de la lista.


estoy dandole vueltas al codigo pero no logro decifrar el error.

espero sus comentarios!


saludos!

5
C/C++ / Problema con gcc
« en: Domingo 12 de Octubre de 2008, 04:43 »
Hola gente!

estube aberiguando sobre la funcion memcpy, ya que siempre tengo problemas de fallos de segmentacion y encontre un codigo de ejemplo en la pagina de c con clase.

el codigo es el siguiente:

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define LEN1 7
  5. #define LEN2 5
  6.  
  7. int main(void){
  8.     char a[LEN1] = "abcdefg";
  9.     char *ptr;
  10.     int i;
  11.  
  12.     memcpy(ptr, a, LEN1);
  13.    
  14.     for(i=0; i<LEN1; i++)
  15.         printf( "a[%d]=%c ", i, a[i] );
  16.        
  17.     printf("n");
  18.    
  19.     for(i=0; i<LEN2; i++)
  20.         printf( "ptr[%d]=%c ", i, ptr[i] );
  21.        
  22.     printf("n");
  23.    
  24.    return 0;
  25. }
  26.  
  27.  

deberia de andar, ya que parece bastante razonable y a parte esta en c con clase que es una pagina bastante confiable...

el problema es que en mi gcc desde ubuntu me tira un segmentation fault en el memcpy

alguien sabe a q se debe esto?

gracias de antemano!

6
C/C++ / Cola Generica
« en: Viernes 10 de Octubre de 2008, 16:49 »
Hola gente!

estoy realizando la implementacion de estructuras de datos genericas, la de pila ya la tengo y no tube mayores problemas, pero cuando llegue a la de cola se me complico un poco.

bien este es mi codigo, esta completo asi se puede pegar a un compilador o algun lugar donde se pueda leer mejor:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5.  
  6. #define FALSE 0
  7. #define TRUE !FALSE
  8.  
  9. typedef char boolean;
  10. //Cola propiamente dicha
  11. typedef struct{
  12.     void *elementos;
  13.     int size;
  14.     int head,   //Cantidad de puts();
  15.         tail;   //Cantidad de Gets();
  16. }cola_t;
  17. //Estructura Administrativa
  18. typedef struct{
  19.     cola_t *cola;
  20.     int sizeTipo;
  21. }queue_t;
  22.  
  23. queue_t *qCreate(int size, int sizeTipo){
  24.     queue_t *queue = (queue_t *)malloc(sizeof(queue_t));    
  25.     assert(queue);
  26.    
  27.     queue->cola = (cola_t *)malloc(sizeof(cola_t));    
  28.     assert(queue->cola);    
  29.     queue->sizeTipo = sizeTipo;
  30.    
  31.     queue->cola->elementos = (void *)malloc(sizeTipo * size);
  32.     assert(queue->cola->elementos);
  33.    
  34.     queue->cola->size = size;
  35.     queue->cola->head = queue->cola->tail = 0;
  36.    
  37.     return queue;
  38. }
  39. void qDestroy(queue_t *queue){
  40.     free(queue->cola);
  41.     free(queue);
  42. }  
  43. int qFull(queue_t *queue){
  44.     if(queue && queue->cola)    //Si tengo queue
  45.         return ((queue->cola->tail - queue->cola->head) == queue->cola->size);
  46.     return -1;  //No hay cola, devuelvo -1
  47. }
  48. int qEmpty(queue_t *queue){
  49.     if(queue && queue->cola)    //si tengo queue
  50.         return (queue->cola->tail == queue->cola->head);
  51.     return -1; //No hay cola    
  52. }
  53. boolean qPut(queue_t *queue, void *valor){
  54.     if(qFull(queue))
  55.         return FALSE;   //Esta llena y no puedo ingresar nada
  56.    
  57.     memcpy( (char *)(queue->cola->elementos)+(queue->cola->tail % queue->cola->size), valor, queue->sizeTipo);
  58.    
  59.     printf("Guardado: %dn",*(char *)((queue->cola->elementos)+(queue->cola->tail)));
  60.     //printf("  ingresado en: %dn",queue->cola->tail % queue->cola->size);
  61.    
  62.     queue->cola->tail++;
  63.     return TRUE;
  64. }
  65. boolean qGet(queue_t *queue, void *valor){
  66.     if(qEmpty(queue))
  67.         return FALSE;   //Esta vacia y no puedo ingresar nada
  68.     /*
  69.      * Resuelvo el problema de q los
  70.      * indices crezcan hacia el infinito
  71.      */
  72.     if(queue->cola->head > queue->cola->size){
  73.         queue->cola->head %= queue->cola->size;
  74.         queue->cola->tail %= queue->cola->size;
  75.     }
  76.    
  77.     memcpy(valor,(void*)(queue->cola->elementos)+(queue->cola->head % queue->cola->size), queue->sizeTipo);
  78.    
  79.     printf("Removido: %dn",*(int *)valor);
  80.     //printf("  removido de: %dn",queue->cola->head % queue->cola->size);
  81.    
  82.     queue->cola->head++;
  83.     return TRUE;
  84. }
  85.  
  86.  
  87. int main(void){
  88.     queue_t *queue;
  89.     int a = 3, b = 2, c,d;
  90.  
  91.     queue = qCreate(5,sizeof(int));
  92.    
  93.     qPut (queue,(void *)&a);
  94.     qPut (queue,(void *)&b);
  95.    
  96.     printf("n");
  97.    
  98.     qGet(queue,(void *)&c);
  99.     qGet(queue,(void *)&d);
  100.    
  101.     printf("n");
  102.    
  103.     printf("Extraje en el main: %dn",(char)c);
  104.     printf("Extraje en el main: %dn",d);
  105.    
  106.     qDestroy(queue);
  107.    
  108.    
  109.     return 0;
  110. }
  111.  
  112.  

mi problema es la parte de qGet(), osea, extraer elementos de la cola.
A simple vista no puedo encontrarle el error, pero de tantas pruebas que realice, me di cuenta que si casteo la variable donde guarde el valor removido de la cola a char, el resultado que obtengo es el esperado (linea 103).

Pero sinceramente no entiendo porque pasa esto, ni como hacer para que no haga falta hacer ese casteo a char.

¿tendra algo que ver con el hecho de que en la funcion qPut donde esta el memcpy lo castie a (char *) ? (linea59), aunque probe en no castearlo y dejarlo void * pero me tira un error de compilacion, desreferenciando puntero void.

7
C/C++ / Compilacion Condicional y Creacion de Librerias
« en: Jueves 9 de Octubre de 2008, 20:40 »
Hola gente!

estoy intentando hacer algo semejante a una libreria.

y averiguando me entere que con esto:

Código: C
  1. #ifndef _stdio_h
  2.     #include <stdio.h>
  3. #endif
  4. #ifndef _stdlib_h
  5.     #include <stdlib.h>
  6. #endif
  7. #ifndef _string_h
  8.     #include <string.h>
  9. #endif
  10. #ifndef _assert_h
  11.     #include <assert.h>
  12. #endif
  13.  
  14. #ifndef FALSE
  15.     #define FALSE 0
  16. #endif
  17. #ifndef TRUE
  18.     #define TRUE !FALSE
  19. #endif
  20.  

evito problemas del tipo "redefinicion de tal cosa", tanto en inclusiones de librerias como de macros.


Existe alguna forma de hacer lo mismo pero contemplando los typedefs?

Código: Text
  1. si el typedef de boolean no esta
  2. typedef char boolean;
  3. fin si
  4.  

gracias por su tiempo!

8
C/C++ / Asignacion de memoria
« en: Jueves 9 de Octubre de 2008, 17:48 »
Hola!

alguien sabe porque me esta dando un segmentation fault en la linea 16 del siguiente codigo?
uso codeblocks con gcc en ubuntu 8.04

Código: C
  1. typedef struct pila_s{
  2.     void *elementos;
  3.     int size;
  4.     int head;
  5. }pila_t;
  6.  
  7. typedef struct{
  8.     pila_t *pila;
  9.     int sizeTipo;
  10. }pilaAdm_t;
  11.  
  12. pilaAdm_t *stackCreate(int size, int sizeTipo){
  13.     pilaAdm_t *stack = (pilaAdm_t *) malloc (sizeof(pilaAdm_t));
  14.     void *elemens = (void *)malloc(size * sizeTipo);
  15.    
  16.     stack->pila->elementos = elemens;
  17.     stack->pila->size = size;
  18.     stack->pila->head = 0;
  19.     stack->sizeTipo = sizeTipo;
  20.  
  21.     return stack;
  22. }
  23.  

cuando la llamo desde el main lo hago de la siguiente forma:

Código: C
  1. int main(void){
  2.     pilaAdm_t *stack;
  3.     int n = 1;
  4.  
  5.     stack = stackCreate(n,sizeof(int));
  6.     return 0;
  7. }
  8.  
  9.  

espero que alguien me pueda ayudar

gracias!

9
C/C++ / Remover Nodo de Arbol Binario de Busqueda
« en: Martes 7 de Octubre de 2008, 17:52 »
Hola amigos!

tengo un problema intentando implementar una funcion remover, para un arbol binario de busqueda.

con un compañero planteamos este algoritmo:

Código: C
  1.  
  2. arbol_t *removerDesbalanceado(arbol_t *arbol, int valor){ 
  3.     arbol_t *aux;   
  4.  
  5.     if(!arbol) 
  6.         return NULL;
  7.  
  8.     if(arbol->contenido > valor) 
  9.         arbol->iz = removerDesbalanceado(arbol->iz,valor); 
  10.     else if(arbol->contenido < valor) 
  11.         arbol->der = removerDesbalanceado(arbol->der,valor); 
  12.     else{   //Si es igual 
  13.         if(arbol->der == NULL){ 
  14.             if(arbol->iz == NULL) 
  15.                 return NULL;    //Si no tiene hijos retorna Null 
  16.             return arbol->iz;   //sino retorna todo el subarbol izquierdo 
  17.         } 
  18.         else{ 
  19.             aux = menor(arbol->der); 
  20.             aux->iz = arbol->iz; 
  21.             aux = arbol->der; 
  22.             free(arbol); 
  23.             return aux; 
  24.         } 
  25.     } 
  26. }
  27.  
  28.  

arbol_t es la estructura de un nodo con un campo contenido y dos campos punteros de hijos:

Código: C
  1. typedef struct arbolStr{ 
  2.     int contenido; 
  3.     struct arbolStr *iz, *der; 
  4. }arbol_t;
  5.  


le pusimos removerDesbalanceado pq lo que hacemos es una vez q encontramos el nodo a remover ponemos en lugar de este, todo el arbol derecho, enlazando el nodo de mas abajo a la iz (el de menor valor) con el arbol izquierdo del nodo a remover.

se lo mostramos a otro compañero y nos dijo, que el arbol se iba a desbalancear demaciado, y que lo mejor seria: agarrar el menor del hijo derecho del arbol a remover y poner el valor de ese nodo como el valor del nodo a remover y luego hacer que el que apuntaba al nodo del cual "robamos"  el valor apunte a NULL.

entonces el arbol quedaria mucho mas balanceado y la remocion seria mas efectiva.

nuestro problema es el de hacer que el nodo que apuntaba al nodo del "robamos" el valor apunte a null.

este es nuestro codigo, no terminado, en principio copiamos la funcion de removerDesbalanceado para modificarla, quiza hay cosas que son de la otra funcion y no estan modificadas:

Código: C
  1. arbol_t *removerBalanceado(arbol_t *arbol, int valor){ 
  2.     arbol_t *a, *b; 
  3.     int cont;   
  4.  
  5.     if(!arbol) 
  6.         return NULL;   
  7.  
  8.     if(arbol->contenido > valor) 
  9.         arbol->iz = removerBalanceado(arbol->iz,valor);  
  10.     else if(arbol->contenido < valor)        
  11.         arbol->der->contenido = removerBalanceado(arbol->der,valor); 
  12.     else{       //Si es igual, osea, si encontre el nodo a remover 
  13.         if(arbol->der == NULL){ 
  14.             if(arbol->iz == NULL) 
  15.                 return NULL;        //Si no hay hijo iz ni der devuelvo null 
  16.             return arbol->iz;       //si no hay hijo der pero si iz devuelvo subarbol iz 
  17.         } 
  18.         else{ 
  19.             a = menor(arbol->der); 
  20.             cont = a->contenido; 
  21.             b = rastreaAnterior(a); //busco el que apuntaba a aux para ponerlo en null 
  22.             b->iz = NULL; //se que es el izquierdo pq cuando busco el menor siempre va a estar a la iz 
  23.             free(a);    //Libero a, osea, remuevo el nodo a remover 
  24.             return b;   //Devuelvo b que es el nodo que apuntaba  
  25.         }
  26.     } 
  27.     arbol->contenido = cont; 
  28. }
  29.  


vamos por buen camino?

como podriamos hacer la parte del else{} de la funcion anterior.



ah!, me olvidaba, en el removerBlanaceado, llamo a una funcion auxiliar que me devuelve el que apunta a un nodo en particular, le paso el nodo minimo y cuando obtengo el nodo que lo apuntaba hago q apunte a NULL, parece razonable, el problema es que me parece medio enredado, y se que debe alguna otra forma para hacerlo mas eficiente.

si alguien nos puede ayudar se lo agradecemos ;)



saludos!

10
C/C++ / Pierdo un Caracter Trabajando con ficheros
« en: Sábado 27 de Septiembre de 2008, 16:07 »
Hola gente!

tengo un problema con el siguiente codigo:

Código: Text
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define PATH "/home/rombus/Escritorio/sample.c"
  7.  
  8. #define FALSE 0
  9. #define TRUE !FALSE
  10.  
  11. #define escribeEnter(a)         fputc('n',a)
  12. #define unoParaAtraz(a)         fseek(a,(long)-1,SEEK_CUR)
  13. #define unoParaAdelante(a)      fseek(a,(long)1,SEEK_CUR)
  14.  
  15. typedef char boolean;
  16.  
  17.  
  18. boolean buscaLlave(FILE *a){
  19.     char c;
  20.    
  21.     do{
  22.         c = fgetc(a);
  23.     }while(c != '{' && c != EOF);
  24.    
  25.     if(c == EOF)
  26.         return FALSE;
  27.     unoParaAtraz(a);
  28.     return TRUE;
  29. }
  30. void limpiaString(char *a){
  31.     int i;
  32.     for(i=0; a[i] != ''; i++)
  33.         a[i] = '';
  34. }
  35. char *getLine(FILE *a){
  36.     char *l = (char*)malloc(255*sizeof(char));
  37.     int i = 0;
  38.    
  39.     do{
  40.         l[i] = fgetc(a);
  41.     }while((l[i] != 'n') && (l[i++] != EOF));
  42.     return l;
  43. }
  44. void escribeTab(FILE *a, int n){
  45.     int i;
  46.    
  47.     for(i=0; i<n; i++)
  48.         fputc('t',a);
  49. }
  50. void indenta(char *path){
  51.     FILE *b = fopen(path,"r+b");
  52.     int cont = 0;
  53.     char *aux = (char *)malloc(sizeof(char)*255);
  54.     long lastLine;
  55.    
  56.    
  57.     while(!feof(b)){
  58.         if(buscaLlave(b)){
  59.             cont++;
  60.             limpiaString(aux);
  61.             aux = getLine(b);
  62.            
  63.             if(strrchr(aux,'}')){
  64.                 cont--;
  65.                 printf("chau...n");
  66.             }
  67.             if(cont){
  68.                 printf("entro en cont mayor a 1n");
  69.                 do{
  70.                     printf("entro en el don");
  71.                     lastLine = ftell(b);
  72.                     limpiaString(aux);
  73.                     aux = getLine(b);
  74.                    
  75.                     if(strrchr(aux,'}')){
  76.                         cont--;
  77.                         printf("cont --n");
  78.                     }
  79.                     fseek(b,lastLine,SEEK_SET);
  80.                     escribeTab(b,cont);
  81.                    
  82.                     if(strrchr(aux,'{'))
  83.                         cont++;
  84.                        
  85.                     aux = getLine(b);
  86.                     if(strrchr(aux,'}')){
  87.                         cont--;
  88.                         printf("cont --n");
  89.                     }
  90.                    
  91.                     printf("cont: %dn",cont);
  92.                 }while(cont > 0 || !feof(b));
  93.             }
  94.         }
  95.         else
  96.             break;
  97.     }
  98.     fclose(b);
  99. }
  100.  
  101. int main(void){ 
  102.     indenta(PATH); 
  103.     printf("Finn");
  104.    
  105.     return 0;
  106. }
  107.  
  108.  


el fichero que lee (el indicado en PATH) es el siguiente:

Código: Text
  1. void indenta(char *path){
  2. FILE *b = fopen(path,"r+b");
  3. int cont = 0;
  4. char *aux = (char *)malloc(sizeof(char)*255);
  5. long lastLine;
  6.  
  7. while(!feof(b)){
  8. if(buscaLlave(b)){
  9. cont++;
  10. limpiaString(aux);
  11. aux = getLine(b);
  12.  
  13. if(strrchr(aux,'}')){
  14. cont--;
  15. printf("chau...n");
  16. }
  17. if(cont){
  18. printf("entro en cont mayor a 1n");
  19. do{
  20. printf("entro en el don");
  21. lastLine = ftell(b);
  22. limpiaString(aux);
  23. aux = getLine(b);
  24.  
  25. if(strrchr(aux,'}')){
  26. cont--;
  27. printf("cont --n");
  28. }
  29. fseek(b,lastLine,SEEK_SET);
  30. escribeTab(b,cont);
  31.  
  32. if(strrchr(aux,'{')){
  33. cont++;
  34. }
  35.  
  36. aux = getLine(b);
  37. if(strrchr(aux,'}')){
  38. cont--;
  39. printf("cont --n");
  40. }                  
  41. printf("cont: %dn",cont);
  42. }while(cont > 0 || !feof(b));
  43. }
  44. }
  45. }
  46. fclose(b);
  47. }
  48.  
  49.  


lo que quiero lograr es que agarre ese codigo sin indentacion y lo indente.. pero estoy perdiendo el primer caracter de cada linea cuando leo una linea y la indento, y no solo es el primero, como que se suman y a veces son dos o a veces no pierdo ningun caracter, pero la funcion de indentar no se efectua...
no puedo descubrir donde esta el error, lo sigo en papel y no lo desifro...


osea, el archivo modificado me queda:

Código: Text
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4.     nt a, b;
  5.     rintf("ingrese a y b: ");
  6.     canf("%d %d",&a,&b);
  7.     if(a > b){
  8.     rintf("no solo a es mayor a b...n");
  9. }
  10. else{
  11. printf("a es mayor a b...n");
  12. }
  13. for(b=0; b<a; b++){
  14. if(b >1){
  15. //linea;
  16. //linea;
  17. }
  18. }
  19. return 0;
  20. }
  21.  
  22.  




uno de mis problema era que no podia depurar en linux (a falta de un IDE completo), encontre el codeBlocks y lo depure...
el error es en la linea 71 con la funcion strrchr();

esto es lo que me dice mi debug:




cuando la cadena AUX vale "tn" como que queda colgado en el strrchr()...

alguien sabe a que se debe esto?, o como resolverlo?

agradesco su ayuda ;)

11
Pascal / De Romanos a Decimal, aporte para los programadores
« en: Martes 23 de Septiembre de 2008, 00:16 »
Hola gente!

estaba visitando el subforo de C y me hicieron recordar un codigo que hice el año pasado en pascal de pasar numeros de romano a decimal,
me acuerdo que lo optimice bastante y quedo bastante corto.

ya que lo encontre queria compartirlo con ustedes, capaz a alguno le venga bien

este es el codigo:


Código: Text
  1. (*lunes, 12 de mayo de 2008, 10:55:23*)
  2. (* Rombus Evil Bones                 *)
  3. program rom;
  4. const
  5.     B = 10;
  6. var
  7.     num, cont, i : integer;
  8. (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  9. procedure numRomano (a, b, c: char; num: integer);
  10. begin
  11.     case num of
  12.         9 : write(a,c);    
  13.         5..8: begin
  14.                 write (b);
  15.                 for i:= 6 to num do
  16.                     write (a);
  17.               end;
  18.         4 : write (a, b);
  19.         1..3: for i:= 1 to num do
  20.                 write (a);  
  21.     end;
  22. end;
  23. (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  24. procedure defragmenta(num : integer);
  25. begin
  26.     if num < B then
  27.         begin
  28.             case cont of
  29.                 1 : numRomano ('I','V','X',num);
  30.                 2 : numRomano ('X','L','C',num);
  31.                 3 : numRomano ('C','D','M',num);
  32.                 4 : numRomano ('M',' ',' ',num);
  33.             end;
  34.             cont := cont - 1;
  35.         end
  36.     else
  37.         begin
  38.             cont := cont + 1;
  39.             defragmenta(num div B);
  40.             defragmenta(num MOD B);
  41.         end;
  42. end;
  43. (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  44. begin
  45.     cont := 1;
  46.     write('Ingrese un num: ');  
  47.     readln(num);
  48.     defragmenta(num);
  49.     readln;
  50. end.
  51.  
  52.  


saludos!

12
C/C++ / Problema de Byte NULL con archivos
« en: Martes 16 de Septiembre de 2008, 03:13 »
Hola gente!

tengo un problema al intentar practicamente duplicar un archivo donde se cumpla una condicion, si la line del archivo es una directiva, y mas especificamente si es un include <...>.

Intento hacer un programa que posea un preset para acomodar todos los codigos fuente que me pasen o que baje de internet a mi gusto, indentados, posicion de llaves, orden, etc...

pero mi problema es que en la "duplicacion" cuando intento abrir el archivo duplicado me tira un error diciendome que en el archivo hay un byte NULL y que se abrio solo lectura.



abro el archivo en un editor Hexadecimal y efectivamente hay un byte null. (totalmente involuntario)

este es mi codigo:

Código: Text
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4.  
  5. #define PATH "/home/rombus/Escritorio/sample.c"
  6. #define TERMINADO "/home/rombus/Escritorio/prueba.c"
  7.  
  8. #define FALSE 0
  9. #define TRUE !FALSE
  10.  
  11. #define INCLUDE 1
  12. #define DEFINE  2
  13. #define UNKNOWN -1
  14.  
  15. #define STD     3
  16. #define LOCAL   4
  17.  
  18. #define hastaEOL(a)             while((fgetc(a)!= 'n') && (fgetc(a)  != EOF))
  19. #define unoParaAtraz(a)         fseek(a,(long)-1,SEEK_CUR)
  20. #define dosParaAtraz(a)         fseek(a,(long)-2,SEEK_CUR)
  21. #define unoParaAdelante(a)      fseek(a,(long)1,SEEK_CUR)
  22. #define dosParaAdelnate(a)      fseek(a,(long)2,SEEK_CUR)
  23.  
  24. typedef char boolean;
  25. typedef char macroType;
  26.  
  27. ///-Prototypes-///
  28. char *getLine(FILE *a);
  29. macroType define_o_include(FILE *a);
  30. macroType std_o_local(FILE *a);
  31. boolean esMacro(FILE *a);
  32. void comeBlancos(FILE *a);
  33. boolean saltoMacros(FILE *a);
  34.  
  35. void pasaIncludesStd(FILE *a, FILE *b, boolean *flagLocal){
  36.     long pos, inicio = ftell(a),len;
  37.     char c; //Variable de control
  38.     char *cadena = (char *)malloc(sizeof(char)*255);
  39.     macroType control;
  40.    
  41.     while(esMacro(a)){
  42.         pos = (ftell(a));      
  43.         control = define_o_include(a);
  44.         if(control == INCLUDE){
  45.             c = std_o_local(a);
  46.             if(c == STD){
  47.                 hastaEOL(a);        //Me paro al final de la linea
  48.                 len = ftell(a)-pos; //Me da la cantidad de bytes q se corrio del principio
  49.                 fseek(a,(long)pos,SEEK_SET);
  50.                 cadena = getLine(a);
  51.                 fwrite(cadena,sizeof(char),len,b);  //Tener cuidado con esto, posible nido de bugs
  52.                 printf("escribio: %s - n",cadena);
  53.             }
  54.             else if(c == LOCAL)
  55.                 (*flagLocal) = TRUE;
  56.         }
  57.         else if(control == DEFINE)  //Si es un define salto toda la linea
  58.             hastaEOL(a);       
  59.     }
  60.     fseek(a,inicio*-1,SEEK_CUR);    //Voy a donde estaba cuando me lo pasaron
  61. }
  62.  
  63. int main(void){
  64.     FILE *a = fopen(PATH,"rb");
  65.     FILE *b = fopen(TERMINADO,"wt");
  66.     boolean flagLocal = FALSE;
  67.    
  68.     pasaIncludesStd(a,b,&flagLocal);    //pasar los includes <> 
  69.    
  70.     fclose(a);
  71.     fclose(b);
  72.     return 0;
  73. }
  74.  
  75. ///-FUNCIONES-///
  76. char *getLine(FILE *a){
  77.     char *l = (char*)malloc(255*sizeof(char));
  78.     int i = 0;
  79.    
  80.     do{
  81.         l[i] = fgetc(a);
  82.     }while((l[i] != 'n') && (l[i++] != EOF));
  83.     return l;
  84. }
  85. macroType define_o_include(FILE *a){
  86.     char c =fgetc(a);
  87.    
  88.     if(c == '#')        //Por si cuando invocan la funcion no saben si es macro
  89.         c = fgetc(a);
  90.        
  91.     if(c == 'i')
  92.         return INCLUDE;
  93.     if(c == 'd')
  94.         return DEFINE;
  95.     return UNKNOWN;
  96. }
  97. macroType std_o_local(FILE *a){
  98. #define LEN_INCLUDE 8   //Largo de la palabra "#include "
  99.     int i=0;
  100.     char c = fgetc(a);
  101.        
  102.     if(c == '#')            //Si llamo a la funcion sin antes haber leido el '#'
  103.         unoParaAtraz(a);
  104.     else                    //Si llamo a la funcion antes habiendo leido el '#'
  105.         dosParaAtraz(a);
  106.        
  107.     while(i++<LEN_INCLUDE)  //Salto el "#include "
  108.         fgetc(a);
  109.        
  110.     c = fgetc(a);   //Leo el "" o el <>
  111.     printf("el caracter es: %cn",c);
  112.    
  113.     if(c == '"')
  114.         return LOCAL;
  115.     else if(c == '<')
  116.         return STD;
  117.     return UNKNOWN;
  118. }
  119. boolean esMacro(FILE *a){
  120.     char c; 
  121.    
  122.     comeBlancos(a);
  123.     c = fgetc(a);
  124.     unoParaAtraz(a);
  125.     if(c == '#')
  126.         return TRUE;   
  127.     return FALSE;
  128. }
  129. void comeBlancos(FILE *a){
  130.     char b;
  131.    
  132.     while( (b = fgetc(a)) == ' ' || b == 'n' || b == 't');
  133.     printf("salio del comeBlancos con un %cn",b);
  134.     unoParaAtraz(a);
  135. }
  136. boolean saltoMacros(FILE *a){
  137.     char c;
  138.     boolean flag = FALSE;
  139.    
  140.     do{
  141.         if(flag)            //Leo toda la linea una vez que leyo el primer caracter
  142.             hastaEOL(a);
  143.         else
  144.             flag = TRUE;    //Cuando es la primera vez habilito la bandera
  145.            
  146.         comeBlancos(a);
  147.         c = fgetc(a);
  148.     }while(c =='#');
  149.     unoParaAtraz(a);
  150.     return FALSE;   //Terminaron los macros
  151. }
  152.  


si alguien me puede dar alguna pista, se lo agradesco.


saludos!

EI: Juntando mensajes.

nadie sabe en que momento es que estoy escribiendo el byte NULL?


me di cuenta que donde el archivo se corta a la mitad debido a este byte NULL es cuando en el archivo fuente, osea el archivo que estoy duplicando hay un "n", un enter.

13
Otras Bases de Datos / Normalizacion
« en: Domingo 14 de Septiembre de 2008, 20:23 »
Hola!

tengo una duda sobre la normalizacion de relaciones.
cuando como fruto de una normalizacion me quedan dos relaciones 1 a 1, es correcto?

o en esos casos es pq ya estaba normalizado y no hacia falta la normalizacion?



gracias!

14
C/C++ / funcion system en linux
« en: Domingo 24 de Agosto de 2008, 17:08 »
hola gente!

estoy haciendo un programa que compare dos directorios y diga si son iguales o no, y si no lo son que muestre la ruta del/los archivo/s que difieren, para hacerlo pense en usar la funcion system que recibe una cadena como parametro y la ejecuta como si estubieras en la terminal, pero al hacerlo (trabajo bajo ubuntu 8.04) me tira errores, o simplemente me duestra el directorio raiz y no el directorio que le digo. Viendo esto, pense en emular simplemente una terminal (para eliminar cualquier problema ajeno a esa funcion) y sigo teniendo el mismo problema.

Código: Text
  1. #include <stdlib.h>
  2.  
  3. int main (void){
  4.     system("cd /home");
  5.     system("dir > /home/rombus/Escritorio/aaa.txt");
  6.  
  7.     return 0;
  8. }
  9.  

En el codigo anterior lo que pretendo es hacer un cd al directorio /home y luego hacer un dir redireccionando la entrada/salida estandar a un fichero que esta en mi escritorio. Lo que obtengo es el fichero con los directorios del escritorio (donde esta el programa) no los directorios del /home.

Alguien sabe a que se puede deber este problema?


gracias!

Páginas: [1]