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 Temas
Páginas: 1 2 3 4 [5] 6
41  Programación / Programación C/C++ / ¿Por que razones no se asigna memoria? en: 22 Noviembre 2010, 07:08 am
¡Buenas!

Estoy trabajando con memoria dinamica bajo Windows 7 con 4 GB de RAM. Para saber si las distintas funciones encargadas de manejarla realizan bien su trabajo estoy utilizando mensajes en forma de unsigned long. Si trabajo con fragmentos pequeños de memoria, la insercion de informacion en un punto de la memoria, el reemplazo de un fragmento por otro o la extension de un fragmento con otro funcionan bien.

El problema esta al pasar de 112 bytes. En ese momento toda operacion que conlleve el aumento de la memoria me devuelve el mensaje de que la asignacion no ha podido ser posible.

Anteriormente habia realizado un trabajo parecido bajo Windows 98 y XP y nunca me habia encontrado con este problema. Aunque tambien es verdad que he cambiado el enfoque del codigo. Ahora en lugar de que cada funcion actue sobre la memoria directamente he creado un conjunto de funciones que realizan acciones sobre la memoria y el resto de funciones utilizan estas ultimas.

¿Porque con pequeños fragmentos de memoria no tengo problema, pero cuando pasado un limite comienzan los problemas?

Dejar codigo resultaria casi imposible, porque son unos cuantos ficheros, un par con unas 450 lineas de codigo (o algo mas), con llamadas a funciones entre ellos.

Simplemente queria saber si sabiais la razon de que suceda lo descrito.

¡Saludos!

PD: No se si sera de importancia o no. Una funcion no implica una sola asignacion de memoria. En una sola llamada a las funciones que la manipulan puede haber dos o tres sentencias relacionadas con la asignacion dinamica de memoria. Lo digo por si el hecho de que se ejecuten en tan poco periodo de tiempo puede influir... Hasta ahi no llego...

¡Saludos!
42  Seguridad Informática / Criptografía / ¿la base 64, empieza por ./ o termina por +/? en: 15 Noviembre 2010, 01:01 am
¡Buenas!

Estoy realizando un programa que en cierto modo tiene relacion con lo que es cambiar un numero de base. He empezado con un algoritmo general para pasar de cualquier base entre 2 y 16 a base 10 y a la inversa. Luego me he dado cuenta de que podia ampliarlo hasta base 64, pero con esta ultima base me he encontrado con problemas de definicion. Hasta el momento he encontrado estas dos distribuciones de digitos.

- ./ - cifras del 0 al 9 - mayusculas - minusculas
- cifras del 0 al 9 - mayusculas - minusculas - +/

¿Existen mas? ¿Se utilizan las dos y tengo que detectar con cual estoy trabajando? ¿Alguna de ellas esta en desuso y puedo utilizar la otra? ¿Depende de mi elegir con cual trabajo?

¡Saludos y gracias por vuestra atencion!
43  Sistemas Operativos / GNU/Linux / [ubuntu] Problemilla ejecutando bajo VirtualBox en: 2 Noviembre 2010, 07:10 am
¡Buenas!

Recientemente he descubierto VirtualBox, y me he descargado un par de distribuciones, entre ellas Ubuntu (la que mas utilizo), para empezar a moverme un poco en sistemas GNU-Linux.

Hasta hoy tenia instalada la version 10.04, con el paquete Gues tAdditions para que la configuracion se adaptase a la del anfitrion, pero cuando he actualizado a la version 10.10 (por medio del entorno grafico), aunque he vuelto a instalar el paquete, al trabajar en modo de pantalla completa, el escritorio sigue apareciendo reducido y centrado en la pantalla, aun cuando la ultima ejecucion haya sido en pantalla completa, lo cual solia hacer que Ubuntu 10.04 entrase directamente en pantalla completa y sin problemas.

Los pasos que he seguido han sido:

- Ejecutar VirtualBox->Dispositivos->Instalar <<Guest Additions>>
- He cambiado el directorio a /media/VBOXADDITIONS_3.2.8_64453
- He ejecutado: ./VBoxLinuxAdditions-x86.run
- He reiniciado Ubuntu
- No ha habido cambios

¿Cual ha sido el error que he cometido?

¡Saludos!
44  Informática / Software / No consigo configurar aMule de forma correcta en: 31 Octubre 2010, 22:26 pm
¡Buenas!

No se si el post corresponde con la sección, si no fuese asi, trasladadlo donde corresponda.

Tengo aMule instalado en Ubuntu 10.04. Cada vez que me conecto me da ID Baja a pesar de que los puertos que he definido estan abiertos, asi que algo he hecho mal a la hora de configurarlo y no tengo ni idea de que es.

Y bueno, una pregunta que sera tonta para el que entienda del tema, pero es algo que a mi no me queda muy claro. En Opciones->Conexion, donde pone "Direccion de enlace", ¿se refiere a la IP del router? (Es lo que estoy poniendo...)

Resumiendo, ¿podeis ayudarme a configurar la conexion? Ya he estado ojeando la pagina oficial de aMule, y no he encontrado informacion... (a lo mejor no he sabido buscarla bien, no se)

¡Saludos!
45  Programación / Programación C/C++ / ¿ANSI C define almacenamiento minimo para los tipos de datos predefinidos? en: 5 Octubre 2010, 17:12 pm
¡Buenas!

Nunnca he tenido en mis manos el texto de la especificicacion de C del comite ANSI que lo estandarizo (tampoco el ISO), pero tenia entendido (posiblemente de forma erronea) que existia la siguiente correspondencia:
Código:
char -> 1byte
short-> 2 bytes
long -> 4 bytes
Y sobre numeros de coma flotante... lo mismo, no tengo ni idea.

La cuestion esta en que acabo de empezar un modulo para sacarle rendimiento a lo que se sobre programacion, y en clase nos han dicho que el estandar no define ningun tipo de rango de valores para los tipos de datos predefinidos. Yo tenia entendido que aunque no existia una definicion de maximo para cada tipo de dato, si existia una cantidad minima de bytes establecida para cada tipo.

Lo unico que he encontrado es una referencia rapida de una sola oja, que se supone que es un resumen del ANSI, en la que se especifica que char, short y long deben tener 1, 2 y 4 bytes respectivamente.

¿Alguno sabeis exactamente cual es la verdad y cual la leyenda?

¡Saludos!
46  Comunicaciones / Redes / [Jazztel] ¿Problema de IP, DNS o algun otro detalle? [solucionado] en: 14 Septiembre 2010, 04:56 am
¡Buenas!

Recientemente hemos recivido una nueva persona en nuestra casa con un portatil Toshiba que tiene unos cuatro años, con SO Windows XP (SP2). A la hora de la conexion con internet ha tenido problemas desde el principio.

La contraseña del router es correcta pero la asignacion automatica de IP y DNS parece no funcionar. Lo primero que he intentado para poder conectarme es la asignacion manual de una IP dentro del rango que acepta el router. Al hacer esto la conexion parecia ser correcta y a pleno funcionamiento, pero a la hora de querer utilizar cualquiera de los exploradores, no entra en ninguna pagina.

Lo segundo que he hecho, ha sido mirar que DNS-s figuraban de forma predeterminada en el router, y tambien las he asignado de forma manual, pero sigue sin cargar ninguna pagina.

Despues de ver si esto funcionaba o no, he hecho ping al router, y de los 4 paquetes enviados se ha agotado el tiempo de espera en todos los casos.

No conozco nada sobre redes y queria saber si podias echarme un cable para poder solucionar el problema de conexion...

¡Gracias de antemano y saludos!

PD: Si os hiciese falta algun dato adicional avisadme y os lo voy dando.

¡Saludos de nuevo!
47  Programación / ASM / Dudas sobre convenciones y particularidades... en: 26 Agosto 2010, 02:30 am
¡Buenas a todos!

Viendo que mi anterior post parece ser demasiado general, empiezo por dudas concretas.

En el libro que estoy siguiendo en este momento no comentan nada sobre la devolucion de valores (de momento) por funciones, pero he visto que la mayor parte (sino, todas) de las funciones que se utilizan, devuelven los valores en registros. Entonces planteo lo siguiente. A mi me parece "demasiado trabajo", estar pusheando o popeando registros en la pila, porque determinada funcion requiera un registro concreto para devolver un valor, o porque otra funcion pueda cambiar de forma inesperada los valores de determinados registros. Me parece mucho mas comodo dejar al usuario de la funcion escoger el registro o posicion de memoria en el que quiere guardar dicho valor. Para ello devuelvo los valores en la pila, y el usuario decide cual es el registro que mas le conviene utilizar segun sus necesidades. Para ello hay que desplazar el punetro de pila antes de pushear los parametros, para poder guardar el valor (los valores) devuelto(s). Establecer un estandar sobre esto a estas alturas en la que existe tanto codigo ensamblador para muy diversas situaciones creo que seria absurdo, asi que supondre que no esxiste una opinion unificada. Pero lo que si querria saber, aun cuando haya poca portabilidad por parte del codigo que escriba, es si actualmente existe algun tipo de "convencion" generalizada sobre la devolucion de valores por parte de las funciones.

Otra cosa que me gustaria saber, es cuales de las palabras reservadas en ensamblador son especificas de MASM32, ya que aunque el codigo de por si sea muy poco portable, me gustaria poder ensamblar el codigo creado en la mayor parte de ensambladores posibles...

Esperando que mis dudas aporten aclaraciones a mas gente a parte de a mi, me despido con...

¡Un saludo!
48  Programación / ASM / ¿Podriais darme algun consejo sobre estilo antes de avanzar mas? en: 12 Agosto 2010, 21:47 pm
¡Buenas!

Hace pocos dias empece a leer Assembly_Language_For_Intel_based_computers (solo voy por el capitulo 7). Ya tenia una pequeña base sobre las instrucciones en ensamblador gracias a que he empezado tambien a seguir el curso de ingenieria inversa de Ricardo Narvaja, asi que he ido haciendo algun ejercicio basandome en lo que habia estudiado del libro y en lo que habia visto a traves del debuger. No he tenido ningun problema ni para escribir el codigo ni para depurar los programas, pero antes de seguir avanzando, me gustaria que si podeis, los que mas tiempo llevais utilizando ensamblador, me dieseis algun consejo sobre estilo o alguna otra cosa que se pueda mejorar para obtener claridad. Se por C que es muy importante mantener el codigo ordenado y claro, pero no se si lo que estoy aplicando hasta ahora sirve solo a pequeña escala y luego al meterme en camisas de once varas acabare liado...

Bueno, aqui dejo el codigo y ¡que empieze el chaparron!

Un ultimo aviso, no he llegado a las interrupciones ni conozco la parte del API de Windows que controla la consola, asi que la entrada/salida la hago con funciones de C.

Ah, y el ensamblador que utilizo es MASM32, no se si hay diferencias con respecto al resto... solo llevo 5 dias con esto...

Código
  1. ; PROGRAMA: SWITCH
  2. ; Ejecuta un menu, recoge la opcion y despliega un mensaje segun la opcion
  3.  
  4. .386                       ; compatible con 80386 y  posteriores
  5. .model flat, stdcall       ; modo 32 bits protegido y convencion de llamadas
  6. .stack 4096                ; Tamaño de la pila...
  7.  
  8. ;=============================================================
  9.  
  10. ;stdio.h
  11. include c:\masm32\include\msvcrt.inc
  12. includelib c:\masm32\lib\msvcrt.lib
  13.  
  14. ;ExitProcess
  15. include c:\masm32\include\kernel32.inc
  16. includelib c:\masm32\lib\kernel32.lib
  17.  
  18. ;=============================================================
  19.  
  20. .data
  21.  
  22. opciones db "Escoge una opcion:",13,10,"1.",13,10,"2.",13,10,"0.Salir",13,10,">",0
  23. formatoi db "%ld",0
  24. cad1     db 13,10,"Opcion 1 escogida.",13,10,13,10,0
  25. cad2     db 13,10,"Opcion 2 escogida.",13,10,13,10,0
  26. cadsalir db 13,10,"Has escogido salir.",13,10,13,10,0
  27. endl     db 13,10,0
  28.  
  29. .data?
  30.  
  31. ;    Las dos componentes son el valor del caso y la direccion
  32. ; y de la funcion/codigo que ejecuta el codigo asociado
  33. SwitchTonto dd 4 dup(?)  ; dos elementos tipo switch case: [caso,funcion]
  34. opcion      dd ?
  35.  
  36. .code
  37.  
  38. main PROC
  39.  
  40. mov ebx , OFFSET SwitchTonto    ; cargamos la direccion de los pares valor-funcion
  41.  
  42. xor eax , eax                   ; dejamos eax a cero
  43.  
  44. mov eax , 1                     ; pasamos a eax el primer caso del switch
  45. mov [ebx] , eax                 ; lo guardamos en el primer par
  46. mov [ebx + 4] , op1             ; y copiamos la direccion de la funcion que maneja el caso
  47.  
  48. mov eax , 2                     ; lo mismo con el segundo caso del switch
  49. mov [ebx + 8] , eax
  50. mov [ebx + 12] , op2
  51.  
  52. ;do{
  53. MENU_INI:
  54.  
  55. sub esp , 4                    ;hacemos hueco en la pila para el valor de retorno
  56.  
  57. call menu                      ; desplegamos la informacion y en la pila vuelve la opcion
  58.  
  59. pop eax                        ; recogemos la opcion elegida
  60. mov esi , 2                    ; esi sera el subindice para recorrer el array del switch
  61.  
  62. SWITCH_INI:                    ; principio de la eleccion
  63.  
  64. dec esi                    ; pasamos al siguiente indice
  65. cmp esi , 0FFFFFFFFh       ; si es -1
  66. jz SWITCH_FIN              ; hemos terminado de leer el array y salimos del switch
  67.  
  68. cmp eax , [ebx + 8 * esi]  ; comparamos el valor devuelto por menu con el del caso
  69.  
  70. jnz SWITCH_INI             ; si no son iguales, vamos a comprobar el siguiente caso
  71.  
  72. ;en este punto eax ya no nos sirve, ya que hemos encontrado la opcion elegida
  73. mov eax , 8                ; calculamos el desplazamiento dentro del par valor-funcion
  74. mul esi                    ; en el que se encuentra el offset de la direccion de la funcion:
  75. add eax , 4                ; 8 * indice + 4
  76.  
  77. call DWORD PTR [ebx + eax] ; y llamamos a la funcion que maneja el caso
  78.  
  79. SWITCH_FIN:
  80.  
  81. test eax , eax                 ; si la opcion elegida no es cero (salir)
  82. jnz MENU_INI                   ; volvemos a llamar al menu
  83.  
  84. MENU_FIN:
  85. ;}while(opcion != 0);
  86.  
  87. call salir                         ; desplegamos el mensaje de salida
  88.  
  89. call crt_getchar                   ; esperamos a pulsar intro
  90.  
  91. push 0                             ; y terminamos el programa
  92. call ExitProcess
  93.  
  94. ret
  95.  
  96. main ENDP
  97.  
  98. ; long menu(void)
  99. menu PROC
  100.  
  101. pushad                             ; guardamos los registros para devolverlos como estaban
  102.  
  103. ; do{}while(opcion<0 || opcion>2)
  104. PEDIR_OPCION_INI:
  105.  
  106. push OFFSET endl               ; imprimimos una nueva linea para separar el menu de lo anterior
  107. call crt_printf
  108. add esp , 4                    ; "sacamos" el paramtro de printf de la pila
  109.  
  110. push OFFSET opciones           ; mostramos las opciones
  111. call crt_printf
  112. add esp , 4                    ; y dejamos la pila apuntando a los registros pusheados
  113.  
  114. push OFFSET opcion             ; ponemos la direccion de la variable opcion
  115. push OFFSET formatoi           ; la cadena de formato para scanf
  116. call crt_scanf                 ; llamamos a scanf
  117. add esp , 8                    ; y desplazamos la pila tantas posiciones como bytes tenian los parametros
  118.  
  119. call limpiarbuf                ; sacamos todos los datos que quedan en la entrada
  120.  
  121. mov eax , opcion               ; pasamos a eax el valor introducido
  122.  
  123. cmp eax , 0                    ; si el valor es menor que cero
  124. jl PEDIR_OPCION_INI
  125. cmp eax , 2                    ; o mayor que 2
  126. jg PEDIR_OPCION_INI            ; volvemos a pedir el dato
  127.  
  128. PEDIR_OPCION_FIN:
  129.  
  130. mov edi , esp                      ; copiamos en edi el puntero de pila
  131. mov [edi + 36] , eax               ; y guardamos la opcion elegida despues de los 8 registros y la direccion de retorno
  132.  
  133. popad                              ; dejamos los registros como estaban al entrar en la funcion
  134.  
  135. ret                                ; y regresamos
  136.  
  137. menu ENDP
  138.  
  139. limpiarbuf PROC
  140.  
  141. pushad                             ; guardamos los registros generales
  142.  
  143. ;while(getchar() != '\n')
  144.  
  145. LIMPIEZA_INI:
  146.  
  147. call crt_getchar
  148. cmp eax , 10
  149. jnz LIMPIEZA_INI
  150.  
  151. LIMPIEZA_FIN:
  152.  
  153. popad                              ; y dejamos los registros como antes de la llamada
  154.  
  155. ret                                ; volvemos
  156.  
  157. limpiarbuf ENDP
  158.  
  159. ; imprime el mensaje de que se ha elegido la opcion 1
  160. op1 PROC
  161.  
  162. pushad
  163.  
  164. push OFFSET cad1
  165. call crt_printf
  166. add esp , 4
  167.  
  168. popad
  169.  
  170. ret
  171.  
  172. op1 ENDP
  173.  
  174. ; imprime el mensaje de que se ha elegido la opcion 2
  175. op2 PROC
  176.  
  177. pushad
  178.  
  179. push OFFSET cad2
  180. call crt_printf
  181. add esp , 4
  182.  
  183. popad
  184.  
  185. ret
  186.  
  187. op2 ENDP
  188.  
  189. ; imprime el mensaje de que se ha elegido salir
  190. salir PROC
  191.  
  192. pushad
  193.  
  194. push OFFSET cadsalir
  195. call crt_printf
  196. add esp , 4
  197.  
  198. popad
  199.  
  200. ret
  201.  
  202. salir ENDP
  203.  
  204. END main
  205.  

¡Saludos!
49  Foros Generales / Foro Libre / Ingenieros.... pfffff :D en: 8 Julio 2010, 23:56 pm
Extraido del libro How Not to Program in C++ 111 Broken Programs and 3 Working Ones, or Why Does 2+2=5986. (Puede obtenerse aqui)


Pie de pagina del problema 28:

From a FORTRAN manual for Xerox computers:

    The primary purpose of the DATA statement is to give names to constants; instead
    of referring to π as 3.141592653589793 at every appearance, the variable PI can
    be given that value with a DATA statement and used instead of the longer form of
    the constant. This also simplifies modifying the program, should the value of π
    change.

¡Saludos!

PD: Para el que se lo tome demasiado en serio, es obvio que el titulo del tema es amistoso.
50  Informática / Software / [Firefox] Experimento un "cuelgue" de las descargas. en: 6 Julio 2010, 02:39 am
¡Buenas!

Ultimamente, al realizar descargas de ficheros medianamente grandes (entre 200Mb y 300Mb), hay veces que Firefox se me queda "colgado". Es decir, mantiene una tasa de transferencia de datos, pero no avanza nada. Hay veces que pausando la descarga y reanudandola consigo descargar correctamente el fichero, pero alguna otra vez me ha salido un mensaje diciendo que la conexion se ha perdido, aunque no he podido observar ninguna perdida de conexion a la hora de navegar o utilizar algun sistema de mensajeria.

¿Sabeis cual puede ser el problema? ¿Puede ser de mi equipo/red? o ¿una perdida de conexion por muy pequeña que sea afecta tanto a las descargas?

¡Gracias y saludos!
Páginas: 1 2 3 4 [5] 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines