000
09.10.2006, 14:13 Uhr
KBlaubaer
|
Hi Leute, ich möchte mehr als 64k-Speicher dynamisch zuweisen, es klappt halbwegs, aber nicht so ganz... Wer kann helfen? Ich nutze MS-DOS, Borland-C, Speichermodell large, auch schon mit "huge" probiert, ändert aber nix, alle anderen Einstellungen auch schon durchgespielt (denke ich zumindest) Ich brauche mehrere Felder, welche zum Teil im selben(!) Speicherbereich liegen sollen. Dazu initalisiere ich ein großes und verteile dann die Adressen der anderen darin. Soweit so gut, das mit dem "wertptr_all" scheint auch gut zu funktionieren, doch mit dem Feld wert_a, gehts nicht, sobald ich über die magischen 64KB komme spiegelt der wieder in die niederen Adressen.(siehe 130) Das führt also zu folgender Ausgabe: ---------------------------- ok add 0; wert 123 add 1; wert 124 add 16; wert 130 add 1600; wert 125 add 3200; wert 126 add 6400; wert 127 add 12800; wert 128 add 16360; wert 129 add 73727; wert 99 ----------------------------
das Programm dazu:
Code: |
#include <stdio.h> #include <stdlib.h> #include <alloc.h>
typedef unsigned long huge* wert_all; // wert_all[0x12000L]; typedef unsigned long huge (*wert_a)[40][40]; // wert_a[40][40][40]; typedef unsigned long huge (*wert_b)[128][128]; // wert_b[4][128][128]; typedef unsigned long huge* wert_c; // wert_c[4096]; typedef unsigned long huge* wert_d; // wert_d[4096];
wert_all wertptr_all; wert_a wertptr_a; wert_b wertptr_b; wert_c wertptr_c; wert_d wertptr_d;
int main() { unsigned long i;
wertptr_all = (wert_all)farmalloc(0x12000L*sizeof(unsigned long)); if(wertptr_all == NULL) printf("error\n"); else printf("ok\n");
// ich weise allen Feldern zunächst die selbe Startadresse zu wertptr_d = (wert_d)wertptr_all; wertptr_c = (wert_c)wertptr_all; //+ 0x1000); wertptr_b = (wert_b)wertptr_all; //+ 0x2000); wertptr_a = (wert_a)wertptr_all; //+ 0x2000);
for(i=0;i<0x12000L;i++) wertptr_all[i] = 0L; // alles 0
wertptr_a[0][0][0] = 123; wertptr_a[0][0][1] = 124; wertptr_a[1][0][0] = 125; wertptr_a[2][0][0] = 126; wertptr_a[4][0][0] = 127; wertptr_a[8][0][0] = 128; wertptr_a[10][9][0] = 129; wertptr_a[10][10][0] = 130;
wertptr_all[0x11fff] = 99;
for(i=0;i<0x12000L;i++) if(wertptr_all[i] != 0L) printf("add %ld; wert %ld\n",i,wertptr_all[i]);
getchar(); return 0; }
|
|