a struct as an multidimensional array index

Chris Katko ckatko at gmail.com
Sat Jun 11 03:56:32 UTC 2022


On Friday, 10 June 2022 at 17:26:48 UTC, Ali Çehreli wrote:
> On 6/10/22 08:13, z wrote:
>
> > arrays of arrays has different order for declaration and
> addressing,
> > and declaring array of arrays has different order depending
> on how you
> > declare it and wether it's static or dynamic array, *oof*)
> >
> > To give you an idea of the situation :
> > ```D
> >      int[3][1] a;//one array of 3 int
> >      writeln(a[0][2]);//first "column", third "row"
> > ```
>
> I've written about this multiple times in the past but D's way 
> is consistent for me. That must be because I always found C's 
> syntax to be very illogical on this. To me, C's problem starts 
> with putting the variable name in the middle:
>
>   // C code:
>   int a[1][3]; // Why?
>
> So, first, D moves the variable to its consistent place: after 
> the type:
>
>   int i;
>   int[N] arr;
>
> Both of those are in the form of "type and then name". Good...
>
> And then, here is the consistency with arrays: "type and then 
> square brackets".
>
>   int[] dynamicArray;
>   int[N] staticArray;
>
> So, here is where you and I differ:
>
>   int[3][1] arr;  // Ali likes
>   int[1][3] arr;  // z wants
>
> I like it because it is consistently "type and then square 
> brackets". (It so happens that the type of each element is 
> int[N] in this case.) If it were the other way, than array 
> syntax would be inconsistent with itself. :) Or, we would have 
> to accept that it is inside-out like in C.
>
> But of course I understand how it is seen as consistent from 
> C's point of view. :)
>
> And this is consistent with static vs dynamic as well because 
> again it's "type and then square brackets":
>
>   int[1][] a;  // A dynamic array of int[1]
>   int[][3] b;  // A static array of 3 int[]s
>
> Ali

This is an interesting discussion. I had noticed multi-dim arrays 
seemed backwards but I assumed I was doing something wrong and 
had other thing to worry about. I had no idea it was DIFFERENT 
for static vs dynamic arrays? That's horrifying!

Also you reminded me of a possible D bug that I ran into. I had 
classes that had circular dependencies. One had to know about the 
other, and vice-versa. And I had derived classes. But somehow, 
they would explode. I would send one reference to the others 
constructor to 'link' them together, but the reference would be 
NULL. But if I accessed the exact same variable through a global 
reference, it worked fine.

I tried ripping the affected code into a new file but the bug 
wasn't replicated. Even if I matched the compiler/linker options. 
It was super frustrating.


More information about the Digitalmars-d-learn mailing list