elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 [77] 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 ... 235
761  Programación / Programación C/C++ / Re: Tutorial de archivos en lenguaje C. - en: 18 Septiembre 2016, 16:52 pm
Nunca lo he provado de esa forma prefiero manejarlo desde el SEEK_SET para hacerlo desde el inicio del archivo. lo que me gusta hacer es tener un contador para saber cual es el numero de registro actual y si quiero regrersar al que previamente lei lo que hago es

Código
  1. fseek(file, (contador-1)*sizeof(Idiomas), SEEK_SET);

Tendria que probar con la posición SEEK_CUR como lo mencionas.

Saludos!
762  Programación / Programación C/C++ / Re: Mejor forma de procesar una cadena de formato [Cantidad de memoria] en: 18 Septiembre 2016, 02:30 am
Eso me pasa por no leer la documentacion de la funcion  ;D  ;-) ;-) ;-)

Ya quedo mas optimizada mi funcion, muchas gracias  :xD
763  Programación / Programación C/C++ / Re: ¿Por qué se detiene en el segundo registro? en: 17 Septiembre 2016, 22:28 pm
El otro problema que veo es que estas usando la misma variable para iterar en todos los datos.

El "i" se reinicailiza cuando muestras datos y deberias de usar otra variable cuando queras agregar datos nuevos, como por ejemplo tener una variable que siempre guarde el numero del ultimo registro guardado en el arreglo.

Saludos!
764  Programación / Programación C/C++ / Re: Tutorial de archivos en lenguaje C. - en: 17 Septiembre 2016, 22:23 pm
No estoy seguro de cuales son los datos ingresados pero el problema puede ser el strcmp, ya que solo lo tienes mejor que cero y strcmp puede devolver -1, 0 o 1 segun sea menor, igual o mayor deberias de cambiarlo por !=

Código
  1. strcmp( tmp.ingles, idiomas.ingles ) != 0

Saludos!
765  Programación / Programación C/C++ / Re: Mejor forma de procesar una cadena de formato [Cantidad de memoria] en: 16 Septiembre 2016, 14:23 pm
Muchas gracias MAFUS segui mas o menos tu consejo y quedo asi el codigo:

Código
  1. void server_print(struct peticion *session,char *format,...) {
  2. int len = 0,count = 0,i,X;
  3. char *buffer = NULL;
  4. struct m_args *arreglo = NULL;
  5. va_list args;
  6. va_start(args, format);
  7. len = strlen(format);
  8. X = len;
  9. i = 0;
  10. while(i < len) {
  11. if(format[i] == '%') {
  12. i++;
  13. printf("Evaluando %c\n",format[i]);
  14. switch(format[i]) {
  15. case 's':
  16. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  17. arreglo[count].valor = va_arg(args, void *);
  18. X+= strlen((char*)arreglo[count].valor);
  19. count++;
  20. break;
  21. case 'i':
  22. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  23. arreglo[count].valor = va_arg(args, void *);
  24. X+=11;
  25. count++;
  26. break;
  27. case 'u':
  28. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  29. arreglo[count].valor = va_arg(args, void *);
  30. X+=11;
  31. count++;
  32. break;
  33. case 'd':
  34. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  35. arreglo[count].valor = va_arg(args, void *);
  36. X+=11;
  37. count++;
  38. break;
  39. case 'f':
  40. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  41. arreglo[count].valor = va_arg(args, void *);
  42. X+=11;
  43. count++;
  44. break;
  45. case 'x':
  46. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  47. arreglo[count].valor = va_arg(args, void *);
  48. X+=11;
  49. count++;
  50. break;
  51. case 'l':
  52. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  53. arreglo[count].valor = va_arg(args, void *);
  54. X+=20;
  55. count++;
  56. break;
  57. case 'c':
  58. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  59. arreglo[count].valor = va_arg(args, void *);
  60. X+=1;
  61. count++;
  62. break;
  63. case '%':
  64. X+=1;
  65. break;
  66. default:
  67. arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
  68. arreglo[count].valor = va_arg(args, void *);
  69. X+=20;
  70. count++;
  71. break;
  72. }
  73. }
  74. i++;
  75. }
  76. free(arreglo);
  77. va_end(args);
  78. buffer = malloc(X+1);
  79. va_start(args, format);
  80. vsnprintf(buffer,X,format, args);
  81. va_end(args);
  82. buffer[X] = 0;
  83. len = strlen(buffer);
  84. printf("Longitud reservada %i vs Real %i\n",X,len);
  85. X = session->reply_length + len;
  86. session->reply = realloc(session->reply,X+1);
  87. memcpy(session->reply+ session->reply_length,buffer,len);
  88. session->reply[X] = 0;
  89. session->reply_length = X;
  90. free(buffer);
  91. }
  92.  

Resulta que podria llamar varias veces a va_start(args, format); y va_end...

