Question about arrays

jerro a at a.com
Sun Apr 22 16:01:23 PDT 2012


On Sunday, 22 April 2012 at 22:17:11 UTC, Stephen Jones wrote:
> Thanks for the replies. I am still uncertain about something. 
> The documentation distinguishes between dynamic slices (int[5] 
> a = new int[5]) which are managed by the runtime, and stack 
> allocated arrays (int[5] b). The problem I have is this. I want 
> to be loading vertex positions and tex-coords of data exported 
> from Blender into openGL vertex buffers. Basically the float 
> data needs to be extracted from a file and passed up to the 
> graphic card's memory but to do so it needs to transit through 
> the CPU memory. Ideally I want to:
>     a) load the data from the file into an array built upon the 
> stack and owned by a function
>     b) generate the vbo id and send the data off to the 
> graphics card
>     c) pass the id back into a class held in managed memory
>     d) quit the function thus releasing the array on the stack
>
> My confusion is, if the syntax for both stack based and managed 
> memory arrays is the same (&v[0] or &v.ptr) then both must be 
> objects. I guess the difference is that stack based are of 
> constant length, whereas slices are dynamic because they are 
> managed by the runtime.

Dynamic arrays in D are represented with a struct containing
a pointer to the start of data and a length. Static arrays are
represented in the same way as they are in C - just the data is
saved, the length is known at compile time and the pointer to data
is computed from the stack frame pointer (or a pointer to
struct if the static array is contained within a struct) and the
offset which is also know at compile time, the same way the 
pointers
to primitive types are computed.  For example the following D 
program:

import std.stdio;

auto vp(T)(T* a){ return cast(void*) a; }

struct S
{
         int[8] a;
         int[8] b;
         int[]  c;
         int[8] d;
}

void main()
{
         S s;
         writeln( vp(&s.a) - vp(&s.a[0]));
         writeln(vp(&s.b) - vp(&s.a));
         writeln(vp(&s.c) - vp(&s.b));
         writeln(vp(&s.d) - vp(&s.c));
}

and the following C program:

#include <stdio.h>

#define vp(a) (void*)(a)

typedef struct
{
         int* ptr;
         size_t length;
} IntArray;

typedef struct
{
         int a[8];
         int b[8];
         IntArray  c;
         int d[8];
} S;

int main()
{
         S s;
         printf("%d\n", vp(&s.a) - vp(&s.a[0]));
         printf("%d\n", vp(&s.b) - vp(&s.a));
         printf("%d\n", vp(&s.c) - vp(&s.b));
         printf("%d\n", vp(&s.d) - vp(&s.c));
         return 0;
}

both print

0
32
32
16





More information about the Digitalmars-d-learn mailing list