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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12
21  Programación / Programación C/C++ / Re: Quedarme solo con algunos decimales. en: 6 Abril 2012, 00:19 am
Gracias, ahora usando _Decimal64 lo solucione :D
22  Programación / Programación C/C++ / Quedarme solo con algunos decimales. en: 4 Abril 2012, 16:50 pm
Hola, tengo un problema muy sencillo y que aún así me sigue quemando el coco.
Tengo una función que me devuelve un float, un float que es el resultado de 10/3, osea 3,333333...
Quiero recortarle algunos decimales cosa de que me quede como 3,333 o 3,3333.
Lo que hago es sencillo, tomo el float en cuestión, lo multiplico por 10⁴, si quiero tener 4 decimales luego de la coma y lo convierto a entero cosa de que me quede: 33333. Luego lo divido a ese entero, casteado a float por 10⁴, para volver a mover los decimales, cosa de que me quede 3,3333. Sin embargo lo que me ocurre es que cuando lo imprimo formateado como %.100f (cosa de ver todos los decimales posibles), me queda 3,333300000000003454345677. Esto me esta volviendo loco, porque solo me sucede con numeros periódicos y es un razonamiento muy sencillo.

El codigo seria algo como
int decimales = 3;
float miNumero = funcion_que_devuelve_float(10,3);
int miNumero2 = (int)(miNumero * pow(10,decimales));
float miNumero = (float)(miNumero2 / pow(10,decimales));

También intente multiplicar en ambos casos, en uno por la potencia negativa y en otro por la positiva, con el mismo resultado.

Muchas gracias por detenerse a leer y saludos.
23  Informática / Hardware / Re: ¿Existen netbooks que puedan soportar IDEs como Eclipse? en: 3 Abril 2012, 14:37 pm
Y mientras sean cuotas de 40 euros por mes puedo soportar el gasto, otro tema es que tengo que elegir una cuya tecnología sea compatible con Debian (aunque si no es muy nueva, seguro lo sea). Esas paginas que me mostraste me resultan interesantes, ¿de que país es?

Saludos!
24  Informática / Hardware / ¿Existen netbooks que puedan soportar IDEs como Eclipse? en: 3 Abril 2012, 01:43 am
Hola, quería hacer una pequeña consulta, voy a iniciarme en un proyecto y necesito una computadora para estar trabajando lejos de mi casa, como no me dan ganas de llevarme la CPU al hombro todos los días al trabajo, estoy pensando en comprarme una netbook o una notebook. En preferencia me gustaría comprarme algo económico, por eso pensé en una netbook, pero no se si una netbook pueda soportar correr IDEs como Eclipse o Netbeans. ¿Ustedes conocen alguna notebook que sea lo suficientemente potente como para tirar una IDE o acaso me conviene optar por comprarme una notebook?.

Muchas gracias por detenerse a leer y saludos! :D
25  Programación / Desarrollo Web / ¿Manual o textos de JSP? en: 26 Marzo 2012, 16:10 pm
Hola, estaba buscando algún manual o alguna fuente para formarme con Java Server Pages, sin embargo en internet solo encuentro tutoriales con muy poco contenido. ¿Alguno conoce un manual de JSP?

Muchas gracias por detenerse a leer, saludos.
26  Sistemas Operativos / Unix/Unix-Like / Re: System V: Buffer de Cache + ¿Que ocurre si piso fragmentacion interna? en: 23 Marzo 2012, 02:01 am
Lo de la fragmentación interna ya lo saque, cada entrada en la tabla de paginas tiene un atributo llamado length, bue creo que de ahi en mas todo sale por logica.
27  Sistemas Operativos / Unix/Unix-Like / System V: Buffer de Cache + ¿Que ocurre si piso fragmentacion interna? en: 22 Marzo 2012, 20:49 pm
Hola tengo dos dudas muy puntuales. El otro día haciendo algunos ejercicios de memoria virtual, me surgió una duda, en un esquema de memoria virtual con paginación, ¿Como detecta el sistema operativo si estoy referenciando a una dirección que esta en la fragmentación interna del espacio de direcciones lógico?. Es decir, se puede detectar por HW si estoy tratando de acceder a una pagina que no esta asignada mediante el bit de validez, sin embargo por un error del programa del proceso una instrucción podría hacer un salto a la fragmentación interna, ¿Como se detecta en ese caso?

