• Viernes 8 de Noviembre de 2024, 17:07

Autor Tema:  Vector Dinámico De Estructuras  (Leído 1913 veces)

medieval

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Vector Dinámico De Estructuras
« en: Lunes 22 de Octubre de 2007, 04:32 »
0
Tengo definida esta estructura:

Código: Text
  1. typedef struct {
  2. char* nombre;
  3. char* cuit;
  4. char* cp;
  5. }Tipo_Cliente;
  6.  

Y la siguiente función:
Código: Text
  1.  
  2. Tipo_Cliente* alta_clientes(int cant_cli) //alta de cliente
  3. {
  4.     fflush(stdin);
  5.     int aux=TAM;
  6.     Tipo_Cliente* cli;
  7.  
  8.     if (cant_cli==0)
  9.     cli=(Tipo_Cliente*)malloc(sizeof(Tipo_Cliente)*aux); else
  10.     if (cant_cli==aux)
  11.     {
  12.         aux+=5;
  13.         cli=(Tipo_Cliente*)realloc(cli,sizeof(Tipo_Cliente)*aux);
  14.     }
  15.     printf("\n\nIngrese Nombre del cliente:\n   >");
  16.     fflush(stdin);
  17.     gets(cli[cant_cli].nombre);
  18.  
  19.     printf("\n\nIngrese CUIT del cliente:\n   >");
  20.     gets(cli[cant_cli].cuit);
  21.  
  22.     printf("\n\nIngrese CP del cliente:\n   >");
  23.     gets(cli[cant_cli].cp);
  24.  
  25.     printf("NO PASA!!");
  26.     return cli;
  27. }
  28.  

Quisiera saber por que no pasa nunca del último gets y se aborta el programa, si hay algún error en la función.
muchas gracias saludos!

Leonardo De Luca

ichigo15

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Vector Dinámico De Estructuras
« Respuesta #1 en: Lunes 22 de Octubre de 2007, 09:48 »
0
prueba a poner fflush(stdin) delante de cada gets, los 2 ultimos no los tienen ;)
[size=109]Nadie elige su nombre, te lo ponen cuando naces, pero sí su nick


No eres responsable de la cara que tienes, pero sí de la que pones
[/size]

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Vector Dinámico De Estructuras
« Respuesta #2 en: Lunes 22 de Octubre de 2007, 10:16 »
0
¿Lo depuraste? Tiene toda la pinta de ser un error de acceso invalido a memoria ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

ichigo15

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Vector Dinámico De Estructuras
« Respuesta #3 en: Martes 23 de Octubre de 2007, 21:38 »
0
reservas memoria para la estructura, pero no la haces para los arrays de dentro de la estructura, ten cuidao con eso, q c es lenguaje poderoso

(comentario a no tener en cuanta: mas poderoso que la super-vaca del apt, xDD)

creo q lo mejor es declararte los arrays de 50, x ej, en lugar d utilizar punteros. Pruebalo asi y despues comentas, ok?
[size=109]Nadie elige su nombre, te lo ponen cuando naces, pero sí su nick


No eres responsable de la cara que tienes, pero sí de la que pones
[/size]

medieval

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Vector Dinámico De Estructuras
« Respuesta #4 en: Jueves 25 de Octubre de 2007, 05:36 »
0
Gracias a todos por las respuestas, decidi reescribir el codigo, y ahora si que funciona bien, saludos!!

Falta terminarlo pero ya carga bien todos los datos.

