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


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 235
451  Programación / Programación C/C++ / Re: necesito ayuda aqui, plox, me podrian ayudar? en: 3 Diciembre 2018, 02:05 am
Para capturar datos te recomiendo el post que publique:

https://foro.elhacker.net/programacion_cc/plantillas_programas_escolares_en_c-t489889.0.html

Ahi podrar captirar N cantidad de empleados y sus sueldos, posteriormente solo te quedara sacar el progrmedio.

Saludos!
452  Programación / Programación C/C++ / Re: necesito ayuda aqui, plox, me podrian ayudar? en: 3 Diciembre 2018, 01:06 am
Y ahora me voy a dormir que me iba a ir cuando he visto el programa pero iba a tener pesadillas si no hacía nada al respecto. Suerte :rolleyes:

Jajajaja, ya me imagino, No me comaaa serñor fflush(stdin); ya voy a utiliza  fseek(stdin, 0, SEEK_END); como indican en ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)

Por cierto date una vuelta por este tema: Lo que no hay que hacer en C/C++. Nivel basico

Saludos!

453  Programación / Programación C/C++ / Re: necesito ayuda aqui, plox, me podrian ayudar? en: 3 Diciembre 2018, 00:02 am
registro no devulve ningun tipo de dato. eso da error, ademas R es solo un caracter y no una cadena o algun otro tipo.

La concatenacion de candenas podrias realizarla mas rapido de la siguiente manera:

Código
  1. sprintf(nombrecompleto,"%s %s %s",nom,ape,apeM);

Saludos!
454  Programación / Programación C/C++ / Re: Primero en Entrar, primero en salir FIFO, Cola o Fila en: 2 Diciembre 2018, 22:50 pm
En teoría quedo esta versión, utilizando un buffer semi circular y creciendo la memoria en potencias de 2.

Tiene muchos printf para depuración, y mostrar el funcionamiento.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<time.h>
  5.  
  6. typedef struct str_queue {
  7. char **queue;
  8. int len;
  9. /*
  10. Las siguientes variales son para hacer mas eficiente la asignacion de memoria
  11. len_max indica el numero de espacios len_maximos reservados actualmente, este siempre esta en potencias de 2
  12. offset indica cuantos espacios vacios hay al principio del arreglo, con el fin de no tener que reacomodar el arreglo con cada de-queue
  13. offset_max indica la cantidad cada cuantos movimientos se va a reorganizar la memoria.
  14. */
  15. int len_max;
  16. int offset;
  17. int offset_max;
  18. }Queue;
  19.  
  20. Queue *create_queue() {
  21. Queue *q = malloc(sizeof(struct str_queue));
  22. q->len = 0;
  23. q->offset = 0;
  24. q->len_max = 2;
  25. q->offset_max = 1;
  26. q->queue = malloc(sizeof(char*)*q->len_max);
  27. return q;
  28. }
  29.  
  30. void free_queue(Queue *q) {
  31. if(q) {
  32. if(q->queue)
  33. free(q->queue);
  34. free(q);
  35. }
  36. }
  37.  
  38. void en_queue(Queue *q, char *ptr) {
  39. char **temp;
  40. int i;
  41. //printf("%i == %i ?\n",q->len,q->len_max);
  42. if( q->len == q->len_max) {
  43. q->len_max *= 2;
  44. //printf("%p -> ",q->queue);
  45. temp = q->queue;
  46. q->queue = realloc(temp,q->len_max*sizeof(char*));
  47. //printf("%p\n",q->queue);
  48.  
  49. if(q->queue == NULL) {
  50. fprintf(stderr,"error realloc\n");
  51. }
  52. else {
  53. printf("Tamanio actual %i\n",q->len_max);
  54. }
  55. }
  56. if(q->queue != NULL) {
  57. printf("q->queue[%i] <- %p\n",q->len,ptr);
  58. q->queue[q->len] = ptr;
  59. q->len++;
  60. }
  61. }
  62.  
  63. char * de_queue(Queue *q) {
  64. char *r = NULL;
  65. int i,j;
  66. if((q->len - q->offset) >= 1) {
  67. r = q->queue[q->offset];
  68. printf("q->queue[%i] : %p -> out\n",q->offset,q->queue[q->offset]);
  69. q->queue[q->offset] = NULL;
  70. q->offset++;
  71. if(q->offset == q->offset_max) {
  72. //printf("%i == %i\n",q->offset,q->offset_max);
  73. i = q->offset;
  74. j = 0;
  75. //printf("i:%i  j:%i\n",i,j);
  76. while(i < q->len) {
  77. //printf("i:%i < q->len:%i\n",i,q->len);
  78. printf("q->queue[%i]: %p  <- q->queue[%i]: %p\n",j,q->queue[j],i,q->queue[i]);
  79. q->queue[j] = q->queue[i];
  80. q->queue[i] = NULL;
  81. j++;
  82. i++;
  83. }
  84. //printf("%i:q->len %i -= q->offset %i\n",(q->len-q->offset),q->len,q->offset);
  85. q->len -= q->offset;
  86. q->offset = 0;
  87. q->offset_max *=2;
  88. }
  89. }
  90. //printf("r: %p, %s\n",r,r);
  91. return r;
  92. }
  93.  
  94. int main() {
  95. char *cadenas[10] = { "Cadena_0","Cadena_1","Cadena_2","Cadena_3","Cadena_4","Cadena_5","Cadena_6","Cadena_7","Cadena_8","Cadena_9"};
  96. char *actual;
  97. int index1,index2,i =0;
  98. srand(time(NULL));
  99. Queue *q = create_queue();
  100. while(i < 1000) {
  101. index1 = rand() % 10;
  102. index2 = rand() % 10;
  103. //printf("Agregando a la fila: %p %s\n",cadenas[index1],cadenas[index1]);
  104. en_queue(q,cadenas[index1]);
  105. //printf("Agregando a la fila: %p %s\n",cadenas[index2],cadenas[index2]);
  106. en_queue(q,cadenas[index2]);
  107. de_queue(q);
  108. //printf("Saliendo de la fila %s\n",de_queue(q));
  109. i++;
  110. }
  111. free_queue(q);
  112. }
  113.  

