• Domingo 22 de Diciembre de 2024, 12:39

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

Páginas: 1 [2] 3 4 5
26
C/C++ / Re: Cola Generica
« en: Viernes 17 de Octubre de 2008, 21:50 »
ah! por eso no lo habia visto jeje


uso C

al doble puntero entonces


saludos!

27
C/C++ / Re: Cola Generica
« en: Viernes 17 de Octubre de 2008, 18:28 »
ah, con eso te referias a "pasado como referencia a puntero"?

nunca habia visto algo asi :O

la implementacion quedaria igual? o deberia cambiarla como si fuera doble puntero, osea asi:

Código: C
  1.  void qDestroy(queue_t *&queue){
  2.      free((*queue)->cola);
  3.      free( (*queue) );
  4.     (*queue) = NULL;
  5.  }
  6.  

28
C/C++ / Re: Cola Generica
« en: Viernes 17 de Octubre de 2008, 16:35 »
ah!..


lo q dices es q deberia ser

Código: Text
  1. void qDestroy(queue_t **queue)
  2.  

para q tenga sentido la asignacion?

29
C/C++ / Re: funciones retorno por puntero y return
« en: Viernes 17 de Octubre de 2008, 05:00 »
me parece perfecto q me hagas esas preguntas   :beer:

hay otra que capaz te interese (si es que no lo habias entendido) que es esta:

Código: Text
  1. (*prom)= (float)sum / (float)p;
  2.  

primero q nada *prom entre parentesis para indicarle que quieres asignar el resultado del promedio en lo q tiene la direccion a la q apuntas, y no en el lugar donde dice a q direccion apuntar.

Luego casteo tanto sum y p a (float).

Supongamos este codigo:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = a / b
  5.  

el resultado guardado en c seria 2.0000000, cuando lo logico hubiera sido un 2.5000000

entonces piensas "claro debo castear el resultado de a / b a float pq son enteros, el codigo quedaria asi:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = (float)(a / b)
  5.  

y el resultado obtenido seria el mismo q antes! :O


pq el resultado de dividir el entero 5 con el entero 2 es 2 casteado a float es 2.0000000

por eso debes hacer un:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = (float)a / (float)b
  5.  



la funcion main es una funcion como cualquier otra (con algunas particularidades) osea puede ser tanto void como int, como cualquier funcion... pero si es int debe devolver algo, un int presisamente, yo lo cambie a int main (void) y el return 0 pq uso linux y en mi compilador me tira un warning, lo q no significa q de la otra forma este mal.

el (void) significa que esa funcion no recibe parametros



y borre la conio.h y los clrscr() pq al usar linux no tengo la conio.h de borland, y el getch() se puede reemplazar por el getchar() de stdio.h q es ANSI.

una funcion solo puede devolver mediante el return un solo valor
por lo que hacer lo q quieres es medio dificil.
lo q puedes hacer es devolver un arreglo donde cada posicion tenga un dato, pero el arreglo tiene todos los elementos de un mismo tipo asique no podrias devolver dos ints y un float


si tienes mas dudas solo pregunta ;)>

30
C/C++ / Re: funciones retorno por puntero y return
« en: Viernes 17 de Octubre de 2008, 04:22 »
:beer:


odio q usen la conio.h para hacer getch() y clrscr()
 :devil:

31
C/C++ / Re: funciones retorno por puntero y return
« en: Viernes 17 de Octubre de 2008, 04:15 »
oka


a q te refieres con la linea 36


para q es ese puntero aumentado, bah.. para q deberia ser, pq no esta usado, al igual q el vector v


fijate q en la funcion ingreso al final haces:     *prom=(sum/p);
sum es una variable por parametro, y cuando la pasas pasas basura pq prom no esta inicializada, y dentro de la funcion haces sum=sum+matriz1[j];  osea a basura le dejo basura + matriz[j] XDXD





ah! ya entendi para q haces *k++, pero la forma en q lo haces es incorrecta
*k++ le suma uno a el puntero k y dsp hace *
y lo q quieres no es sumarle uno a la direccion donde apunta K sino al valor de dentro entonces debes hacer

Código: Text
  1. (*k)++;
  2.  


otro error es el de no inicializar p en 0

Código: Text
  1. p++;
  2.  

p vale basura, asique basura ++ XD




ten cuidado con las no inicializaciones de las variables


Código: C
  1. #include<stdio.h>
  2.  
  3. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom);
  4.  
  5. int main(void){
  6.     int m1[10][10],m2[10][10],/*v[20],*/m,n,sum = 0,k=0;
  7.     float prom=0;
  8.  
  9.     printf("ingrese el tama¤o de la matrizn");
  10.     scanf("%d",&m);
  11.     scanf("%d",&n);
  12.    
  13.     //sum vale basura
  14.     ingreso(m1,m2,m,n,sum,&k,&prom);
  15.    
  16.     printf("la cantidad de n no multiplos son %dn",k);
  17.     printf("el promedio es %fn",prom);
  18.     getchar();
  19.     return 0;
  20. }
  21. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom){
  22.     int i,j,p = 0;
  23.    
  24.     for(i=0;i<m;i++){
  25.         for(j=0;j<n;j++){
  26.             printf("ingrese los numeros a la matrizn");
  27.             scanf("%d",&matriz1[i][j]);
  28.         }
  29.     }
  30.    
  31.     for(i=0;i<m;i++){
  32.         for(j=0;j<n;j++){
  33.             if(matriz1[i][j]%7==0){
  34.                 matriz2[i][j]=matriz1[i][j];
  35.             }
  36.         }
  37.     }
  38.    
  39.     for(i=0;i<m;i++){
  40.         for(j=0;j<n;j++){
  41.             if(matriz1[i][j]%7!=0){
  42.                 sum +=matriz1[i][j];
  43.                 (*k)++;
  44.                 p++;
  45.             }
  46.         }
  47.     }
  48.     (*prom)= (float)sum / (float)p;
  49.  }
  50.  

32
C/C++ / Re: funciones retorno por puntero y return
« en: Viernes 17 de Octubre de 2008, 03:56 »
Cita de: "crocop"
tengo que devolver los 2 valores en el main principal y no por funcion osea ,   1 puntero y el otro por return.

estem...

devolver dos valores en el main?

o devolverlos de una funcion al main?

33
C/C++ / Re: Cola Generica
« en: Jueves 16 de Octubre de 2008, 20:08 »
uhhhh!

el_uni muchas gracias!!!

ese error me estaba limando la cabeza, lo peor de todo es que hice un stack generico (el que adjunte mas arriba) y lo tube en cuenta a eso, despues ayude a un amigo a hacer uno y no andubo, lo revise y era por ese mismo error, nunca se me hubiera ocurrido buscarlo en esta, ya estaba muy saturado XD


y agregue tambien el queue = NULL; en la qDestroy, esta bueno, en teoria evitas fallos de segmentacion, ya que en una condicion como esta
Código: Text
  1. if(queue)
  2.  

al haber hecho el queue = NULL no entraria :D


 :beer: gracias nuevamente!!


saludos ;)

34
C/C++ / Re: porgrama para hacer diagramas de flujo
« en: Jueves 16 de Octubre de 2008, 16:01 »
q copado, la idea de un programa q haga diagramas de flujo a partir de codigo me parecia media utopica.

habria q hacer uno al revez. de diagrama de flujo a C xD

35
C/C++ / Re: Cola Generica
« en: Jueves 16 de Octubre de 2008, 15:12 »
jaja, si leer codigo ageno es todo un tema XD

ta dificil el problema :S


buenisimo!

me gustaria ver el vector generico si no te es molestia :D


espero tus comentarios  :beer:

36
C/C++ / Re: Cola Generica
« en: Jueves 16 de Octubre de 2008, 14:54 »
claro, es parcticamente lo mismo no?

si :D

tu haces:
Código: Text
  1. c->datos+((c->primero+c->usados++)%c->tam
  2.  

y el mio es:
Código: Text
  1. (queue->cola->elementos))+(queue->cola->tail % queue->cola->size)
  2.  


el codigo esta todo completo y listo para compilar, hay un par de printf's como dije mas arriba que me dan valores re confusos

seguro si comparas tu cola generica con la mia vas a descubrir el error facilmente, habiendolo implementado igual : D
en internet no hay nada de documentacion con colas implementadas asi :S, por lo menos yo no encontre


saludos!

37
C/C++ / Re: porgrama para hacer diagramas de flujo
« en: Jueves 16 de Octubre de 2008, 14:26 »
"atraves del codigo en c++ haga el diagrama de flujo"

esos programas hacen eso?

o uno tiene que hacer los diagramas?

para hacer diagramas yo uso el Dia, no se si esta para windows, pero es re util pq soporta miles de diagramas, ERD, modelo Relaciona, Diagrama de Flujo, Automatas Finitos, etc..


saludos

38
C/C++ / Re: Cola Generica
« en: Jueves 16 de Octubre de 2008, 14:21 »
hola el_uni!

gracias por tomarte el tiepo para leer mi problema.


