x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 220

Dynamic arrays from pointer

I have got a pointer to a shared memory area.
In this area there is stored lets say 10 succesitive integers.
Now I want to access each of these integers in an array like syntax.

something like this

if sharedmem[1] = 10 then ..

Is that possible, I don't know the numbers at designtime. So it should be dynamic.
0
bnz
1 Solution

Commented:
I am assuming you can't use open arrays here. In that case you're restricted to typecasting:

type
TIntArray = array[1..1000] of integer;
PIntArray = ^TIntArray;
var
SharedMem: PIntArray;
begin
SharedMem := PIntArray(...)  ;
// substitute your pointer, assuming you have it, for the three dots

// now:
SharedMem^[1] := 12;
if SharedMem^[1] = 10 then
// etc.

HTH
David

0

Commented:
Yep, David is right. In my type definition base unit I'm declaring these types (and some more) for my convenience:

type
// TAxxx = array [0..maxPossible] of xxx
TAByte         = array [0..maxInt      -1] of byte;
TAShortInt     = array [0..maxInt      -1] of shortInt;
TAChar         = array [0..maxInt      -1] of char;
TABoolean      = array [0..maxInt      -1] of boolean;
TAExtBool      = array [0..maxInt      -1] of TExtBool;
TAWord         = array [0..maxInt shr 1-1] of word;
TASmallInt     = array [0..maxInt shr 1-1] of smallInt;
TACardinal     = array [0..maxInt shr 2-1] of cardinal;
TAInteger      = array [0..maxInt shr 2-1] of integer;
TAPointer      = array [0..maxInt shr 2-1] of pointer;
TAString       = array [0..maxInt shr 2-1] of string;
TAIUnknown     = array [0..maxInt shr 2-1] of IUnknown;
TAInt64        = array [0..maxInt shr 3-1] of int64;

// TPAxxx = ^(array [0..maxPossible] of xxx)
TPAByte        = ^TAByte;
TPAShortInt    = ^TAShortInt;
TPAChar        = ^TAChar;
TPABoolean     = ^TABoolean;
TPAExtBool     = ^TAExtBool;
TPAWord        = ^TAWord;
TPASmallInt    = ^TASmallInt;
TPACardinal    = ^TACardinal;
TPAInteger     = ^TAInteger;
TPAPointer     = ^TAPointer;
TPAString      = ^TAString;
TPAIUnknown    = ^TAIUnknown;
TPAInt64       = ^TAInt64;

Now I can always use something like the following without ever getting an out-of-bounds exception:

if TPAInteger(sharedMemoryPointer)^[index] = blabla then ...

0

Author Commented:
Ahh clever :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.