Salidos!
455  Programación / Programación C/C++ / Re: Primero en Entrar, primero en salir FIFO, Cola o Fila en: 1 Diciembre 2018, 23:49 pm
Por lo mismo lo dije:

No es lo mas eficiente, hay muchas cosas se podrian mejorar, en especifico la forma en la que se organizan  el arreglo de elementos actuales en la Fila,  sin embargo funciono para el proposito.

Si claramente se puede manejar de mejor manera, me gusta lo de pedir memoria en potencias de 2, y lo del buffer Circular.

Pidiendo memoria de 2 en 2, requiere cambios en la estructura, en la funcion de crear para inicializar con 2 espacios disponibles y en la funcion en_queue

Código
  1. typedef struct str_queue {
  2. char **queue;
  3. int len;
  4. int max;
  5. }Queue;
  6.  
  7. Queue *create_queue() {
  8. Queue *r = malloc(sizeof(struct str_queue));
  9. r->len = 0;
  10. r->max = 2;
  11. r->queue = malloc(sizeof(char*)*r->max);
  12. return r;
  13. }
  14.  
  15. void en_queue(Queue *q, char *ptr) {
  16. if((q->len+1) == q->max) {
  17. q->max *= 2;
  18. printf("Tamanio actual %i\n",q->max);
  19. q->queue = realloc(q->queue,q->max*sizeof(char*));
  20. }
  21. if(q->queue != NULL) {
  22. q->queue[q->len] = ptr;
  23. q->len++;
  24. }
  25. }
  26.  

Saludos!
456  Programación / Programación C/C++ / Error con send de Winsock (Solucionado) en: 1 Diciembre 2018, 23:21 pm
Muy buen dia.

Estoy trabajando con un servidor http de lo mas básico posible.

Tengo un error al momento de enviar el contenido. El navegador a veces recibe los archivos incompletos y no logro ubicar el error.



El navegador indica que solo recibe 768KB para el penultimo archivo "/test.mp3"

La salida del programa indica lo siguiente para ese archivo.



Leido indica la cantidad de bytes que a leido desde el archivo:

Código
  1. fseek(contenido,offset,SEEK_SET);
  2. leido = fread(buffer,1,size,contenido);
  3. printf("Leido %i %s\n",leido,path);
  4. if(leido != size) {
  5. fprintf(stderr,"fread() read %i vs request %i\n",leido,size);
  6. exit(0);
  7. }
  8. fclose(contenido);
  9.  

leido toma la cantidad que devuelve fread, si leido y size son distintos el programa termina inmediatamente.


Posteriormente mando ese buffer leido al comando send.

