digitalmars.D.learn - AA with dynamic array value
- Craig Dillabaugh (27/27) Jul 05 2016 How can I create (and update) and associative array where the key
- Adam D. Ruppe (2/3) Jul 05 2016 That should prolly be ~= instead of ~.
- Craig Dillabaugh (25/29) Jul 05 2016 Ahh, I was so close. Thank you that seems to do the trick.
- ketmar (11/14) Jul 05 2016 this is true for any dynamic array, including AAs. until
- Craig Dillabaugh (5/18) Jul 05 2016 Thanks for giving me the correct solution, and for the
How can I create (and update) and associative array where the key is a string, and the value is a dynamic array of integers? For example: void insertValue( int[][string]aa, string key, int value ) { int[]* keyvalue; keyvalue = ( key in aa ); if ( keyvalue !is null ) { *(keyvalue) ~ value; // This line fails. } else { int[] tmp; tmp ~= value; aa[key] = tmp; } } int main( string[] args) { int[][string] myAA; insertValue( myAA, "hello", 1 ); insertValue( myAA, "goodbye", 2 ); insertValue( myAA, "hello", 3 ); return 0; } Fails with: ...(16): Error: ~ has no effect in expression (*keyvalue ~ value) Thanks for any help.
Jul 05 2016
On Wednesday, 6 July 2016 at 01:58:31 UTC, Craig Dillabaugh wrote:*(keyvalue) ~ value; // This line fails.That should prolly be ~= instead of ~.
Jul 05 2016
On Wednesday, 6 July 2016 at 02:03:54 UTC, Adam D. Ruppe wrote:On Wednesday, 6 July 2016 at 01:58:31 UTC, Craig Dillabaugh wrote:Ahh, I was so close. Thank you that seems to do the trick. However, now I have another issue. For the following main function: int main( string[] args) { int[][string] myAA; //int[] tmp; //tmp ~= 7; //myAA["world"] = tmp; insertValue( myAA, "hello", 1 ); insertValue( myAA, "goodbye", 2 ); insertValue( myAA, "hello", 3 ); foreach (k; myAA.keys.sort) { writefln("%3s %d", k, myAA[k].length); } return 0; } If I run this, it prints out nothing. However, if I uncomment adding an element for 'world' then it prints (as expected): goodbye 1 hello 2 world 1 Why doesn't my function allow me to insert elements into an empty associative array, but succeeds for an AA with some element in it?*(keyvalue) ~ value; // This line fails.That should prolly be ~= instead of ~.
Jul 05 2016
On Wednesday, 6 July 2016 at 02:19:47 UTC, Craig Dillabaugh wrote:Why doesn't my function allow me to insert elements into an empty associative array, but succeeds for an AA with some element in it?this is true for any dynamic array, including AAs. until something is added to array, it actually a `null` pointer. i.e. arrays (and AAs) generally consisting of pointer to data and some length/info field. while array is empty, pointer to data is `null`. and when you passing your dynamic array slice/AA to function, it makes a copy of those internal fields. reallocing `null` doesn't affect the original variable. generally speaking, you should use `ref` if you plan to make your dynamic array/AA grow. i.e. void insertValue (ref int[][string]aa, string key, int value)
Jul 05 2016
On Wednesday, 6 July 2016 at 02:33:02 UTC, ketmar wrote:On Wednesday, 6 July 2016 at 02:19:47 UTC, Craig Dillabaugh wrote:Thanks for giving me the correct solution, and for the explanation. Cheers, Craig[...]this is true for any dynamic array, including AAs. until something is added to array, it actually a `null` pointer. i.e. arrays (and AAs) generally consisting of pointer to data and some length/info field. while array is empty, pointer to data is `null`. and when you passing your dynamic array slice/AA to function, it makes a copy of those internal fields. reallocing `null` doesn't affect the original variable. generally speaking, you should use `ref` if you plan to make your dynamic array/AA grow. i.e. void insertValue (ref int[][string]aa, string key, int value)
Jul 05 2016