www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Array references

reply Cabal <cabalN05P4M myrealbox.com> writes:
I have a ragged array hashmap ('int[][char[]] myArray') on which I would
*like* to be able to lookup the 'int[]' part and do operations on its
attributes. Eg...

,----[  ]
| int[] myRow = myArray["test"];
| if (myRow.length <= idx) myRow.length = idx + 1;
| myRow[idx] = 10;
| ...
| // other code
| ...
| int myInt = myArray["test"][idx]      // Bang! ArrayBoundsError
`----

Unfortunately I can't seem to find any way to take a reference to the
'int[]' parts I want to manipulate. Operating on the slices produced by the
above code leaves the original array attributes as they were.
Jul 22 2004
next sibling parent Cabal <cabalN05P4M myrealbox.com> writes:
For the pendants before you start :) I know that its not a hashmap, its a D
associative array - it just didn't read right and the terminology doesn't
really have a bearing on the issue at hand.

Cabal wrote:

 I have a ragged array hashmap ('int[][char[]] myArray') on which I would
 *like* to be able to lookup the 'int[]' part and do operations on its
 attributes. Eg...
 
 ,----[  ]
 | int[] myRow = myArray["test"];
 | if (myRow.length <= idx) myRow.length = idx + 1;
 | myRow[idx] = 10;
 | ...
 | // other code
 | ...
 | int myInt = myArray["test"][idx]      // Bang! ArrayBoundsError
 `----
 
 Unfortunately I can't seem to find any way to take a reference to the
 'int[]' parts I want to manipulate. Operating on the slices produced by
 the above code leaves the original array attributes as they were.

Jul 22 2004
prev sibling parent reply Stewart Gordon <smjg_1998 yahoo.com> writes:
Cabal wrote:

 I have a ragged array hashmap ('int[][char[]] myArray') on which I would
 *like* to be able to lookup the 'int[]' part and do operations on its
 attributes. Eg...

 Unfortunately I can't seem to find any way to take a reference to the
 'int[]' parts I want to manipulate. Operating on the slices produced by the
 above code leaves the original array attributes as they were.

I think you need to either feed the result back into the array, or take a pointer. myArray["test"] = myRow; after the modification. Alternatively, try ---------- int[]* myRow = &myArray["test"]; if (myRow.length <= idx) myRow.length = idx + 1; (*myRow)[idx] = 10; ---------- I don't know if this'll actually work, and I'm not in a position to test it at the mo.... Stewart. -- My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment. Please keep replies on the 'group where everyone may benefit.
Jul 22 2004
next sibling parent Cabal <cabalN05P4M myrealbox.com> writes:
Thanks for that Stewart. Works a treat. I didn't consider using pointers
with my D head on :)

Stewart Gordon wrote:

 Cabal wrote:
 
 I have a ragged array hashmap ('int[][char[]] myArray') on which I would
 *like* to be able to lookup the 'int[]' part and do operations on its
 attributes. Eg...

 Unfortunately I can't seem to find any way to take a reference to the
 'int[]' parts I want to manipulate. Operating on the slices produced by
 the above code leaves the original array attributes as they were.

I think you need to either feed the result back into the array, or take a pointer. myArray["test"] = myRow; after the modification. Alternatively, try ---------- int[]* myRow = &myArray["test"]; if (myRow.length <= idx) myRow.length = idx + 1; (*myRow)[idx] = 10; ---------- I don't know if this'll actually work, and I'm not in a position to test it at the mo.... Stewart.

Jul 22 2004
prev sibling parent Sean Kelly <sean f4.ca> writes:
In article <cdo8mi$lah$1 digitaldaemon.com>, Stewart Gordon says...
I think you need to either feed the result back into the array, or take 
a pointer.

     myArray["test"] = myRow;

after the modification.  Alternatively, try

----------
int[]* myRow = &myArray["test"];
if (myRow.length <= idx) myRow.length = idx + 1;
(*myRow)[idx] = 10;
----------

I've been wondering if it might make sense to offer a reference type specifier. So far I can think of two ways of doing it without introducing an additional keyword: // possibly confusing as this looks like a normal alias call alias int[] myRow = myArray["test"]; // a bit weird but closer in meaning to what we want to do inout int[] myRow = myArray["test"]; In both cases the variable would have to be assigned when declared, and it could not be reassigned afterwords. ie. it would work just like a reference in C++. Sean
Jul 22 2004