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.