Mi otra pregunta es acerca del buffer de cache en System V.
¿Se mantienen las tablas de paginas o paginas individuales en buffer de cache?, ¿Que ocurre con la TLB en ese caso?. Porque me puse a pensarlo y sería como que ambas compiten por el mismo objetivo sin saberlo, pero después lo reconsidere y pensé: La TLB es una cache, se implementa con registros asociativos de alta velocidad, el método de búsqueda ante un page fault, podría ser; Me fijo en la TLB si esta la pagina deseada (La TLB es varios ordenes de tiempo mas rápida que el buffer de cache ya que esta implementada con registros asociativos, mientras que el buffer de cache esta en memoria), si la pagina deseada no esta en la TLB, buscamos en el buffer de cache por un bloque que la contenga, si no esta en el buffer de cache, se busca un buffer disponible en la free list (¿Que ocurre si no hay un buffer disponible?, obviamente tendremos que esperar, ¡Pero se trata de un page fault!, debe atenderse lo mas rápido posible), si se encuentra un bloque disponible se graba en él, si el bloque disponible estaba con delayed write, se descarga a disco antes de escribir el nuevo contenido, una vez escrito se actualiza la TLB, se reinicia la instrucción desde el punto anterior como si el PF nunca hubiera ocurrido, etcétera.

Además algo que leí en el Galvin (Cariñosamente llamado "El de los dinosaurios" por mi xD) que me voló el sombrero, es que en Unix, puede estar el superblock en el buffer de cache. ¿Para que voy a querer tener el superblock en el buffer de cache?, si el superblock solo contiene la información del filesystem, como numero de cilindros, etcétera.


Muchas gracias por detenerse a leer y saludos! :D
28  Programación / Programación C/C++ / Re: Pregunta sobre estructuras de datos genericas. en: 20 Marzo 2012, 00:13 am
Gracias, había pensado algo parecido, pero no tuve en cuenta el puntero a función, voy a intentarlo y después te digo como salio xD

Saludos!
29  Programación / Programación C/C++ / Pregunta sobre estructuras de datos genericas. en: 18 Marzo 2012, 20:29 pm
Hola, tengo una duda acerca de estructuras de datos genéricas, como por ejemplo, una lista. Hacer una lista genérica que contenga diferentes tipos de datos básicos, como int, char, char* o float es sencillo; definimos un puntero a void y luego por ejemplo si queremos imprimir la lista entera bajo diferentes criterios usamos punteros a funciones que casteen el puntero al tipo adecuado de puntero. Sin embargo, si tenemos una lista genérica que adicionalmente, además de los tipos mencionados anteriormente, contiene una estructura, como por ejemplo t_Persona, que contiene los campos nombre y apellido, ambos char*, ¿Como deberíamos proceder para hacer un puntero a función que lo imprima de manera adecuada?.

Osea mi problema es que yo quiero tener una lista genérica de esa forma, tener una función imprimir que reciba la lista y un puntero a función, donde la función a la que apunta es el criterio a usar. Si yo en mi lista tengo 2, 4, a, c, 'Hola mundo!', 3.45, t_Persona(nombre: 'Jorge' apellido:'Ruiz') (Disculpen la notación de este ultimo), entonces si yo llamara a la función imprimir y le pasara la lista y la función que castea a caracteres me imprimiría: (El ASCII de 2), (El ASCII de 4), a, c, H, (Basura), (Mas basura).

Mi punto es: Si quiero imprimir usando el criterio para imprimir una persona, voy a tener que castear los punteros a void a punteros a t_Persona, con un dato que realmente sea de t_Persona no va a haber problema, sin embargo cuando este iterando y me cruce un puntero que en realidad es un puntero a float, y lo castee a tipo persona, y trate de acceder a sus miembros, esto me va a tirar un Segmentation Fault con toda la razón.