Y asi solo itere sobre los argumentos viendo su tipo (Segun el formato de Cadena) reserve la memoria mas o menos necesitada por el tipo y volvi a llamar a va_start para posteriormente hacer un vsnprintf

Código
  1. vsnprintf(buffer,X,format, args);

Aun asi me faltan los formatos mas especializados pero eso con tiempo lo voy hacer, puse un default de +20 bytes por parametro "desconocido"



Saldos!
766  Programación / Programación C/C++ / Re: ¿Por qué se detiene en el segundo registro? en: 16 Septiembre 2016, 13:44 pm
La condicion de tu do-while esta mal.


Código
  1. do{
  2. // Omitido
  3. printf("\nDesea regresar al menu?\n1.Regresar al menu / 2.Salir: ");
  4.    scanf("%d", &OP);
  5. }  while(i=0,i<10,i++);


Cuando deberia de ser
Código
  1. do{
  2. // Omitido
  3. printf("\nDesea regresar al menu?\n1.Regresar al menu / 2.Salir: ");
  4.    scanf("%d", &OP);
  5. }  while(OP !=2);

Saludos!


767  Programación / Programación C/C++ / Re: Pasar/Recibir arreglo bidimensional en diversas funciones (Lenguaje C) en: 16 Septiembre 2016, 00:30 am
Donde termina tu funcion menu?

falta un } para el switch o para la funcion, ademas ya estando en tu funcion llenarNomina no se que realice.. tal vez tratas de escribir fuera de los limites de la memoria o algun otro tipo de error.

saludos!
768  Programación / Programación C/C++ / Mejor forma de procesar una cadena de formato [Cantidad de memoria] en: 16 Septiembre 2016, 00:12 am
Buenas!!

Estoy haciendo un pequeño servidor WEB en C, algo basico y como ejercicio, ya que este algo pulido dejare el link al codigo por aqui.


El detalle que me encuentro es que quiero crear una función de argumentos variables asi como el printf donde le ahorre al usuario "final" ( :rolleyes: :rolleyes:) el reservar memoria para el buffer de respuesta al cliente. para ello solo creare una función llamada "server_print" donde el usuario colocara su formato de cadena y las variables que el quiera. Y que la función haga el trabajo duro...

session es un contenedor de variables auxiliares y ese de momento, se puede obviar...

Código
  1. void server_print(struct peticion *session,char *format,...) {
  2. char *buffer = NULL;
  3. int X;
  4. va_list args;
  5. va_start(args, format);
  6. buffer =malloc(X);
  7. vsnprintf(buffer,X,format, args);
  8.  
  9. //realizar operaciones sobre session...
  10.  
  11.  
  12. va_end(args);
  13. }
  14.  

Lo que me interesa saber es el cuando debe de valer X para reservar esa cantidad de memoria exacta.. el detalles esta en que puedo ahórrame el "pensar" y asignar MUCHA memoria por cada argumento del programa, pero el detalle esta en que:

¿Que pasa si no alcanza?

Quiero tener un programa eficiente que no malgaste memoria y sea rápido...

Se me ocurre buscar en la cadena de formato por cada % que se encuentre y por ejemplo si es un Entero reservar solo 12 bytes mas, si es cadena sacar el strlen del argumento en cuestion, si es %l dejar sobre 30 bytes mas y asi...

¿Como procederían ustedes?

Saludos!
769  Programación / Programación C/C++ / Re: Pasar/Recibir arreglo bidimensional en diversas funciones (Lenguaje C) en: 16 Septiembre 2016, 00:00 am
Hola tienes que declarar primero el arreglo antes de llamar a las funciones mencionadas

Ejemplo:

Código
  1. void menu(){
  2. int N[filas][columnas];
  3.   int opc;
  4.   printf("MENU\n");
  5.   printf("1. Nueva Nomina\n");
  6.   printf("2. Mostrar Todas las Nominas\n");
  7.   printf("Ingrese opcion: ");
  8.   scanf("%d",opc);
  9.  
  10.   switch(opc){
  11.      case 1:
  12.         /*Estoy tratando de hacer que cuando ingrese a la opcion 1, vaya directamente a la función llenarNomina*/
  13.         llenarNomina(N); // Aca me da un severo error
  14.         break;
  15.      case 2:
  16.         mostrarNomina(N);
  17.         break
  18.      default:
  19.         printf("Opcion Incorrecta");
  20. }
770  Programación / Programación C/C++ / Re: hacer mas corto el programa y si esta bien hecho en: 15 Septiembre 2016, 21:40 pm
La de numeros se puede mejorar

Código
  1. if (a[i]>='0' && a[i]<='9' )

ahora cambia el gets por fgets:

Código
  1. fgets(cad,500,stdin);

ya que con el gets eres vulnerable a buffer overflow (Si le metes mas de 500 caracteres vas a sobre escribir variables del programa)

Saludos!
Páginas: 1 ... 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 [77] 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines