Autor Tema: Palabras del diccionario en un archivo de texto

0 Usuarios y 1 Visitante están viendo este tema.

16 Julio, 2009, 04:51 pm
Respuesta #10

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Estas haciendo esto para alguna materia de tu colegio o estas aprendiendo por tu cuenta?

Si es para tu colegio creo que deberias preguntarle a tu profesor de que manera hay que resolver el problema. Seguramente debes utilizar alguna tecnica que te dieron en clases.

Si estas por tu cuenta, te sugiero utilizar un lenguaje mas moderno, sino recuerdo mal los lenguajes para DOS tenian la limitacion de manejar como maximo 64Kb de manera contigua. Pero existen compiladores modernos, que siguen funcionando en DOS, que no tienen tales limitaciones, por ejemplo FreePascal (para pascal), DJGPP (para c++), tambien esta FreeBasic (para basic).
.

16 Julio, 2009, 07:26 pm
Respuesta #11

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 327
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Estoy practicando para un final haciendo un programa útil en C, pero si no se puede no se puede :( .

31 Julio, 2009, 11:00 am
Respuesta #12

malpas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 17
  • Karma: +0/-0
  • Sexo: Masculino
Hola Watt.

No entiendo lo de la pila de 64kb y el heap.

Lo primero, el concepto de segmento de memoria es cuando una cpu está en modo real y actualmente ningun SO trabaja en ese modo salvo msdos.
Pero como seguramente estás trabajndo sobre windows y que tienes una cpu actual de 32 bits (supongamos) deberías saber que tu programa dispone de 4Gb de memoria disponible en el heap. Debes guardar el fichero proyectado en memoria en un array de chars que reservarás con la función malloc() y ya está.

Si realmente tienes un límite de 64 Kb, pues lo que puedes hacer es cargar por trozos, comparar y luego liberar ese trozo, cargar otro y volver a comparar.

09 Agosto, 2009, 05:22 am
Respuesta #13

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 327
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Tengo entendido que el SO subdivide la memoria en segmentos de 64 Kb, y que con los punteros que trabajo son los denominados "near" porque trabajan en el mismo segmento y solo miden 2 bytes. Si estuviera trabajando en varios necesitaría punteros "far" porque ellos ya medirían 4 bytes al necesitar la dirección del segmento y el offset(direccion dentro del segmento).

El heap o data segmente es una pila que crece desde el principio del segmento con los elementos globales del programa(como variables globales o espacio en memoria dinámica como la que reservas con malloc), y el stack es otra pila que crece a partir del fin del segmento que almacene las variables locales y direcciones de retorno de las funciones). Tal vez las conocías con otro nombre pero básicamente son dos pilas enfrentadas para que se pueda usar la máxima capacidad del segmento.

13 Agosto, 2009, 01:56 pm
Respuesta #14

malpas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 17
  • Karma: +0/-0
  • Sexo: Masculino
Hola Watt.

A ver; creo que tienes conceptos mezclados y te lías.

Lo primero, para hacer lo que quieres hacer no hace falta saber cómo es el modelo de memoria de la maquina donde se ejecute tu programa ni complicarte la vida en temas de ese estilo. Pero bueno, te explico cómo es el modelo de memoria que se usa ACTUALMENTE.

El concepto de memoria segmentada ya no se usa hoy día, ya que no es necesario. Olvídate de segmentos, punteros far, near y cosas así.
En las viejas cpu x86 de 16 bit (anteriores al 386) el bus de direcciones que dejaba el pc era de 20 bits, con lo que el máximo de direccionamiento era de 1024 Kbytes
Estas cpu trabajaban en un modo llamado modo real y el modelo de memoria que usaba era el segmentado que, como has dicho, dividía la memoria de la máquina en segmentos de 64kb. Eso se hacía para que la cpu de 16 bits pudiera direccionar el mega de memoria que te dije antes. Ten en cuenta que 16 bits de bus de direcciones no dan para acceder a ese mega. Aún así el DOS (por ejemplo) no dejaba acceder a posiciones de memoria supieriores a 640 KB. Pero eso ya es otra historia.
Sólamente el MSDOS trabajaba en modo real y, como sabes, este SO ya ha pasado a mejor vida. Windows ya no lo lleva incluído y lo único que hace es emularlo malamente para poder correr viejos programas del dos que aún son útiles.

Hoy en día, los SOs conmutan la cpu a modo protegido. Esto permite el concepto de memoria virtual.
La memoria virtual es el modelo que usan todos los SOs actuales y consiste en dividir la memoria de la máquina (llamada memoria principal) en páginas de un determinado tamaño. Lo que se divide es todo el espacio direccionable por la cpu es decir, si la cpu es de 32 bits la memoria virtual será de 4GB; haya o no haya 4GB instalados en tu máquina (por eso se llama virtual)
Posteriormente se obtiene la memoria real de tu máquina y se dejan en ella las páginas que quepan desde la memoria virtual.

Si tu programa accede a una posición de memoria superior a la que hay en tu máquina, el SO se encarga de buscar la página donde está esa dirección, cargarla en la memoria principal y ya está. Tu programa ni se entera.

Eso implica que un programa tuyo tendrá 4GB de memoria disponibles. No importa  si tu pc tiene 64 MB de memoria real, el SO se encargará de hacer creer a tu aplicación que tiene 4GB ya que la cpu es de 32 bits.

Lo cual, usa malloc() para reservar la memoria que te haga falta para cargar ese fichero y no te compliques la vida.

El heap en este caso puede ser de hasta 4GB y es ahí donde debes reservar la memoria de ese fichero a cargar 8eso eslo que hace la función malloc())

El stack que se reserva depende de cada compilador, puedes variarlo. Pero para hacer eso que quieres no debe preocuparte para nada ese tamaño.
Bueno, debería preocuparte si declaras localmente un array enorme para meter los datos; pero eso es una ñapa. Usa malloc como te he dicho varias veces.

Lo único que me queda por decir es: ¿estás usando el TurboC? Ese compilador es prehistórico y era para DOS en modo real. Si es así, activa el  modelo de memoria Flat.