February 04, 2013
monarch_dodra:

> Ideally, I wish we could allocate static arrays on the heap easily:
>
> "int[2]* p = new int[2]()"

To do that I wrap the array inside a static struct:

struct Arr {
    int[2] a;
}

Arr* data = new Arr;
writeln(data.a[1]);


> Anybody know why this doesn't work?

Maybe it's just a matter of syntax. You see it if you use:

struct Arr {
    int[2] a;
    alias this = a;
}
Arr* data = new Arr;

Now what's data[1]? It's data.a[1] or is it the second (missing) struct Arr?

So to do that you need transparent references, like "ref int[2]", that in D are only present inside functions.

Bye,
bearophile
February 04, 2013
See also:

http://d.puremagic.com/issues/show_bug.cgi?id=9265

Bye,
bearophile
February 05, 2013
On Monday, 4 February 2013 at 22:02:48 UTC, bearophile wrote:
> monarch_dodra:
>
>> Ideally, I wish we could allocate static arrays on the heap easily:
>>
>> "int[2]* p = new int[2]()"
>
> To do that I wrap the array inside a static struct:
>
> struct Arr {
>     int[2] a;
> }
>
> Arr* data = new Arr;
> writeln(data.a[1]);
>
> [SNIP]
>
> Bye,
> bearophile

Yeah... but then I do that, I also tend to smash against the initial:
//----
struct Arr {
    double[4000][4000] a;
}

Arr* data = new Arr;
writeln(data.a[1]);
//----
"Error: index 4000 overflow for static array"
//----

I don't fully understand what this means, so I haven't complained yet. Is this a "legit error" on my end, with the compiler protecting me, or a false positive, where the compiler thinks I want to allocate Arr on the stack...?
February 05, 2013
On Mon, Feb 04, 2013 at 04:58:36PM +0100, bearophile wrote:
> monarch_dodra:
> 
> >If all (but last of) the dimensions are known at compile time, then you can dynamically allocate an array of fixed sized arrays:
> >
> >//----
> >enum size_t gridSize = 4_000;
> >enum size_t total   = gridSize * gridSize;
> >static assert (total == 16_000_000); //16 million doubles total
> >static assert (total * double.sizeof == 128_000_000); //126 Megs
> >allocated
> >
> >void main()
> >{
> >    double[gridSize][] gridInfo = new
> >double[gridSize][](gridSize);
> >}
> >//----
> >
> >This will give you a dense array: Eg: all the data is contiguous in memory.
> 
> Nice. This idiom should be added to the D docs.
[...]

Added to wiki: http://wiki.dlang.org/Dense_multidimensional_arrays


T

-- 
If Java had true garbage collection, most programs would delete themselves upon execution. -- Robert Sewell
February 05, 2013
H. S. Teoh:

> Added to wiki: http://wiki.dlang.org/Dense_multidimensional_arrays

It contains:

enum columns = 100;
int rows = 100;
double[gridSize][] gridInfo = new double[columns][](rows);


gridSize is undefined. I suggest to write something like:

enum nColumns = 100;
int nRows = 120;
double[nColumns][] matrix2 = new double[nColumns][](nRows);

Bye,
bearophile
February 05, 2013
On Tue, Feb 05, 2013 at 07:38:40PM +0100, bearophile wrote:
> H. S. Teoh:
> 
> >Added to wiki: http://wiki.dlang.org/Dense_multidimensional_arrays
> 
> It contains:
> 
> enum columns = 100;
> int rows = 100;
> double[gridSize][] gridInfo = new double[columns][](rows);
> 
> 
> gridSize is undefined.
[...]

Oops, that was a typo. Fixed.

P.S. Feel free to edit the page yourself if you see a mistake. That's what a wiki is for, after all.


T

-- 
"I suspect the best way to deal with procrastination is to put off the procrastination itself until later. I've been meaning to try this, but haven't gotten around to it yet. " -- swr
February 08, 2013
04.02.2013 19:23, Sparsh Mittal пишет:
> I am allocating 2d array as:
>
> double[gridSize][gridSize] gridInfo;
>
> which works for small dimension, but for large dimension, 16Mb limit comes.
>
> Would you please tell me how do allocate a large 2d array (which has to
> be done as a dynamic array)? It is a square grid and dimensions are
> already known.
>
> I also searched internet but could not find an answer. Thanks.

A common problem. Use unstd.multidimensionalarray to obtain a sliceable multidimensional rectangular arrays (currently only implemented for dimensions count (not lengths) known at CT):
http://denis-sh.github.com/phobos-additions/unstd.multidimensionalarray.html

-- 
Денис В. Шеломовский
Denis V. Shelomovskij
February 08, 2013
04.02.2013 20:54, bearophile пишет:
> Steven Schveighoffer:
>
>> Wow, this is something I didn't know was possible.  Very useful!
>
> It's it cute when you use a language almost daily for few years,
> and then you see a new way to allocate built-in arrays? :-)

Just a small obvious note that this trick will work for every n-dimentional array.

And it's not cute when there is a sliceable
multidimensional rectangular array implementation for a few years and almost nobody knows about it.

http://denis-sh.github.com/phobos-additions/unstd.multidimensionalarray.html

From examples:
---
// The head array can be dynamic
int[4][3][] darr3 = sarr3[];
auto matrix31 = mdimArray(darr3); // Works like previous one
---

-- 
Денис В. Шеломовский
Denis V. Shelomovskij
1 2
Next ›   Last »