Есть ли у сценариев DM эквиваленты указателям на c ++? - PullRequest
1 голос
/ 09 мая 2019

Как следует из названия. Мне интересно знать, способен ли язык сценариев DM обрабатывать ссылки и указатели, как вы могли бы найти в c / c ++ как *a и &a. Я предполагаю, что такая возможность существует на некотором уровне, благодаря тому, как работают встроенные функции, такие как fitgaussian(). Если эта возможность открыта для пользователя, это облегчит кодирование некоторых классов и функций, которые я хочу создать.

1 Ответ

1 голос
/ 09 мая 2019

Да, это так, и на самом деле похоже на C ++.(Но упрощение языка сценариев немного затеняет его.)

Я пытаюсь пролить некоторый свет на это:

Все объекты в DM (Image, TagGroup, Component, ROI, ImageDisplay и т. Д.) Автоматически и всегда передаются по ссылке, а не по значению.

Это можно увидеть в следующем примере кода:

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.Когда кто-то получает тег из изображения, а затем изменяет его в методе, он изменяет тег изображения!

Чтобы иметь методы not модифицировать предоставленные объекты параметров, переданные по ссылке, сначала нужно явно создать клон объекта.По этой причине все типы объектов в языках сценариев предоставляют команды ...clone().

void ModifyImage( image imgTemp )
{
    imgTemp = irow
}

Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img.ImageClone() ) 

Теперь переменная img основного сценария не изменилась.(Поскольку мы создаем копию в памяти, а затем передаем ссылку на копию.)

Однако примитивные типы (string, number) по умолчанию передаются по значению, а не по ссылке.

Опять же, это можно увидеть на небольшом примере.

void ModifyString( string tempStr )
{
    tempStr  = "Changed"
}

string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str ) 
Result(" --> " + str )

Здесь переменная str основного скрипта не изменяется на ModifyString, поскольку значениябыл передан в tempStr, а не в качестве ссылки.То же самое верно для переменных типа number.

Если кто-то хочет передать примитивный тип по ссылке, это может быть обозначено & в сигнатуре методов.

Пример выше теперь изменен:

void ModifyString( string &tempStr )
{
    tempStr  = "Changed"
}

string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str ) 
Result(" --> " + str )

& также может использоваться для непримитивных объектов в DM, если переданный указатель может быть изменен:

Вот пример для этого.Метод не изменяет предоставленное изображение, но создает новое и передает ссылку обратно в указатель.

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()

Наконец: оператор * для обозначения указателей равен никогда не используется в DM-скриптинге.

...