Dynamischer Speicher größer 64K bei Turbo C 3.0 unter DOS möglich??



  • Hallo an alle Experten,
    ich programmiere gerade ein bißchen rum mit Turbo C 3.0 (ja, richtig, ich verwende sozusagen prähistorische Werkzeuge, weil ich in einem uralten Computerbuch eine Programmvorlage gefunden habe, die ich etwas aufbohren will ...), erzeuge dabei ein DOS-Programm.
    Das Speichermodell ist Large. Ich brauche zusammenhängenden dynamischen Speicher größer als 64K, z.B. 200K. Also verwende ich farmalloc(). Funktioniert auch, ich kriege ordnungsgemäß einen Zeiger auf die gewünschte Speichergröße zurück.
    Aber: Bei Beschreiben des Speichers mit mehr als 64K Daten (in einer hochzählenden Schleife) ist das Programm danach korrumpiert. Ein probeweiser Einbau von heapcheck() zeigt, daß der Heap nach dieser Schreibroutine tatsächlich zerstört ist.

    Beim Debuggen des Programms zeigt sich auch, daß es mit der Adressierung jenseits der 64K Probleme gibt, d.h., mein Programm kann gar nicht höher addressieren, sondern beschreibt jenseits von 64K den Bereich wieder von Anfang an.

    Vielleicht ist die Frage trivial: Kann man unter DOS ein für alle mal nur 64K adressieren, egal, welches Speichermodell? Oder gibt es da irgendeinen Trick, daß der Compiler selbständig einen anderen Adressierungsmodus verwendet?
    Und: Wenn ich mit Turbo C++ 3.0 ein Windows-Programm erzeugen würde, löst sich das Problem dann von selbst?

    Vielen Dank für eure Antwort!



  • Oh lang, lang ist das her 😉

    Bei den frühen PC adressierte man in 64k Blöcken wie du ja schon gemerkt hast.
    Diese 64k wurden logischerweise mit 16bit = "Leitungen" realisiert. Um mehr
    Speicher adressieren zu können wurden zunächst 4bit dieser 16bit noch mal
    adressiert um weiter 16 64k Blöcke ansprechen zu können. Meiner Kenntnis nach
    wurde der Speicher bei Rechnern, die dann noch mehr Speicher adressieren konnten
    eigentlich meist anders angesprochen. Aus Kompatibilitäsgründen hatte Bill Gs.
    Firma jedoch Relikte aus dieser Zeit auch noch in Windows 98.

    Es gab damals Tools, die es erlaubten mehr Speicher zu nutzen.
    Einige Compiler hatten auch solche Tools bei der Auslieferung dabei.
    Bei den Speichermodellen beim Turbo C 3.0 hast du meiner Erinnerung nach
    die Möglichkeit unter verschiedenen Speichermodellen zu wählen.

    Hoffe mal das ich das noch halbwegs zusammengekriegt habe.

    Hier noch ein Link zu dem Thema:
    http://www.fh-zwickau.de/doc/prmo/pmtutor/text/r_phys3.htm

    viel Spaß mit dem Turbo



  • irgend ein 16bit/32bit-problem. turbo C 3.0 halte ich eigentlich für zuverlässig, denn mit Borland C++ 3.1 habe ich sehr sehr lange gespielt und nie Probleme gehat.
    mir ist nicht klar, wie du allokiert hast. war es ein long oder ein int, der die speichergröße beinhaltete? dein size_t sollte groß genug sein, aber 4000*4000 ist nu ein int.
    hast du auch wirklich far-zeiger verwendet, um im speicher rumzuspringen? hast du auch wirklich long oder size_t als arrayindex benutzt?


Anmelden zum Antworten