DM 脚本是否具有与 C++ 指针等效的功能?
Does DM scripting have an equivalent to c++ pointers?
如题。我很想知道 DM 脚本语言是否能够处理引用和指针,就像您在 c/c++ 中发现的 *a
和 &a
一样。由于 fitgaussian()
等内置函数的工作方式,我猜测该功能在某种程度上存在。如果此功能对用户开放,那么编写一些我想创建的 类 和函数会更容易。
是的,确实如此,而且它实际上与 C++ 相似。
(但脚本语言的简化使它有点模糊。)
我正在尝试阐明它:
All objects in DM (Image
, TagGroup
, Component
, ROI
, ImageDisplay
, etc. ) are automatically and always passed by reference, not value.
您可以在以下示例代码中看到这一点:
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
主脚本的实际图像img
发生变化。例程 ModifyImage
接收并使用了对图像对象的引用。
提示: 这是处理 TagGroups
时非常典型的错误来源。当一个f.e。从图像中获取标签,然后在方法中对其进行修改,它会更改图像的标签!
In order to have methods not modify the provided parameter objects passed in by reference, one has to explicitly create a clone of the object first. For this reason, all the object-types in the scripting languages provide ...clone()
commands.
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img.ImageClone() )
现在,主脚本的img
变量没有改变。 (因为我们在内存中创建一个副本,然后将引用传递给副本。)
However, primitive types (string
, number
) are by default passed by value, not reference.
同样,这可以通过一个小例子看出。
void ModifyString( string tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
此处主脚本的变量 str
未被 ModifyString
更改,因为值被传递到 tempStr
,而不是引用。 number
类型变量也是如此。
If one wants to pass a primitive type by reference, this can be denoted with a &
in the methods signature.
现在修改上面的例子:
void ModifyString( string &tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
The &
can also be used for non-primitive objects in DM, if the passed in pointer is allowed to be changed:
这是一个例子。该方法不会修改提供的图像,而是创建一个新图像并将引用传回指针。
void ModifyImage( image &imgTemp )
{
imgTemp := RealImage( "New Test" , 4, 200, 200 )
imgTemp = iradius
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
Finally: The *
operator to denote pointers is never used in DM-scripting.
如题。我很想知道 DM 脚本语言是否能够处理引用和指针,就像您在 c/c++ 中发现的 *a
和 &a
一样。由于 fitgaussian()
等内置函数的工作方式,我猜测该功能在某种程度上存在。如果此功能对用户开放,那么编写一些我想创建的 类 和函数会更容易。
是的,确实如此,而且它实际上与 C++ 相似。 (但脚本语言的简化使它有点模糊。)
我正在尝试阐明它:
All objects in DM (
Image
,TagGroup
,Component
,ROI
,ImageDisplay
, etc. ) are automatically and always passed by reference, not value.
您可以在以下示例代码中看到这一点:
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
主脚本的实际图像img
发生变化。例程 ModifyImage
接收并使用了对图像对象的引用。
提示: 这是处理 TagGroups
时非常典型的错误来源。当一个f.e。从图像中获取标签,然后在方法中对其进行修改,它会更改图像的标签!
In order to have methods not modify the provided parameter objects passed in by reference, one has to explicitly create a clone of the object first. For this reason, all the object-types in the scripting languages provide
...clone()
commands.
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img.ImageClone() )
现在,主脚本的img
变量没有改变。 (因为我们在内存中创建一个副本,然后将引用传递给副本。)
However, primitive types (
string
,number
) are by default passed by value, not reference.
同样,这可以通过一个小例子看出。
void ModifyString( string tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
此处主脚本的变量 str
未被 ModifyString
更改,因为值被传递到 tempStr
,而不是引用。 number
类型变量也是如此。
If one wants to pass a primitive type by reference, this can be denoted with a
&
in the methods signature.
现在修改上面的例子:
void ModifyString( string &tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
The
&
can also be used for non-primitive objects in DM, if the passed in pointer is allowed to be changed:
这是一个例子。该方法不会修改提供的图像,而是创建一个新图像并将引用传回指针。
void ModifyImage( image &imgTemp )
{
imgTemp := RealImage( "New Test" , 4, 200, 200 )
imgTemp = iradius
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
Finally: The
*
operator to denote pointers is never used in DM-scripting.