es interesante tu pregunta ya que en la implementacion que estoy realizando el head y el tail no son la posicion del ultimo y el primer elemento, sino que son la cantidad de puts y la cantidad de gets respectivamente. esto me da la libertad de hacer una cola circular tan sencillamente como con esta instruccion:

Código: C
  1. memcpy( ((char *)(queue->cola->elementos))+(queue->cola->tail % queue->cola->size), valor, queue->sizeTipo);
  2.  

capaz se ve mejor de esta manera:

Código: C
  1. queue->cola->elementos[queue->cola->tail % queue->cola->size]
  2.  


vi investigando en internet gente que realiza colas que son simplemente listas ligadas que ademas tienen un head y tail, esta bueno eso... pero queria que me ande con esta metodologia.

aparte hice el stack generico (lo dejo adjunto por si a alguien le interesa  :D) y no tube mayores problemas.

le di muchas vueltas, sinceramente no se donde esta el error, seguramente es algun problema como dijo moskito, algun puntero algun cast.


espero que me puedan ayudar :D


saludos!

39
C/C++ / Re: Cola Generica
« en: Martes 14 de Octubre de 2008, 15:39 »
uh buenisimo!

gracias moskito, espero tu respuesta :comp:

40
C/C++ / Re: Problema con gcc
« en: Lunes 13 de Octubre de 2008, 19:32 »
si la verdad...

voy a ver si me puedo poner en contacto para que lo corrigan


gracias por las respuestas! :good:

41
C/C++ / Re: Cola Generica
« en: Lunes 13 de Octubre de 2008, 19:20 »
hola moskito!

gracias por responder ;)


la cola generica que hice anda bien, pero no anda como deberia andar, bah... mejor dicho, no anda como yo quiero que ande.

estube probando mas formas y termine creo con el mismo codigo pero con un par de printf's que meustran cosas que sinceramente no entiendo que son.

hice esta prueba:

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.     valor = (void *)valor;
  59.    
  60.     printf("Guardado: %dn",*( ((char*)(queue->cola->elementos))+(queue->cola->tail)) );
  61.     //printf("  ingresado en: %dn",queue->cola->tail % queue->cola->size);
  62.    
  63.     queue->cola->tail++;
  64.     return TRUE;
  65. }
  66. boolean qGet(queue_t *queue, void *valor){
  67.     if(qEmpty(queue))
  68.         return FALSE;   //Esta vacia y no puedo ingresar nada
  69.     /*
  70.      * Resuelvo el problema de q los
  71.      * indices crezcan hacia el infinito
  72.      */
  73.     if(queue->cola->head > queue->cola->size){
  74.         queue->cola->head %= queue->cola->size;
  75.         queue->cola->tail %= queue->cola->size;
  76.     }
  77.    
  78.     memcpy(valor,((char *)(queue->cola->elementos))+(queue->cola->head % queue->cola->size), queue->sizeTipo);
  79.    
  80.     printf("Removido: %dn",*((char *)(queue->cola->elementos))+(queue->cola->head % queue->cola->size));
  81.     //printf("en exa: %0xn",valor);
  82.     //printf("  removido de: %dn",queue->cola->head % queue->cola->size);
  83.    
  84.     queue->cola->head++;
  85.     return TRUE;
  86. }
  87.  
  88.  
  89. int main(void){
  90.     queue_t *queue;
  91.     int a = 15, b = 22, c,d;
  92.  
  93.     queue = qCreate(5,sizeof(int));
  94.    
  95.     qPut (queue,(void *)&a);
  96.     qPut (queue,(void *)&b);
  97.    
  98.     printf("n");
  99.    
  100.     qGet(queue,(void *)&c);
  101.     qGet(queue,(void *)&d);
  102.    
  103.     printf("n");
  104.    
  105.     printf("El primer valor que extraje fue : %dn",c);
  106.     printf("Ese mismo valor mostrado antes pero casteado a (char) : %dn",(char)c);
  107.    
  108.     printf("el segundo valor que extraje fue: %dn",d);
  109.    
  110.    
  111.     qDestroy(queue);
  112.    
  113.    
  114.     return 0;
  115. }
  116.  
  117.  


Descripcion de lo que obtengo

puse printf's en la funcion qPut para ver que los valores insertados en la pila sea correctos y descartar la posibilidad de la carga de valores erroneos.

el resultado de esos printf's en mi prueba fueron los correctos 15 y 22 como le dije q lo haga

despues puse printf's en la qGet para ver si lo que remuevo es correcto, y obtengo 15 y 16, osea, el primer valor es correcto, yo ingrese 15 y removi 15, pero el segundo valor es incorrecto, yo ingrese 22 como segundo valor pero remuevo 16 :S.

