On Monday, June 8, 2015 at 8:28:59 PM UTC+2, Dick Jackson wrote:
> On Monday, 8 June 2015 07:49:14 UTC-7, Fabien wrote:
>> On 06/08/2015 04:15 PM, Helder wrote:
>>> Please save everything before trying it!
>>>
>>> IDL> a = dictionary('b',dictionary('c',findgen(10)))
>>> IDL> a.b['c',1:-1]
>>>
>>> ... bye bye IDL
>>
>> Nice! Crashes IDL on my 64b Linux machine, too.
>>
>> Cheers,
>>
>> Fabien
>
> I found some slightly different results:
>
> IDL> !version
> {
> "ARCH": "x86_64",
> "OS": "Win32",
> "OS_FAMILY": "Windows",
> "OS_NAME": "MicrosoftWindows",
> "RELEASE": "8.4",
> "BUILD_DATE": "Sep272014",
> "MEMORY_BITS": 64,
> "FILE_OFFSET_BITS": 64
> }
>
> IDL> a = dictionary('b',dictionary('c',findgen(10)))
>
> IDL> a.b['c',[1:-1]]
> 1.0000000 0.00000000 0.00000000
> ;; Mine does not fail like yours, but it seems wrong!
> ;; That looks like array indexing off the low end, filling in '0' as it reaches back to -1
>
> ;; This seems to get to what you want, I think!:
> IDL> a.b.c[1:-1]
> 1.0000000 2.0000000 3.0000000 4.0000000 5.0000000 6.0000000
> 7.0000000 8.0000000 9.0000000
> ;; But maybe you want the 'c' to be a string, to change it programmatically, in which case:
> IDL> (a.b['c'])[1:-1]
> 1.0000000 2.0000000 3.0000000 4.0000000 5.0000000 6.0000000
> 7.0000000 8.0000000 9.0000000
> ;; I believe the parentheses cause a temporary copy of the array(10) to be made, which may not be OK in your application
>
> ;; I wondered about modifying values in there, doesn't look good:
> IDL> a.b.c[1:-1]=42
> % Attempt to store into an expression: Structure reference.
> % Execution halted at: $MAIN$
> IDL> help,a.b.c[1:-1]
> <Expression> FLOAT = Array[9]
>
> ;; I would think that should work, too:
> IDL> c=findgen(10)
> IDL> c[1:-1]=42
> IDL> c
> 0.00000000 42.000000 42.000000 42.000000 42.000000 42.000000
> 42.000000 42.000000 42.000000 42.000000
>
> Is anyone from {Harr|Exel}|is taking notes from this? Chris, are you there? :-)
>
> Cheers,
> -Dick
>
> Dick Jackson Software Consulting Inc.
> Victoria, BC, Canada --- http://www.d-jackson.com
Hi Dick,
you're absolutely right. There is a syntax error that causes the crash.
From IDL support I learned that I should have used the following syntax to index the array::
a = dictionary('b',dictionary('c',findgen(10)))
print, a.b['c',[1:-1]]
However, as you pointed out, this delivers the wrong answer. Exelis acknowledged this (incident number 294397) and filed a bug report.
So this will give a wrong answer:
print, a.b['c',[1:-1]]
but this will be ok:
print, a.b.c[1:-1]
Cheers,
Helder
PS: Funny extra. According to the dictionary access documentation (http://www.exelisvis.com/docs/DICTIONARY.html#Access) in the example at the very button there is a code example:
------------------------------------------------------------
str = {data: FINDGEN(10)}
PRINT, str.data
PRINT, str.data[2:5] ; this works
dict = DICTIONARY('data', FINDGEN(10))
PRINT, dict.data ; this works
PRINT, dict.data[2:5] ; this will fail with an error
PRINT, dict['data', [2:5]] ; this works correctly
----------------------------------------------------------
The line commented "this will fail with an error" does not fail at all.
IDL> dict = DICTIONARY('data', FINDGEN(10))
IDL> PRINT, dict.data ; this works
IDL> PRINT, dict.data[2:5] ; this will fail with an error
IDL> PRINT, dict['data', [2:5]] ; this works correctly
0.000000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000
2.00000 3.00000 4.00000 5.00000
2.00000 3.00000 4.00000 5.00000
IDL> !version
{
"ARCH": "x86_64",
"OS": "Win32",
"OS_FAMILY": "Windows",
"OS_NAME": "Microsoft Windows",
"RELEASE": "8.4.1",
"BUILD_DATE": "Feb 17 2015",
"MEMORY_BITS": 64,
"FILE_OFFSET_BITS": 64
}
|