## Structure by index

bmb
Posts: 13
Joined: 2015-11-16
Location: United States

I just had a quick question about structures. Is there a way to reference a structure item using a numerical index? For example, if I want the 5th item in a structure called 's', I'd like to reference it using s[4].

Thanks,
Ben

thomas_braun
Posts: 567
Joined: 2009-10-07
Location: Germany

No this is not possible AFAIK. It would be nice though.

jjweimer
Posts: 1325
Joined: 2007-08-14
Location: United States

You can create a structure only with a field defined as an array or with a wave. Is this not what you want?

```STRUCTURE myWaveStructure
variable var[10]
END STRUCTURE

Function ...

STRUCT myWaveStructure mws
mws.var[4] = 4.56
...
end```

--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAH

_sk
Posts: 111
Joined: 2014-10-28
Location: Switzerland

If you know the elements size you can do something like:

```structure thunk_s
int32 a
int32 b
endstructure

structure thunk_res
int32 res //same type as a and b
endstructure

function thunk_struct()
struct thunk_s s
struct thunk_res r
s.a = -5
s.b = 5

make/o/n=1 w_s
structput/b=0 s, w_s // w_s stores now struct s as a wave in an understandable but not a standard binary form

variable v_sz = dimsize(w_s,0)/4 //4 is size of the int32 in the wave w_s
variable i = 0
do
duplicate/o/r=[i*4,(i+1)*4-1] w_s, w_0
structget/b=0 r, w_0

// do something with r.res, i-th int32 element of stuct s
print r.res

i+=1
while (i != v_sz)
end```

The key functions are `structget` and `structput`. Of course, knowing what is the structure has influenced me in the implementation of the code, maybe you can abstract it away. I don't know how.

best,
_sk

thomas_braun
Posts: 567
Joined: 2009-10-07
Location: Germany

@_sk: Nice hack!

Posts: 1936
Joined: 2007-06-29
Location: United States

thomas_braun wrote:
@_sk: Nice hack!

I tried, and can't let this pass.

Ew. Can't say I agree, and I almost always agree with Thomas! This has all the bad elements of FORTRAN Common blocks, or C unions. I would only use this if there is no other way.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com

_sk
Posts: 111
Joined: 2014-10-28
Location: Switzerland

johnweeks wrote:
thomas_braun wrote:
@_sk: Nice hack!

I tried, and can't let this pass.

Ew. Can't say I agree, and I almost always agree with Thomas! This has all the bad elements of FORTRAN Common blocks, or C unions. I would only use this if there is no other way.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com

Yeah, it ain't pretty, you can say that again. The implementation is ugly due to `structput` and the way it dumps the struct in the wave. If `structput` were to dump type annotated data, it would've been a thing of beauty™.

Next time.

best,
_sk

_sk
Posts: 111
Joined: 2014-10-28
Location: Switzerland

thomas_braun wrote:
@_sk: Nice hack!

@thomas_braun: Cheers

best,
_sk

Posts: 1661
Joined: 2007-06-21
Location: United States

There is a problem with using StructPut and StructGet - they do not work with reference variables such as WAVE, NVAR, SVAR and DFREF. The reason is that these are effectively pointers and the object pointed to may not exist when StructGet needs to restore them.

They also do not work with Strings because they are implemented internally using pointers to variable-length data.

It is possible to define a structure containing an array of structures and index into that. Here is an example:

```Structure SubStruct
Variable var
EndStructure

Structure MainStruct
STRUCT SubStruct sub[100]
EndStructure

Function Demo()
STRUCT MainStruct ms

Variable i

for(i=0;i<10; i+=1)
ms.sub[i].var = i
endfor

for(i=0;i<10; i+=1)
Print i, ms.sub[i].var
endfor
End```

A limitation is that an array of STRUCTs is limited to 100 elements.

bmb
Posts: 13
Joined: 2015-11-16
Location: United States

thanks for the input everyone. I think @hrodstein wins for the easiest to implement solution. I came across this problem by trying to transcribe some matlab code into Igor. On a similar topic, the ability to list out the elements of a structure, their data types, size, etc. could be pretty useful - maybe a StructInfo command similar to TraceInfo.

jtigor
Posts: 401
Joined: 2007-09-04
Location: United States

bmb wrote:
... On a similar topic, the ability to list out the elements of a structure, their data types, size, etc. could be pretty useful - maybe a StructInfo command similar to TraceInfo.

I agree. This would, I think, allow one to create generic functions to store and retrieve all elements of a structure to and from a data folder without knowing beforehand the details of the structure.

thomas_braun
Posts: 567
Joined: 2009-10-07
Location: Germany

@bmb: Maybe https://github.com/quantixed/R-MATLAB-IGOR-CheatSheet comes in handy for translating Matlab to Igor.