y finalmente puse printf's en el main de la variable que agarra los valores que remueve la qGet y obtengo esto: 5647 y 22, osea al revez que antes, el primer valor es erroneo (esperaba un 15), y el segundo valor es correcto.


por alguna razon, se me ocurrio castear la variable donde guardo el valor que saca el qGet a char (solo la primera vez q imprime, ya que la segunda vez obtengo el resultado esperado) y magicamente andubo!

el problema es que no entiendo que es lo q pasa, deberia darme los valores correctos sin tener que hacer el cast.

no parece muy generico el hecho de tener que adivinar a q variable hacerle el cast y a cual no :S


espero que me puedas ayudar

gracias!

42
C/C++ / Re: Problema con gcc
« en: Lunes 13 de Octubre de 2008, 02:08 »
esta acà: http://www.conclase.net/c/librerias/fun ... fun=memcpy

yo le agregue un par de cosas para ver si funcionaba, pero el codigo en si es el mismo.
carece de la asignacion.

habia otro tambien q me daba error...

ahora no me acuerdo cual era.


si, tiene sentido pensar q no ande en ningun lado, pq estas asignando algo a ul lugar de memoria que es basura.

habria que mandarles un mail o comunicarse de alguna forma para que lo arreglen los de c con clase, que tiene toda la onda esa pag XD

43
C/C++ / Re: Problema con gcc
« en: Domingo 12 de Octubre de 2008, 23:18 »
ahh!!

y sigo con el problema de asignarle cosas a memoria no definida XD


che, pero que mal los de C con clase al poner ese codigo.

o en otros compiladores anda?

gracias por las respuestas!!

44
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!

45
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.

46
C/C++ / Re: Compilacion Condicional y Creacion de Librerias
« en: Viernes 10 de Octubre de 2008, 15:54 »
Gracias diego.martinez!, la directiva #ifndef al parecer es muy amplia XD


Malik, me explico mejor ;) :


supongamos que quieres crear una libreria que sume numeros, es muy probable que debas incluir la libreria math.h (muy probalbe no, seguro la incluyes), entonces desde tu programa incluyes la stdio.h y la math.h pq tambien quieres realizar algunas operaciones matematicas.

si despues de haber hecho #include <math.h> haces el include de tu libreria, que tambien llama a la math.h sin haberlo premeditado obtendras un error de redefinicion, osea, el compilador te dira que tienes dos funciones con el mismo nombre, algo que es incorrecto.

en cambio si en tu libreria contemplas ese caso preguntando si ya esta incluida la math.h no la incluis, sino si la incluyes.
evitando ese problema.

espero haberme explicado

saludos!

47
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!

48
C/C++ / Re: Asignacion de memoria
« en: Jueves 9 de Octubre de 2008, 19:33 »
esa!

ahi quedó

era ese (basicamente) mi problema, como la invocaba a la funcion no le estaba pasando la direccion de memoria.

aca tengo el codigo para probarlo que quedo andando:

