www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Associative Array Problem

reply Wolftousen Frozenwind <eliot.darkwolf gmail.com> writes:
I'm trying to have an associative array with the key value of type ushort.
\
struct struct_name
{
     int variable_name;
}

ushort[some_number] keys;

//fill keys

//declare my associative array
struct_name[ushort] data;

//in a loop, filling data
for(x = 0; x < keys.length; x++)
     data[keys[x]].variable_name = some_int;

I get an array out of bounds error when running this.  Any one help?
Mar 24 2008
next sibling parent "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
On Mon, 24 Mar 2008 20:29:23 +0100, Wolftousen Frozenwind  =

<eliot.darkwolf gmail.com> wrote:

 I'm trying to have an associative array with the key value of type  =
 ushort.
 \
 struct struct_name
 {
      int variable_name;
 }

 ushort[some_number] keys;

 //fill keys

 //declare my associative array
 struct_name[ushort] data;

 //in a loop, filling data
 for(x =3D 0; x < keys.length; x++)
      data[keys[x]].variable_name =3D some_int;

 I get an array out of bounds error when running this.  Any one help?
My guess would be that data[keys[x]] does not yet exist when you attempt= = to set its member variable_name. If I am correct, this should work instead: for(x =3D 0; x < keys.length; x++) { data[keys[x]] =3D struct_name(); // call static opCall or other in= it = function here data[keys[x]].variable_name =3D some_int; }
Mar 24 2008
prev sibling parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
"Wolftousen Frozenwind" wrote
 I'm trying to have an associative array with the key value of type ushort.
 \
 struct struct_name
 {
     int variable_name;
 }

 ushort[some_number] keys;

 //fill keys

 //declare my associative array
 struct_name[ushort] data;

 //in a loop, filling data
 for(x = 0; x < keys.length; x++)
     data[keys[x]].variable_name = some_int;

 I get an array out of bounds error when running this.  Any one help?
two problems in your for loop. One is: for(x = 0; x < keys.length; x++) Since keys is an associative array, the keys are not guaranteed to be sequential. You should do: foreach(x; keys) // compiler implies that x is the value type of your AA. This also is more efficient than doing the key lookup for each loop. The second problem is your data statement. Just accessing an array element does not create it (this is unlike C++'s std::map). You must create it with an assign statement: foreach(x; keys) { struct_name sn; sn.variable_name = some_int; data[x] = sn; // this creates the element in the array. } -Steve
Mar 24 2008
parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
"Steven Schveighoffer" wrote
 "Wolftousen Frozenwind" wrote
 I'm trying to have an associative array with the key value of type 
 ushort.
 \
 struct struct_name
 {
     int variable_name;
 }

 ushort[some_number] keys;

 //fill keys

 //declare my associative array
 struct_name[ushort] data;

 //in a loop, filling data
 for(x = 0; x < keys.length; x++)
     data[keys[x]].variable_name = some_int;

 I get an array out of bounds error when running this.  Any one help?
two problems in your for loop. One is: for(x = 0; x < keys.length; x++) Since keys is an associative array, the keys are not guaranteed to be sequential. You should do: foreach(x; keys) // compiler implies that x is the value type of your AA.
Err... I might be wrong on this :) If some_number is a value and not a type, then you have declared a static array. But I do believe that foreach would make an easier-to-read version of your code at least. -Steve
Mar 24 2008