mehr als 64k Speicher allocieren
-
Hallo zusammen,
ich programiere zur Zeit mit Borland TurboCProblem:
ich muß ein Array von unsigned Char mit einer Größe von 440000 allocierenunsigned char *xyz; xyz = malloc(440000); if(!xyz) printf("das war wohl nix");
Obiger Code funktioniert nur bis 64k - gut malloc kann halt nicht mehr...
deshalb habe ich das selbe auch mit farmalloc probiert - FehlanzeigeSelbst folgender Code funktioniert nicht:
unsigned char *xyz1, *xyz2; xyz1 = malloc(60000); // das geht noch gut if(!xyz1) printf("das war wohl nix"); xyz2 = malloc(60000); // das geht NICHT mehr gut!!!! :-( if(!xyz2) printf("das war wohl nix");
Kann man wirklich nur insgesamt 64k allocieren - oder mache ich etwas falsch???
Schon mal danke
Poolplayer
-
ich glaub, dass liegt einfach daran, dass Borland Turbo C ein DOS Compiler ist und DOS ein RealMode OS und du deswegen nicht so viel Speicher addressieren kannst. Wenn du kannst, solltest du lieber mal den Compiler wechseln. Du kannst dir mal mingw oder den djgpp angucken.
Ist aber kein ANSI C Problem
-
Ich habe es gerade mit gcc unter Linux probiert - da kann ich beliebig viel Speicher allocieren...
Doch leider soll unser Projekt (Technikerschule) unter DOS laufen.
Heißt das jetzt, daß ich wirklich keine Chance habe?
Gruß
Poolplayer
P.s.: Da ich hier neu bin - wo hätte ich diese Frage denn posten sollen?
-
Gab's bei Turbo C nicht verschiedene Speichermodelle? Je nachdem, welches Modell ausgewählt wurde, hatte man mehr oder weniger Speicher zur Verfügung... (zumindest ist das bei Turbo C++ 3.x so gewesen).
Vielleicht lässt sich Dein Problem aber auch mit weniger als 64KB Speicher lösen ...
Original erstellt von poolplayer:
.... ich hier neu bin - wo hätte ich diese Frage denn posten sollen?Im Forum für Andere Compiler;
-
Ich habe bereits "huge" als Speichermodell eingestellt...???
Version ist 3.1
Was gibt es denn sonst noch für DOS-Compiler?Gruß
Poolplayer
-
Auch hier möchte ich die Lösung des Problem schreiben - vielleicht interessiert es ja einen Leidensgenossen
Borland TurboC V3.1:
Unter Options-Debugger kann man die Heap-size einstellen.
Standardmäßig steht diese auf 64k leider kann man Sie nur auf maximal 640k erhöhen - was für mich allerdings ausreichtUnd wer unter Borland TurboC die Funktion malloc() verwendet MUß unbedingt stdlib.h bzw. alloc.h einbinden - sonst gehts net!
Und gemeiner weise kann man trotzdem Fehlerfrei compilieren - na wenn des kein BUG ist...!!!Gruß
Poolplayer
-
**Borland TurboC V3.1:
Unter Options-Debugger kann man die Heap-size einstellen.
Standardmäßig steht diese auf 64k leider kann man Sie nur auf maximal 640k erhöhen - was für mich allerdings ausreicht
**Für mehr als 640K musst du unter reinem MS-DOS dich dann mit XMS oder EMS herumschlagen.
**Und wer unter Borland TurboC die Funktion malloc() verwendet MUß unbedingt stdlib.h bzw. alloc.h einbinden - sonst gehts net!
Und gemeiner weise kann man trotzdem Fehlerfrei compilieren - na wenn des kein BUG ist...!!!
**Den Header stdlib.h musst du eigentlich immer inkludieren wenn du malloc() verwendest. Dummerweise kann man bei manchen Compilern malloc() auch ohne inkludierten stdlib.h Header verwenden. Dann allerdings erhält man eine Warning, über eine implizite Zeigerkonvertierung von void* nach was auch immer.
Deshalb statt
int* pi; pi = (int*)malloc(200, sizeof(int)); ... free(pi);
besser so:
#include<stdlib.h> int* pi; pi = malloc(200, sizeof(int)); ... free(pi);
-
Nimm DJGPP, der kann sicher mehr als 64k (glaub bis 8MB oder mehr).
Hier die URL: http://www.delorie.com/djgpp/
-
Hi,
ich habe den djgpp (nach langem suchen...) gefunden - wir haben den irgendwann mal von unserem Lehrer auf CD bekommen.Leider ist da keine soooo tolle Programmierumgebung dabei - oder gibt es da etwas besseres als dieses RHIDE (da funktioniert nicht mal die Maus unter Windooofs)???
Wenn es da was gäbe, würde ich sofort umsteigen...Gruß
Poolplayer
-
Turbo C++ 1.0 (von Borland frei runterladbarer DOS-Compiler) bietet die Funktion 'farmalloc', mit der dein Problem gelöst sein sollte. Die Funktion ist dort auch genauer beschrieben.
Allerdings ist dein Programm dann nicht mehr Ansi-C-kompatibel; 'farmalloc' ist Turbo-C-spezifisch.
-
Man könnte auch auf Betriebssystemaufrufe ausweichen, und direkt vom DOS einen Speicherblock anfordern. Ich glaub die Funktion heißt allocmem und ist in dos.h, bin mir aber nicht sicher. Ausserdem gibt sie keinen Pointer zurück, sondern eine Segmentadresse, aber das sollte in der Hilfe erklärt sein.
-
-
"Do not use allocmem and malloc functions in the same program. "
Der Satz ist Schwachsinn. Du solltest nur nicht versuchen, den allocmem-Block per free loszuwerden ...