Código: Text
  1.  
  2. typedef struct {
  3.     char nombre[50];
  4.     char cuit[20];
  5.     char cp[20];
  6. }Tipo_Cliente;
  7.  
  8. typedef struct {
  9.     int id;
  10.     char coment[255];
  11.     float precio;
  12. }Tipo_Articulo;
  13.  
  14. typedef struct {
  15.     int id;
  16.     char cuit[20];
  17.     char fecha[20];
  18.  }Tipo_Compra;
  19.  
  20. /*FUNCIONES*/
  21. int alta_opc() //Opciones de alta
  22. {
  23.     int opc;
  24.     printf("\n\nALTAS:\n------\n");
  25.     printf("1-Cliente\n");
  26.     printf("2-Articulo\n");
  27.     printf("3-Compra\n");
  28.     printf("0-Salir\n>");
  29.     fflush(stdin);
  30.     scanf("%d",&opc);
  31.  
  32.     return opc;
  33. }
  34.  
  35. int informes_opc() //Opciones de informes
  36. {
  37.  
  38.     printf("\n\nINFORMES:\n---------\n");
  39.     printf("1-Clientes ordenados por monto total\n");
  40.     printf("2-Articulos ordenados por ventas\n");
  41.     printf("3-Codigos postales ordenados por cantidad de envios\n");
  42.     printf("4-Ver todos los Clientes\n");
  43.     printf("5-Ver todos los Articulos\n");
  44.     printf("6-Ver todas las Compras\n");
  45.     printf("0-Salir\n>");
  46.  
  47.     int opc;
  48.     fflush(stdin);
  49.     scanf("%d",&opc);
  50.     return opc;
  51. }
  52.  
  53.  
  54. int main()
  55. {
  56.  
  57.     int cant_cli=0,cant_art=0,cant_com=0;
  58.  
  59.     Tipo_Cliente* clientes;
  60.     Tipo_Articulo* articulos;
  61.     Tipo_Compra* compras;
  62.  
  63.     int opc=alta_opc();
  64.  
  65.     int auxcli=TAM;
  66.     int auxart=TAM;
  67.     int auxcom=TAM;
  68.  
  69.     while (opc)
  70.     {
  71.  
  72.         switch (opc)
  73.         {
  74.             case 1:
  75.                     {
  76.  
  77.                         printf ("\n\nALTA DE CLIENTE\n");
  78.  
  79.                         if (cant_cli==0)
  80.                             clientes=(Tipo_Cliente*)malloc(auxcli*sizeof(Tipo_Cliente));
  81.                         else
  82.                             if (cant_cli==auxcli)
  83.                             {
  84.                                 auxcli+=5;
  85.                                 clientes=(Tipo_Cliente*)realloc(clientes,auxcli*sizeof(Tipo_Cliente));
  86.                             }
  87.  
  88.                         printf("\n\nIngrese Nombre del cliente:\n   >");
  89.                         fflush(stdin);
  90.                         gets(clientes[cant_cli].nombre);
  91.  
  92.                         printf("\n\nIngrese CUIT del cliente:\n   >");
  93.                         fflush(stdin);
  94.                         gets(clientes[cant_cli].cuit);
  95.  
  96.                         printf("\n\nIngrese CP del cliente:\n   >");
  97.                         fflush(stdin);
  98.                         gets(clientes[cant_cli].cp);
  99.  
  100.                         cant_cli++;
  101.                         opc=alta_opc();
  102.                     }
  103.                     break;
  104.             case 2:
  105.                     {
  106.                         printf ("\n\nALTA DE ARTICULO\n");
  107.  
  108.                         if (cant_art==0)
  109.                             articulos=(Tipo_Articulo*)malloc(auxart*sizeof(Tipo_Articulo));
  110.                         else
  111.                             if (cant_art==auxart)
  112.                             {
  113.                                 auxart+=5;
  114.                                 articulos=(Tipo_Articulo*)realloc(articulos,auxart*sizeof(Tipo_Articulo));
  115.                             }
  116.  
  117.                         printf("\n\nIngrese ID:\n   >");
  118.                         fflush(stdin);
  119.                         scanf("%d",&(articulos[cant_art].id));
  120.  
  121.                         printf("\n\nIngrese Comentario:\n   >");
  122.                         fflush(stdin);
  123.                         gets(articulos[cant_art].coment);
  124.  
  125.                         printf("\n\nIngrese precio:\n   >");
  126.                         fflush(stdin);
  127.                         scanf("%f",&(articulos[cant_art].precio));
  128.  
  129.                         cant_art++;
  130.                         opc=alta_opc();
  131.  
  132.                     }
  133.                     break;
  134.  
  135.             case 3:
  136.                     {
  137.                         printf ("\n\nALTA DE COMPRA\n");
  138.  
  139.                         if (cant_com==0)
  140.                             compras=(Tipo_Compra*)malloc(auxcom*sizeof(Tipo_Compra));
  141.                         else
  142.                             if (cant_com==auxcom)
  143.                             {
  144.                                 auxcom+=5;
  145.                                 compras=(Tipo_Compra*)realloc(compras,auxcom*sizeof(Tipo_Compra));
  146.                             }
  147.  
  148.                         printf("\n\nIngrese ID:\n   >");
  149.                         fflush(stdin);
  150.                         scanf("%d",&(compras[cant_com].id));
  151.  
  152.                         printf("\n\nIngrese Cuit:\n   >");
  153.                         fflush(stdin);
  154.                         gets(compras[cant_com].cuit);
  155.  
  156.                         printf("\n\nIngrese fecha:\n   >");
  157.                         fflush(stdin);
  158.                         gets(compras[cant_com].fecha);
  159.  
  160.                         cant_com++;
  161.                         opc=alta_opc();
  162.                     }
  163.             default:break;
  164.         }/*end switch*/
  165.  
  166.     } /*end while*/
  167.  
  168.     int informe=informes_opc();
  169.  
  170.     while (informe)
  171.     {
  172.         switch (informe)
  173.         {
  174.             case 1:
  175.                     {
  176.  
  177.  
  178.  
  179.                     }
  180.                     break;
  181.             case 2:{
  182.  
  183.  
  184.  
  185.                     }
  186.                     break;
  187.             case 3:{
  188.  
  189.  
  190.  
  191.                     }
  192.                     break;
  193.             case 4:{
  194.                         int i;
  195.                         printf("CLIENTES EN LA BASE\n");
  196.                         for (i=0;i<cant_cli;i++)
  197.                         {
  198.                             printf("Nombre: %s\n",clientes[i].nombre);
  199.                             printf("CUIT: %s\n",clientes[i].cuit);
  200.                             printf("CP: %s\n",clientes[i].cp);
  201.                             printf("-------------\n");
  202.                         }
  203.  
  204.                     }
  205.                     break;
  206.             case 5:{
  207.                         int i;
  208.                         printf("ARTICULOS EN LA BASE\n");
  209.                         for (i=0;i<cant_art;i++)
  210.                         {
  211.                             printf("ID: %d\n",articulos[i].id);
  212.                             printf("Comentario: %s\n",articulos[i].coment);
  213.                             printf("Precio: %f\n",articulos[i].precio);
  214.                             printf("-------------\n");
  215.                         }
  216.                     }
  217.                     break;
  218.             case 6:{
  219.                         int i;
  220.                         printf("COMPRAS EN LA BASE\n");
  221.                         for (i=0;i<cant_com;i++)
  222.                         {
  223.                             printf("ID: %d\n",compras[i].id);
  224.                             printf("Comentario: %s\n",compras[i].cuit);
  225.                             printf("Fecha: %s\n",compras[i].fecha);
  226.                             printf("-------------\n");
  227.                         }
  228.                     }
  229.                     break;
  230.             default:break;
  231.  
  232.         }/*end switch*/
  233.  
  234.         informe=informes_opc();
  235.     }   /*end whie*/
  236.     free(clientes);
  237.     free(articulos);
  238.     free(compras);
  239.     getch();
  240.     return 0;
  241. }
  242.