digitalmars.D.learn - declaration/initialization of multidimensional arrays
- Tyro[17] (18/18) Nov 18 2012 What is the proper way to declare a multidimensional array?
- bearophile (6/9) Nov 18 2012 In D (hopefully I have not swapped the to sizes, it's a too much
- bearophile (9/10) Nov 18 2012 That's a way to declare and initialize a dynamic array of dynamic
- bearophile (10/11) Nov 18 2012 That doesn't compile, I don't know why. The D array syntax
- bearophile (19/20) Nov 18 2012 A syntax I like is:
- Tyro[17] (3/22) Nov 18 2012 Why not simply allow new double[N][3][M]; ?
- Jonathan M Davis (7/16) Nov 18 2012 Because that declares a dynamic array of static arrays. You'd end up wit...
- bearophile (5/8) Nov 18 2012 I think with that there is some ambiguity regarding what
- Tyro[17] (2/12) Nov 18 2012 Thanks... This solved my issue. Much appreciated.
What is the proper way to declare a multidimensional array? In Java, I can do: double[][] a = new double[M][N]; D does not allow this because of two reasons. 1) M & N are variables and cannot be read at compile time even if they are explicitly initialized. Error: variable N cannot be read at compile time (sawalks) 2) double[17][17] is a static array and cannot be used to initialize a dynamic array. Error: cannot implicitly convert expression (new double[17LU][](17LU)) of type double[17LU][] to double[][] (sawalks) Assigning a length and then trying to access the values obviously will not work: double[][] a; a.length = M * N; a[i][j] = 17; // core.exception.RangeError sawalks(19): Range violation So what is the proper way to do this in D? Thanks
Nov 18 2012
Tyro[17]:What is the proper way to declare a multidimensional array? In Java, I can do: double[][] a = new double[M][N];In D (hopefully I have not swapped the to sizes, it's a too much common mistake in my D code): auto a = new double[][](M, N); Bye, bearophile
Nov 18 2012
auto a = new double[][](M, N);That's a way to declare and initialize a dynamic array of dynamic arrays. If you want to allocate something else, you need a different syntax. Example, this creates something rather different: auto b = new double[][3][](M, N); In D there are both dynamic arrays and fixed-sized arrays, thankfully. Bye, bearophile
Nov 18 2012
auto b = new double[][3][](M, N);That doesn't compile, I don't know why. The D array syntax allocation syntax is a bit of a mess. So to do that you have to write: auto b = new double[][3][](N); Or: auto b = new double[][3][N]; And then fill the arrays with a loop. Why is no one complaining about this array allocation syntax? Bye, bearophile
Nov 18 2012
Why is no one complaining about this array allocation syntax?A syntax I like is: new double[][3][](N, M) Where: - The numbers inside the [] must be always compile-time constants, and they always refer to fixed-sized arrays. - The numbers inside the () are run-time values and must be used for dynamic arrays. (They can be up to the number of empty []. No more. But maybe they are allowed to be less). This means this syntax becomes an error: int n = 5; auto a = new int[n]; You must write: int n = 5; auto a = new int[](n); This becomes allowed and allocates a fixed-sized array on the heap? auto a = new int[5]; Bye, bearophile
Nov 18 2012
On 11/18/12 8:14 PM, bearophile wrote:Why not simply allow new double[N][3][M]; ? Seems a lot more intuitive/succinct than a separate []() implementation.Why is no one complaining about this array allocation syntax?A syntax I like is: new double[][3][](N, M)Where: - The numbers inside the [] must be always compile-time constants, and they always refer to fixed-sized arrays. - The numbers inside the () are run-time values and must be used for dynamic arrays. (They can be up to the number of empty []. No more. But maybe they are allowed to be less). This means this syntax becomes an error: int n = 5; auto a = new int[n]; You must write: int n = 5; auto a = new int[](n); This becomes allowed and allocates a fixed-sized array on the heap? auto a = new int[5]; Bye, bearophile
Nov 18 2012
On Sunday, November 18, 2012 21:06:58 Tyro[17] wrote:On 11/18/12 8:14 PM, bearophile wrote:Because that declares a dynamic array of static arrays. You'd end up with a dynamic array of length N containing static arrays of length 3 containing static arrays of length M. The fact that you can declare dynamic arrays of static arrays screws with the syntax for declaring multidimensional arrays pretty thoroughly. - Jonathan M DavisWhy not simply allow new double[N][3][M]; ? Seems a lot more intuitive/succinct than a separate []() implementation.Why is no one complaining about this array allocation syntax?A syntax I like is: new double[][3][](N, M)
Nov 18 2012
Tyro[17]:Why not simply allow new double[N][3][M]; ? Seems a lot more intuitive/succinct than a separate []() implementation.I think with that there is some ambiguity regarding what coordinates are fixed-sized arrays and what dynamic arrays. Bye, bearophile
Nov 18 2012
On 11/18/12 7:53 PM, bearophile wrote:Tyro[17]:Thanks... This solved my issue. Much appreciated.What is the proper way to declare a multidimensional array? In Java, I can do: double[][] a = new double[M][N];In D (hopefully I have not swapped the to sizes, it's a too much common mistake in my D code): auto a = new double[][](M, N); Bye, bearophile
Nov 18 2012