Código
  1. int send_all(SOCKET descriptor, const void *buffer, size_t length, int flags) {
  2. printf("send_all\n");
  3.    ssize_t n;
  4.    const char *p = buffer;
  5.    while (length > 0)
  6.    {
  7.        n = send(descriptor, p, length, flags);
  8. printf("send: %i bytes\n",n);
  9.        if (n <= 0)
  10.            return -1;
  11.        p += n;
  12.        length -= n;
  13.    }
  14.    return 0;
  15. }
  16.  

send all indica mediante la variable "n" la cantidad de datos enviados por send.

Asi mismo en los headers recibe correctamente el mismo numero indicado por el programa:



Asi que dado que la cantidad de items leidos por fread es la misma que la cantidad de bytes enviados por send, no entiendo por que el navegador no recibe todo el archivo, ya que al momento de tratar de reproducirlo esta incompleto.

Saludos



Al final quedo solucionado modificando la funcion send all. Por alguna razon dice que a enviado todos lo 2 MB pero el navegador  solo recibio los 700 KB. Modique la funcion para que envie de 64 bytes por vez y ahora envio el documento completo

Código
  1. int send_all(SOCKET descriptor, const void *buffer, int length, int flags) {
  2. int n,s;
  3. const char *p = buffer;
  4. while (length > 0) {
  5. s = ( length > 64 ) ? 64: length;
  6. n = send(descriptor, p, s, flags);
  7. if (n <= 0)
  8. return -1;
  9. p += n;
  10. length -= n;
  11. }
  12. return 0;
  13. }



Y el programa marca exactamente la misma cantidad.


Saludos!
457  Programación / Programación C/C++ / Re: Primero en Entrar, primero en salir FIFO, Cola o Fila en: 1 Diciembre 2018, 23:07 pm
Gracias, si no lo compile, solo lo edite y se me olvido editar el prototipo.

Saludos
458  Programación / Programación C/C++ / Re: Primero en Entrar, primero en salir FIFO, Cola o Fila en: 1 Diciembre 2018, 20:02 pm
Solo un detalle, en de_queue estás usando memcpy para mover el contenido de un vector sobre sí mismo. Cuando usas memcpy sobre dos buferes que se superponen (como en este caso) el comportamiento queda indefinido (puede que a veces funcione y otras no o puede depender del compilador...). Lo correcto en estos casos es utilizar memmove, que utiliza un bufer auxiliar y así evitar que la información del vector se pueda "machacar".

¡Saludos!

Si me imagine que si la implementación empieza de alravez puede pasar eso, lo voy editar como mentas o en su defecto con una versión iterativa con while moviendo los elementos del buffer.

Código
  1. char * de_queue(Queue *q) {
  2. char *r = NULL;
  3. int i = 0;
  4. if(q->len >= 1) {
  5. r = q->queue[0];
  6. q->len--;
  7. while(i < q->len) {
  8. q->queue[i] = q->queue[i+1];
  9. i++;
  10. }
  11. q->queue[i] = NULL;
  12. }
  13. return r;
  14. }
  15.  

Por qué free_queue dice que devuelve int y no devuelve valor alguno?

Por mala practica de programación, viejo habito de declarar las funciones como int, cuando no he definido si van a retornar valor o no.

En un momento corrijo el código.

Saludos!
459  Programación / Programación C/C++ / Re: Procesar matriz leída por un archivo txt y calcular la desviación estándar en: 1 Diciembre 2018, 01:39 am
Solo busco una guia como para empezar no que lo hagan por mí! Muchas gracias de antemano!

Por ahi hubieras empezado.

Esta el siguiente tema donde se dan algunos temas para aprender.

https://foro.elhacker.net/programacion_cc/avanzar_en_programacion_de_c_de_manera_escalonada-t490166.0.html

Si estas viendo C  date una vuelta por el siguiente tema:

https://foro.elhacker.net/programacion_cc/plantillas_programas_escolares_en_c-t489889.0.html

Ahi muestro algunas plantillas básicas que siempre piden en trabajos escolares.

Por ahi en mas te recomiendo un  libro de C

Código:
www.tecnica1lomas.com.ar/tutoriales/lenguaje_C.pdf

 y cualquier dudas aqui estamos :)

Saludos!
460  Programación / Programación C/C++ / Re: Procesar matriz leída por un archivo txt y calcular la desviación estándar en: 1 Diciembre 2018, 01:27 am
 ;-) ;-) ;-) ;-)

int main()



Fuera de bromas, por lo menos dinos si tienes el archivo.

Ya sabes leer archivos, desde C o estas viendo C++?

Saludos!
Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines