Есть ли в сценариях DM эквивалент указателям С++?

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это так, и на самом деле это довольно аналогичный для 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.

Спасибо! Это большая помощь.

R Webster 10.05.2019 13:06

@RWebster Добро пожаловать. Я рад, что здесь задают хорошие вопросы. Помогает сделать этот SO (под)-сайт действительно полезным ресурсом для написания сценариев.

BmyGuest 10.05.2019 13:08

Другие вопросы по теме