Как следует из названия. Мне интересно узнать, способен ли язык сценариев 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
. Когда один ф.э. получает тег из изображения, а затем изменяет его в методе он меняет тег изображения!
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.
@RWebster Добро пожаловать. Я рад, что здесь задают хорошие вопросы. Помогает сделать этот SO (под)-сайт действительно полезным ресурсом для написания сценариев.
Спасибо! Это большая помощь.