Idl programming language IDL:使用变量名访问结构标记

Idl programming language IDL:使用变量名访问结构标记,idl-programming-language,Idl Programming Language,在前面的函数中,我创建并返回一个哈希。执行此操作后,它将散列作为结构返回,我将其用作以下函数的输入 myStruct的标记都是一个结构,每个都有一个名称和数据类型标记 我试图遍历每个标记,以找到某个数据类型出现的“名称” pro plotter, myStruct numtags = n_tags(myStruct) names = tag_names(myStruct) for varID = 0, numtags do begin if ( strc

在前面的函数中,我创建并返回一个哈希。执行此操作后,它将散列作为结构返回,我将其用作以下函数的输入

myStruct的标记都是一个结构,每个都有一个名称和数据类型标记

我试图遍历每个标记,以找到某个数据类型出现的“名称”

pro plotter, myStruct

    numtags = n_tags(myStruct) 
    names = tag_names(myStruct)
    for varID = 0, numtags do begin
       if ( strcmp( myStruct.(names[varID]).datatype, 'Temperature, Head 1')) then print, varID

    endfor

 end
尝试运行此操作后,我遇到以下错误:“类型转换错误:无法将给定字符串转换为长字符串。”


是什么导致了这个错误?我可以使用变量名访问标记吗?

您可以这样做,但不完全是这样。我认为这就是问题所在:

myStruct.(names[varID])
因为
names[varID]
是一个字符串

我假设
myStruct
看起来像这样:

myStruct = { tag1: {data:0L, datatype:'Some type'}, tag2: {data:1L, datatype:'Temperature, Head 1'}}
通常,可以通过标记名或索引访问结构。所以

myStruct.(0)
myStruct.tag1
两者都将为您提供结构的第一个标记中的第一个值(并且您可以根据需要为其他标记增加索引)。在这种情况下,这些将产生tag1中“存储”的结构

如果是这样,那么这应该是可行的:

pro plotter, myStruct

numtags = n_tags(myStruct) 
names = tag_names(myStruct)
for varID = 0, numtags-1 do begin
   if ( strcmp( myStruct.(names[varID]).datatype, 'Temperature, Head 1')) then print, names[varID]
endfor

end

您应该使用变量
varID
而不是
names[varID]
索引结构,因此您的代码应该如下所示:

pro plotter, myStruct

numtags = n_tags(myStruct) 
names   = tag_names(myStruct)
for varID=0L, numtags - 1L do begin
   if (strcmp( myStruct.(varID).datatype, 'Temperature, Head 1')) then print, names[varID]
endfor

end

请注意,您还需要更改
FOR
循环可以循环的最大索引,以防止索引错误崩溃。这是因为IDL从零开始索引,而不是从一开始。

正如@honeste_vivere所指出的,您应该将for循环的最大索引更改为numtags-1。啊,是的。我没有仔细查看原始代码。谢谢