Código: C
  1.  
  2. #include <stdio.h>
  3. /*
  4.  * Servicios de Pila:
  5.  *
  6.  *      pilaAdm_t *stackCreate(int size, int sizeTipo);
  7.  *
  8.  *      void stackDestroy(stack_t *pila);
  9.  *
  10.  *      boolean push(pilaAdm_t *stack, void *elemento);
  11.  *
  12.  *      boolean pop(pilaAdm_t *stack, void *elemento);
  13.  *
  14.  *      stackEmpty(pila);
  15.  *
  16.  *      stackFull(pila);
  17.  *
  18.  */
  19. #ifndef _stdio_h
  20.     #include <stdio.h>
  21. #endif
  22. #ifndef _stdlib_h
  23.     #include <stdlib.h>
  24. #endif
  25. #ifndef _string_h
  26.     #include <string.h>
  27. #endif
  28.  
  29. #ifndef FALSE
  30.     #define FALSE 0
  31. #endif
  32. #ifndef TRUE
  33.     #define TRUE !FALSE
  34. #endif
  35.  
  36. #define stackEmpty(pila)    pila->head == 0
  37. #define stackFull(pila)     pila->head == pila->size
  38.  
  39. typedef char boolean;
  40.  
  41. typedef struct{
  42.     void *elementos;
  43.     int size;
  44.     int head;
  45. }pila_t;
  46.  
  47. typedef struct{
  48.     pila_t *pila;
  49.     int sizeTipo;
  50. }pilaAdm_t;
  51.  
  52. pilaAdm_t *stackCreate(int size, int sizeTipo);
  53. void stackDestroy(pilaAdm_t *pila);
  54. boolean push(pilaAdm_t *stack, void *elemento);
  55. boolean pop(pilaAdm_t *stack, void *elemento);
  56.  
  57. pilaAdm_t *stackCreate(int size, int sizeTipo){
  58.     pilaAdm_t *stack = (pilaAdm_t *) malloc (sizeof(pilaAdm_t));
  59.  
  60.     stack->pila = (pila_t *) malloc (sizeof(pila_t));
  61.     stack->pila->elementos = (void *) malloc (sizeTipo * size);
  62.     stack->pila->size = size;
  63.     stack->pila->head = 0;
  64.     stack->sizeTipo = sizeTipo;
  65.  
  66.     return stack;
  67. }
  68. void stackDestroy(pilaAdm_t *stack){
  69.     free(stack->pila->elementos);
  70.     free(stack);
  71. }
  72. boolean push(pilaAdm_t *stack, void *elemento){
  73.     if(!stack->pila || stackFull(stack->pila))
  74.         return FALSE; //si no hay pila o esta esta llena no puedo insertar
  75.  
  76.     memcpy((char *)stack->pila->elementos + (stack->sizeTipo * stack->pila->head++), elemento,stack->sizeTipo);
  77.  
  78.     return TRUE;
  79. }
  80. boolean pop(pilaAdm_t *stack, void *elemento){
  81.     if(!stack->pila || stackEmpty(stack->pila))
  82.         return FALSE;   //Si no tengo pila, o si esta vacia no puedo hacer pop
  83.  
  84.     stack->pila->head--;
  85.     //memcpy(elemento, (void *)(((char *)stack->pila->elementos) + (stack->sizeTipo * stack->pila->head)), stack->sizeTipo);
  86.     memcpy(elemento, stack->pila->elementos + (stack->sizeTipo * stack->pila->head), stack->sizeTipo);
  87.  
  88.     return TRUE;
  89. }
  90.  
  91.  
  92.  
  93. int main(void){
  94.     pilaAdm_t *stack;
  95.     int i,a, n = 5;
  96.  
  97.     stack = stackCreate(n,sizeof(int));
  98.  
  99.     for(i=0; i< 5; i++)
  100.         push(stack,(void *)&i);
  101.  
  102.     for(i=0; i<5; i++){
  103.         pop(stack,(void *)&a);
  104.         printf("%dn",a);
  105.     }
  106.     return 0;
  107. }
  108.  
  109.  

mi idea es meterlo en un archivo stack.c asi lo puedo incluir en mis programas :D


muchas gracias Eternal idol, no hay nada peor que bloquearse con algo y no poder salir de ahi!

49
C/C++ / Re: Asignacion de memoria
« en: Jueves 9 de Octubre de 2008, 19:02 »
jaja ;)

en esta funcion tambien me tira un segmentation fault

Código: C
  1.  
  2. boolean push(pilaAdm_t *stack, void *elemento){
  3.     if(!stack->pila || stackFull(stack->pila))
  4.         return FALSE; //si no hay pila o esta está llena no puedo insertar
  5.  
  6.     memcpy(stack->pila->elementos + (stack->sizeTipo * stack->pila->head++), elemento, stack->sizeTipo);
  7.    
  8.     return TRUE;
  9. }
  10.  
  11.  

en la parte del memcpy, pero no entiendo porque, lo que deberia hacer es copiar elemento, en (posicion 0 de la pila + (size veces por el tipo de dato a guardar)) y el peso del dato a guardar es sizeTipo.

es porque no castiee el stack->pila->elementos de void * a char * y capaz por eso no me permite hacer la aritmetica de punteros?

aunque intente castearlo y tampoco anda :S

saludos!

50
C/C++ / Re: Asignacion de memoria
« en: Jueves 9 de Octubre de 2008, 18:42 »
:O!

tenes razon!

Código: C
  1. pilaAdm_t *stackCreate(int size, int sizeTipo){
  2.     pilaAdm_t *stack = (pilaAdm_t *) malloc (sizeof(pilaAdm_t));
  3.     pila_t *pilaPmd = (pila_t *) malloc (sizeof(pila_t));
  4.    
  5.     stack->pila = pilaPmd;
  6.     stack->pila->elementos = (void *) malloc (sizeTipo * size);
  7.     stack->pila->size = size;
  8.     stack->pila->head = 0;
  9.     stack->sizeTipo = sizeTipo;
  10.    
  11.     return stack;
  12. }
  13.  

excelente!, gracias Eternal Idol, no lo podia ver

ahora me tira el mismo error pero con las instrucciones de push y pop, pero seguro se deben a algo por el estilo de mi error anterior, ahora las veo.

saludos!

Páginas: 1 [2] 3 4 5