Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Miky Gonzalez

#11
Ah no  ;D
Sólo intento mostrarle que igual los arrays fijos/estáticos en memoria no son las soluciones a todos nuestros problemas y necesitamos de vez en cuando hacer las cosas para un todo, dinámicamente hablando; porque no en todo sabemos que nos vamos a encontrar ni la longitud/tamaño de datos que vamos a almacenar.

Saludos.
#12
Suponiendo que vamos a analizar un archivo de 1GB de datos, ¿cómo se supone que puedes saber los elementos a analizar?, voy a inventarme el contenido de un archivo:

Código (bash) [Seleccionar]
TEXTO 328382832823832723 TEXTO ... info inutil ... wur87edwh
DSDDS SFJ 32823828233828732 23uhfcwd 372372 eeu2qydebc
3h 3723
cdsj
244
2
423e23e273e TEXTO 32yu273ed 3k


Supongamos ese archivo, obviamente las cadenas ordenadas por lineas no son de igual longitud, entonces supongamos que el archivo pesa 100MB, pero sólo me interesan las línea que contengan "TEXTO", es decir, la primera y la última, no voy a almacenar 100MB del archivo, sólo la longitud en bytes de lo que ocupen esas líneas. Por ende si cada línea es de un tamaño diferente y sin ninguna relación a las demás, no es lógico determinar una longitud media de 200 caracteres por linea, por ejemplo. Si supongamos que cada línea contiene separada por espacio para palabra no reconocida por un diccionario X en que cada ID equivale a el número de línea empezando por 0, de todas las desconocidas solo me importa la primera y última, ¿para qué almacenar las demás?.

En cuanto a almacenar 1GB de datos para luego convertirlos a 2GB sólo por añadir 1 datos más eso es problema del programador. Me explico, aunque es irrazonable crear un array de 1GB para estudiarlo u operar con él, el programador debería definir un tamaño máximo de memoria ocupada por array para que no pasen esas cosas, es decir, dividir en varios segmentos el sistema total.
#13
Yo no apoyo las cantidades fijas de incremento, y me gustaría que daras algunas pruebas de porqué las apoyas con respecto a cantidades variables en el incremento de la memoria a reservar; mis aportes de por qué las apoyo las encuentras en el post y en los comentarios anteriores.

Un ejemplo muy básico en el que no se el tamaño que va a tener un array es tan simple como el leer los datos desde un fichero de texto, que puede tener X bytes de datos. Por ejemplo el fichero

3823\n\r
2822\n\r
2832838\n\r


Donde cada número puede indicar cualquier cosa, como por ejemplo cantidad de segundos activos, ID, un diccionario de números... donde cada valor queda separado por un "\n\r", que eso debe preocuparse el programador de hacer el split.

Otro ejemplo podría ser por ejemplo un intérprete de OP-Code de una máquina virtual que has programado, en que cada línea corresponde a una instrucción que puede almacenar en un array definido como:

typedef struct array_string {
   char **data;
   // otros parametros (size *, long *...)
} array_string_t;


Al esperar una entrada de un archivo log donde cada línea si existe X coincidencia de Y palabra, se almacena el valor en la posicion horizontal del inicio de la palabra, o 0(ZERO) si no hay coincidencia...

Hay muchos ejemplos en los cuales no se puede saber el tamaño que debe tener el array...
#14
@engel lex Gracias por la respuesta, a eso se debe que haya reducido muy notablemente las veces que es llamada la función realloc, por ejemplo:
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 64 -> 128 -> 256 -> 512 -> 1024 -> 2048

Para llegar a una insercción de 2048 bytes, 2kB, se necesitan usando el factor 2^n, 12 llamadas a la función realloc. Esto significa que se han ahorrado 2048 - 12 veces el uso a la llamada realloc, que hace una suma bastante elevada de bytes que no han sido realocados.
#15
Hoy recordando un tema que leí en éste mismo foro de Programación C/C++ acerca de la lectura de archivos y la interpretación de archivos de registros (LOGs) se me ha ocurrido programar un poco, una cosa ha derivado a la otra hasta que se me ha propuesto un problema acerca de la optimización del uso de arrays.

Es más rápido crear un array estático con los elementos suficientes (o más) del conjunto que queremos guardar. Por ejemplo, puedo crear un array de tipo char y tamaño 1024 para almacenar un texto de entrada y operar luego con él. Pero, ¿para qué reservar 1024 bytes si sólo usaré, por ejemplo, 8 bytes?. Entonces me puse a pensar en arrays dinámicos, en que por cada elemento valor añadido al conjunto llamaría a "realloc" para reservar el nuevo tamaño del conjunto, esto resulta muy lento. Una posible solución que se me ha ocurrido es reservar siguiendo como 2^n. Esto es:


  • Creo un array de tamaño 1
  • Inserto nuevo valor en array, para ello reservo 2^1 bytes
  • Inserto nuevo valor en array, para ello reservo 2^2 bytes, esto me permite añadir 1 elemento más sin necesidad de llamar a realloc (ya hay suficiente espacio para este elemento)
  • Si añado otro elemento más se reservan 2^3 bytes, esto es, tengo espacio para 4 elementos sin llamar a realloc

Con esto creo arrays dinámicos teniendo en cuenta la velocidad de proceso. La primera pregunta/duda/opininión me viene si hay una manera más optima teniendo en cuenta memoria/velocidad de procesamiento.

La siguiente preguntas es si existe una manera "organizada", tambien podria decirse como una manera adecuada, limpia, eficiente, de almacenar datos de todos los tipos reservando una N cantidad de memoria. Por ejemplo, si creo una estructura para el problema anterior para usar una "librería simple" de arrays dinámicos, la estructura usada para valores que contengan tipos enteros no me servirá para valores que contengan tipos char.

Existe alguna forma de hacer, en pseudocódigo:

Código (bash) [Seleccionar]
Almacenar 4 bits
# Con estos 4 bits puedo almacenar 4 tipos chars o un entero o un float...
Insertar entero...
O insertar char x 4...
O insertar float...

#16
Simplemente de diré sigue las instrucciones,  los paquetes de código fuente prearchivados suelen venir sin error y automáticos en la construcción del código. Si te falla la compilación revisa las dependencias.

Instrucciones (ejecutar en terminal):

1. ./configure
2. make
3. make install
#17
Programación C/C++ / Re: Programa pasar a binario!
15 Noviembre 2014, 22:22 PM
Aquí todos vamos intentando quedar como quien mejor tiene la razón. Los temas en el foro se crean para ayudar, si mal no veo, mi primer mensaje fue:

CitarNo puedes venir y soltar el ejercicio que te mandaron hacer para que otros lo hagan por ti. Publica un código, si tienes duda publica el código, da una pregunta o varias pero que sean concretas, esto es:

¿Cómo puedo hacer para que se obtenga un número aleatorio de 0-255?
¿Cómo puedo obtener un vector que contenga la conversión binaria de un número de tamaño 1 byte?
¿Cómo puedo cronometrar los milisegundos que tarda un proceso en la ejecución?

A lo que el respondió que no quería un código completo, sólo quería una referencia. Ya sé que él ha podido al menos intentar algo de código y si le sale mal  publicarlo para que nosotros le ayudemos.

Si al aportar ese código como recurso he estado invalidando la política de este foro entonces no era la intención, la única intención con la que posteo en el foro es para ayudar a los demás o publicar un aporte de código. No quiero ver si soy el que más sabe o el que más respeta las normas: Los pedantes sobran en este foro.

Saludos,
MikyGonzalez.
#18
Programación C/C++ / Re: Programa pasar a binario!
15 Noviembre 2014, 18:41 PM
Para pasar un número en base décimal (indiquémoslo con [10]) éste se va diviendo por 2 (base binaria) hasta que el resto es 0. El resto de cada cifra binaria colocada haciendo el total del número binario. Esto es:


Puedes empezar por este código:

#include <stdio.h>

int main(int argc, char **argv) {
char num_binario[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char num = 79; // esto es que alcanza valores desde -128, 127

// realizar conversión binario automático
char bucle_i, resto, resultado = num;
num_binario[8] = '\0'; // para imprimirlo como cadena
for(bucle_i = 7; resultado != 0; bucle_i--) {
resto = resultado % 2;
resultado /= 2;
num_binario[bucle_i] = resto + '0';
}

printf("num_binario = %s\n", num_binario);

return 0;
}


Como tarea, para no darte todo completo y que aprendas por ti mismo:
El código falla para valores mayores a 127, arregla ese error (pista: declarar la variable de forma que su rango este entre 0-255).
Puedes aumentar el código para que admita más de 255 caracteres.
#19
Programación C/C++ / Re: Lectura de archivos log
15 Noviembre 2014, 17:35 PM
Como bien dice @MeCraniDOS, una estructura simple para usar en pseudocódigo:

Código (bash) [Seleccionar]
Crear array: fecha, hora, id, descripcion;
Mientras caracter_leido no sea igual a EOF entonces
  leer_caracter
  procesar_leidos
Fin_Mientras


En leer_caracter puedes añadir ese caracter a un buffer y en procesar_leidos puedes hacer que identifique si esta en la sección fecha, hora... y cuando terminar sección y empezar otra.

Saludos.
#20
Programación C/C++ / Re: Programa pasar a binario!
15 Noviembre 2014, 17:28 PM
Primero antes de nada quiero decir que lo siguiente es mi opinión aunque creo que más gente la apoyará:

No puedes venir y soltar el ejercicio que te mandaron hacer para que otros lo hagan por ti. Publica un código, si tienes duda publica el código, da una pregunta o varias pero que sean concretas, esto es:

¿Cómo puedo hacer para que se obtenga un número aleatorio de 0-255?
¿Cómo puedo obtener un vector que contenga la conversión binaria de un número de tamaño 1 byte?
¿Cómo puedo cronometrar los milisegundos que tarda un proceso en la ejecución?

Saludos, suerte con tu ejercicio. Te recomiendo leer usos de la librería básica.