Path: utzoo!attcan!utgpu!utstat!jarvis.csri.toronto.edu!torsqnt!tmsoft!masnet!canremote!ben.pedersen From: ben.pedersen@canremote.uucp (BEN PEDERSEN) Newsgroups: comp.lang.c Subject: Re: Large arrays in MSDOS Message-ID: <89102704095103@masnet.uucp> Date: 26 Oct 89 19:56:00 GMT Organization: Canada Remote Systems Limited, Mississauga, ON, Canada Lines: 94 Howdy Scott, Your message said, SM>I've been having a problem trying to use an array greater than 64k SM>on an msdos machine. What I have is the following: SM>char foo; SM>char FAR *bigbuf; SM>. SM>. SM>. SM>bigbug=farmalloc(125000L); SM>Then, I try to use bigbuf as a linear array: SM>bigbuf((long) some_pointer*some_num) = foo; SM>(I have compiled using the D model) SM>I am having problems with getting this to work, and I'm not sure if SM>it's something in my implementation, or my whole method is bogus. SM>Does anyone out there know if this should work? I'm not sure which compiler you are using or what the 'D model' represents but I put together the following using Zortech C under the small memory model, #include #include main() { char foo; char far *bigbuf; unsigned long some_num; foo = 'A'; some_num = 85000L; printf("\n%lu bytes of memory available\n", farcoreleft()); if((bigbuf = (char far*)farmalloc(125000L)) == NULL) { printf("\nfarmalloc failed!\n"); exit(1); } printf("\nuninitialized: *(bigbuf + some_num) == \'%c\' \ (ie. garbage)\n",*(bigbuf + some_num)); *(bigbuf + some_num) = foo; /* assign 'A' to a bigbuf location */ printf("\n initialized: *(bigbuf + some_num) == \'%c\' \ (ie. the right stuff)\n",*(bigbuf + some_num)); farfree(bigbuf); } It produced the following output on my system, 412032 bytes of memory available uninitialized: *(bigbuf + some_num) == 'l' (ie. garbage) initialized: *(bigbuf + some_num) == 'A' (ie. the right stuff) I am not quite sure about everything you seem to be attempting to do in this statement, SM>bigbuf((long) some_pointer*some_num) = foo; Since you aren't using indirection to dereference the pointer 'bigbuf', (ie. specify lvalue assignment) this would fail. The statement, as it is, is attempting to tell the compiler to assign the address of 'foo' to 'bigbuf' (and something I cannot decipher). 'bigbuf' is a pointer and to use the address space it points to as a linear array you must make use of pointer arithmetic. Locations within that address space are relative to 'bigbuf'. When assigning the pointer returned by farmalloc() to a pointer to far character you should perform explicit type conversion on that returned pointer because otherwise it is of type void (ie. unspecified type). As my example attempts to point out, the contents of bigbuf's address space are uninitialized garbage until it is explicitly initialized. I hope this is the type of information you were looking for. If not let me know if I can be more specific. Ben Pedersen, Sysop C-Power BBS --- * QDeLuxe 1.10 #2134 We're just tourists here making fools of ourselves