Yo pensé, entonces simplemente tendría que exigir que el resto de los elementos, como mínimo, ocupen la misma cantidad de bytes que t_Persona, de esa manera cuando los castee, me devolverán basura, pero no me tirara Segmentation Fault.

Mi duda es simple: ¿Existe una manera mas limpia de lograr mi objetivo?

Les dejo un ejemplo de mi codigo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct t_Persona {
  5. char* nombre;
  6. char* apellido;
  7. } t_Persona;
  8.  
  9. //Decimos que un puntero a void es sinonimo de una direccion.
  10. typedef void* t_Direccion;
  11.  
  12. typedef struct t_Lista {
  13. t_Direccion* dato;
  14. //El size NO lo necesitamos simplemente para saber cuantos elementos tenemos, SI lo necesitamos para seguirle la pista
  15. //A cuanto espacio tenemos que alocar.
  16. int size;
  17. } t_Lista;
  18.  
  19. //El tipo iterador contiene la lista y la posicion actual dentro de ella
  20. typedef struct t_Iterador {
  21. t_Lista* lista;
  22. //Nodo actual para recorrer
  23. int actual;
  24. } t_Iterador;
  25.  
  26. t_Iterador tIterador_Crear () {
  27. t_Iterador nue;
  28. nue.lista= (t_Lista*) malloc (sizeof(t_Lista));
  29. (nue.lista)->size=0;
  30. (nue.lista)->dato=NULL;
  31. nue.actual=0;
  32. return nue;
  33. }
  34.  
  35. void tIterador_Iniciar(t_Iterador* iter) {
  36. iter->actual=0;
  37. }
  38.  
  39. /* Notese la diferencia entre el crear y el iniciar; El crear nos crea una nueva instancia, y el iniciar
  40.  * prepara el iterador para iterar, recibiendo la lista sobre la cual va a trabajar y poniendo su posicion
  41.  * actual a cero. */
  42.  
  43. /*Un simple agregar al final*/
  44.  
  45. void tIterador_Agregar (t_Iterador* iter, t_Direccion i) {
  46. if (iter->lista->size == 0) {
  47. iter->lista->dato = (t_Direccion*) malloc (sizeof(t_Direccion)*(++iter->lista->size));
  48. } else {
  49. iter->lista->dato = (t_Direccion*) realloc (iter->lista->dato, sizeof(t_Direccion)*(++iter->lista->size));
  50. }
  51. iter->lista->dato[iter->actual++] = i;
  52. }
  53.  
  54. /*Funciones que imprimen en diferentes formatos, utilizadas para el imprimir*/
  55.  
  56. void imprimirEnteros (t_Direccion x) {
  57. printf("%i, ",*((int*)(x)));
  58. }
  59.  
  60. void imprimirCaracteres (t_Direccion x) {
  61. printf("%c, ",*((char*)(x)));
  62. }
  63.  
  64. void imprimirStrings (t_Direccion x) {
  65. printf("%s, ",((char*)(x)));
  66. }
  67.  
  68. /* No escatimes en el uso del parentesis en estos casos!!! */
  69. /* void imprimirPersonas (t_Direccion x) {
  70. printf("%s %s, ",((t_Persona*)(x))->nombre, ((t_Persona*)(x))->apellido);
  71. } */
  72. /* En estos casos hay que asegurarse de que todos los elementos tienen el mismo tamaño*/
  73.  
  74. /*El imprimir generico*/
  75. /*Nomenclatura de una funcion pasada como parametro a otra (puntero a funcion)
  76.  *TIPORETORNO (*NOMBRE)(PARAMETROS) Notese que para un puntero a funcion el asterisco se usa a la izquierda*/
  77. void tIterador_Imprimir (t_Iterador* iter, void (*criterio)(t_Direccion)) {
  78. criterio(iter->lista->dato[iter->actual]); /*Modo de uso de un puntero a funcion*/
  79. }
  80.  
  81. int tIterador_Fin (t_Iterador* iter) {
  82. return (iter->actual < iter->lista->size)?(1):(0);
  83. }
  84.  
  85. void tIterador_Avanzar (t_Iterador* iter) {
  86. iter->actual++;
  87. }
  88.  
  89. int main(int argc, char** argv)
  90. {
  91.  
  92. int a=65, b=66, c='a', d=68, e='c';
  93. char* f = "Holaaa";
  94. t_Iterador iter = tIterador_Crear();
  95.  
  96. tIterador_Iniciar(&iter);
  97.  
  98. /*Vamos a agregar los numeros del 65 al 70*/
  99. tIterador_Agregar(&iter, &a);
  100. tIterador_Agregar(&iter, &b);
  101. tIterador_Agregar(&iter, &c);
  102. tIterador_Agregar(&iter, &d);
  103. tIterador_Agregar(&iter, &e);
  104. tIterador_Agregar(&iter, f); //Look!
  105.  
  106. /*Imprimimos como enteros*/
  107. tIterador_Iniciar(&iter);
  108. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  109. while ((tIterador_Fin(&iter))) {
  110. tIterador_Imprimir(&iter, imprimirEnteros);
  111. tIterador_Avanzar(&iter);
  112. }
  113. printf("\n");
  114. /*Imprimimos como Caracteres*/
  115. tIterador_Iniciar(&iter);
  116. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  117. while ((tIterador_Fin(&iter))) {
  118. tIterador_Imprimir(&iter, imprimirCaracteres);
  119. tIterador_Avanzar(&iter);
  120. }
  121. printf("\n");
  122. /*Imprimimos como Strings*/
  123. tIterador_Iniciar(&iter);
  124. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  125. while ((tIterador_Fin(&iter))) {
  126. tIterador_Imprimir(&iter, imprimirStrings);
  127. tIterador_Avanzar(&iter);
  128. }
  129.  
  130. return 0;
  131. }

Si usaramos el imprimirPersonas obviamente nos tiraría un segmentation fault.

Muchas gracias por detenerse a leer, y saludos!
30  Programación / Programación C/C++ / Re: ¿Que dudas te genero C cuando empezaste a utilizarlo? en: 14 Marzo 2012, 17:18 pm
Muy buenas preguntas. Gracias por ayudarme! ;)

Anastacio, para vos que tenías algunas dudas aca te dejo una info sobre punteros a funciones, la podes leer cuando quieras, lo mejor cuando uno arranca C, its do like a sloth, slowy is better! jajajaj osea no te precipites. Espero que te sea de ayuda.

Para los que tienen dudas acerca de los void, el void no solo sirve para decir que una función no devuelve nada, el void sirve para manipular direcciones de memoria directamente. Imaginense lo siguiente, cuando yo declaro una variable de algún tipo, tengo una posición de memoria reservada e identificada como de ese tipo. Si yo declaro un puntero a void (void*) tengo una dirección apuntada por el puntero, en esta dirección puedo tener cualquier dirección de cualquier otro dato, ¿Para que voy a querer tener en una variable las direcciones de memoria de otros datos? Bueno porque la principal propiedad del puntero a void es que se puede castear a cualquier otro tipo de puntero, de cualquier otro tipo de dato a excepción de algunas cosas que voy a detallar en este ejemplo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //Pequeña macro que nos dice la direccion de memoria de una variable
  4. #define Address(x) printf("Address: %p\n",(&x)); fflush(stdout);
  5.  
  6. typedef void* Direccion;
  7.  
  8. int main(int argc, char** argv)
  9. {
  10. int a = 4;
  11. //Esta es la unica manera de almacenar un valor en un puntero a void.
  12. //Los punteros a void almacenan cualquier tipo de puntero.
  13. Direccion dir=&a;
  14. //No se puede asignar la direccion de una constante!
  15. //ie Direccion dir=&b; Siendo b int const b = 45;
  16. printf("-----------------\n");
  17. Address(dir)
  18. Address(dir)
  19. printf("-----------------\n");
  20. printf("a=%i\n",a);
  21.  
  22. //Vamos a modificar indirectamente el valor de la variable a
  23. *(int *) dir = 65;
  24. //Nota: Los punteros a miembros y los punteros a funciones no pueden asignarse a un puntero a void!
  25. printf("-----------------\n");
  26. Address(dir)
  27. Address(dir)
  28. printf("-----------------\n");
  29. printf("a=%i\n",a);
  30.  
  31. printf("Siguen iguales! No podemos cambiar las referencias de un puntero, pero si copiar su contenido!\n");
  32. printf("Tambien teniendo el puntero a void podemos castearlo para usar el valor al que apunta en diferentes formatos!\n");
  33.  
  34. printf("Imprimimos la variable a en char %c",(* ((char*) dir)));
  35. return 0;
  36. }

