Thread overview | ||||||
---|---|---|---|---|---|---|
|
March 24, 2008 Associative Array Problem | ||||
---|---|---|---|---|
| ||||
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? |
March 24, 2008 Re: Associative Array Problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wolftousen Frozenwind | 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 = 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?
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 = 0; x < keys.length; x++)
{
data[keys[x]] = struct_name(); // call static opCall or other init function here
data[keys[x]].variable_name = some_int;
}
|
March 24, 2008 Re: Associative Array Problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wolftousen Frozenwind | "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
|
March 24, 2008 Re: Associative Array Problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | "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
|
Copyright © 1999-2021 by the D Language Foundation