¿Y si tengo estructuras?, En ese caso se tiene que hacer que todos los elementos tengan el mismo tamaño que la estructura mas grande, sino al imprimirla o tratar con ella, supongase que tengo una estructura que pesa 12 bytes y tengo elementos de tipo int en la misma lista. Al imprimir todos los elementos, cuando quiera imprimir como del tipo de la estructura a los tipo int, va a tirar un segmentation fault. O sino tambien se puede tener una estructura "tipo nodo" que tenga un campo que permita discernir de que tipo es el elemento al que apunta.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct asd{
  4. char * n;
  5. } asd;
  6.  
  7. int main() {
  8. asd j;
  9. int* k = (int*) malloc (sizeof(asd));
  10. *k = 4;
  11. j.n = "Hola\0";
  12. void* dir=&j;
  13. printf("%s\n",((asd*)(dir))->n);
  14. printf("%i\n",(*((int*)(dir))));  
  15. dir = &k;
  16. printf("%s\n",((asd*)(dir))->n);
  17. printf("%i\n",(*((int*)(dir))));  
  18. return 0;
  19. }



Muy bien, re lindo poder castear dinámicamente cualquier otra variable, pero ¿Para que me sirve realmente?, para armar estructuras genéricas, donde puedas tener varios tipos de datos. aqui tienen un ejemplo de una lista genérica:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct t_Persona {
  5. char* nombre;
  6. char* apellido;
  7. } t_Persona;
  8.  
  9. //Decimos que un puntero a void es sinonimo de una direccion.
  10. typedef void* t_Direccion;
  11.  
  12. typedef struct t_Lista {
  13. t_Direccion* dato;
  14. //El size NO lo necesitamos simplemente para saber cuantos elementos tenemos, SI lo necesitamos para seguirle la pista
  15. //A cuanto espacio tenemos que alocar.
  16. int size;
  17. } t_Lista;
  18.  
  19. //El tipo iterador contiene la lista y la posicion actual dentro de ella
  20. typedef struct t_Iterador {
  21. t_Lista* lista;
  22. //Nodo actual para recorrer
  23. int actual;
  24. } t_Iterador;
  25.  
  26. t_Iterador tIterador_Crear () {
  27. t_Iterador nue;
  28. nue.lista= (t_Lista*) malloc (sizeof(t_Lista));
  29. (nue.lista)->size=0;
  30. (nue.lista)->dato=NULL;
  31. nue.actual=0;
  32. return nue;
  33. }
  34.  
  35. void tIterador_Iniciar(t_Iterador* iter) {
  36. iter->actual=0;
  37. }
  38.  
  39. /* Notese la diferencia entre el crear y el iniciar; El crear nos crea una nueva instancia, y el iniciar
  40.  * prepara el iterador para iterar, recibiendo la lista sobre la cual va a trabajar y poniendo su posicion
  41.  * actual a cero. */
  42.  
  43. /*Un simple agregar al final*/
  44.  
  45. void tIterador_Agregar (t_Iterador* iter, t_Direccion i) {
  46. if (iter->lista->size == 0) {
  47. iter->lista->dato = (t_Direccion*) malloc (sizeof(t_Direccion)*(++iter->lista->size));
  48. } else {
  49. iter->lista->dato = (t_Direccion*) realloc (iter->lista->dato, sizeof(t_Direccion)*(++iter->lista->size));
  50. }
  51. iter->lista->dato[iter->actual++] = i;
  52. }
  53.  
  54. /*Funciones que imprimen en diferentes formatos, utilizadas para el imprimir*/
  55.  
  56. void imprimirEnteros (t_Direccion x) {
  57. printf("%i, ",*((int*)(x)));
  58. }
  59.  
  60. void imprimirCaracteres (t_Direccion x) {
  61. printf("%c, ",*((char*)(x)));
  62. }
  63.  
  64. void imprimirStrings (t_Direccion x) {
  65. printf("%s, ",((char*)(x)));
  66. }
  67.  
  68. /* No escatimes en el uso del parentesis en estos casos!!! */
  69. /* void imprimirPersonas (t_Direccion x) {
  70. printf("%s %s, ",((t_Persona*)(x))->nombre, ((t_Persona*)(x))->apellido);
  71. } */
  72. /* En estos casos hay que asegurarse de que todos los elementos tienen el mismo tamaño*/
  73.  
  74. /*El imprimir generico*/
  75. /*Nomenclatura de una funcion pasada como parametro a otra (puntero a funcion)
  76.  *TIPORETORNO (*NOMBRE)(PARAMETROS) Notese que para un puntero a funcion el asterisco se usa a la izquierda*/
  77. void tIterador_Imprimir (t_Iterador* iter, void (*criterio)(t_Direccion)) {
  78. criterio(iter->lista->dato[iter->actual]); /*Modo de uso de un puntero a funcion*/
  79. }
  80.  
  81. int tIterador_Fin (t_Iterador* iter) {
  82. return (iter->actual < iter->lista->size)?(1):(0);
  83. }
  84.  
  85. void tIterador_Avanzar (t_Iterador* iter) {
  86. iter->actual++;
  87. }
  88.  
  89. int main(int argc, char** argv)
  90. {
  91.  
  92. int a=65, b=66, c='a', d=68, e='c';
  93. char* f = "Holaaa";
  94. t_Iterador iter = tIterador_Crear();
  95.  
  96. tIterador_Iniciar(&iter);
  97.  
  98. /*Vamos a agregar los numeros del 65 al 70*/
  99. tIterador_Agregar(&iter, &a);
  100. tIterador_Agregar(&iter, &b);
  101. tIterador_Agregar(&iter, &c);
  102. tIterador_Agregar(&iter, &d);
  103. tIterador_Agregar(&iter, &e);
  104. tIterador_Agregar(&iter, f); //Look!
  105.  
  106. /*Imprimimos como enteros*/
  107. tIterador_Iniciar(&iter);
  108. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  109. while ((tIterador_Fin(&iter))) {
  110. tIterador_Imprimir(&iter, imprimirEnteros);
  111. tIterador_Avanzar(&iter);
  112. }
  113. printf("\n");
  114. /*Imprimimos como Caracteres*/
  115. tIterador_Iniciar(&iter);
  116. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  117. while ((tIterador_Fin(&iter))) {
  118. tIterador_Imprimir(&iter, imprimirCaracteres);
  119. tIterador_Avanzar(&iter);
  120. }
  121. printf("\n");
  122. /*Imprimimos como Strings*/
  123. tIterador_Iniciar(&iter);
  124. /*Al imprimir le pasamos la funcion que va a usar como criterio de conversion*/
  125. while ((tIterador_Fin(&iter))) {
  126. tIterador_Imprimir(&iter, imprimirStrings);
  127. tIterador_Avanzar(&iter);
  128. }
  129.  
  130. return 0;
  131. }

Lo de t_Persona solamente lo deje expresado para que se sepa como se debería hacer la comparacion si se hubiera alocado el espacio suficiente.
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines