Последняя версия DataExpress 3 beta от 9 октября 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

Массивы

Вопросы, касающиеся языка, синтаксиса.
jurist23rus
Эксперт
Сообщения: 2434
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Массивы

Сообщение jurist23rus » Чт авг 17, 2017 6:15 pm

Таким образом массив можно сравнить с книжной полкой. Где первое измерение это номер книги, а второе количество страниц. В каждой книги может быть разное количество страниц.

Хорошее сравнение. Где-то в сети видел, что трёхмерный массив сравнивают с кубиком Рубика. Ну а вот четырёхмерные массивы и далее никто представлять не хочет, говорят, что их вообще почти никогда не используют, не знаю, может врут :)
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
Ivan_Strelec
Интересующийся
Сообщения: 75
Зарегистрирован: Ср ноя 01, 2017 6:57 pm

Re: Массивы

Сообщение Ivan_Strelec » Пн ноя 06, 2017 10:41 am

Всем добрый день!

Появилась необходимость передать в процедуру массив и изменить там значения его элементов.
Написал тестовую процедурку

Код: Выделить всё

Procedure TEST(S: array of String);
begin;
  S[1] := 'Работала test';
end;   

В вызываемой процедуре описана переменная:

Код: Выделить всё

var
   Memory: array[1..400] of String;
   ............
   Memory[1] := 'Начальное значение';
  TEST(Memory);
  debug(Memory[1]);       

Как и следовало ожидать, массив передался по значению и процедура не смогла изменить элементы массива.
Если заголовок процедуры описать как

Код: Выделить всё

Procedure TEST(var Memory: array of String);

то компилятор будет ругаться на несовместимость типов при вызове процедуры. :(
И как же добиться нужного результата?
Вопрос 2: Устроил бы вариант глобальных переменных, но не знаю, как правильно их описать в скриптах DX.

Спасибо.

jurist23rus
Эксперт
Сообщения: 2434
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Массивы

Сообщение jurist23rus » Пн ноя 06, 2017 11:24 am

Пример базы покажите.
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Массивы

Сообщение YurAnt » Пн ноя 06, 2017 11:42 am

Первый вопрос наверное больше адресован admin-у, т.к. только он в курсе всех ограничений PS в DX.
Ivan_Strelec писал(а):Вопрос 2: Устроил бы вариант глобальных переменных, но не знаю, как правильно их описать в скриптах DX.

Можно попробовать через EvalExpr('setvar("переменная","значение")',nil) а чтение через EvalExpr('getvar("переменная")',nil). Ещё есть вариант напрямую с помощью MainWindow.Params.. но пока не добрался до этого и точный синтаксис не подскажу.

Аватара пользователя
Ivan_Strelec
Интересующийся
Сообщения: 75
Зарегистрирован: Ср ноя 01, 2017 6:57 pm

Re: Массивы

Сообщение Ivan_Strelec » Пн ноя 06, 2017 11:44 am

В скрипт Экспорт зарплаты вставлен отладочный кусок (строки 87-92), которым пытался разобраться с передачей массива по ссылке, а не по значению.
Вложения
AT.zip
(88.27 КБ) 21 скачивание

Аватара пользователя
Ivan_Strelec
Интересующийся
Сообщения: 75
Зарегистрирован: Ср ноя 01, 2017 6:57 pm

Re: Массивы

Сообщение Ivan_Strelec » Пн ноя 06, 2017 11:49 am

YurAnt писал(а):Можно попробовать через EvalExpr('setvar("переменная","значение")',nil)

Вряд ли это прокатит для массива, но посмотрю.

Аватара пользователя
admin
Разработчик
Сообщения: 3819
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Массивы

Сообщение admin » Пн ноя 06, 2017 12:05 pm

Ivan_Strelec писал(а):Если заголовок процедуры описать как
КОД: ВЫДЕЛИТЬ ВСЁ
Procedure TEST(var Memory: array of String);

то компилятор будет ругаться на несовместимость типов при вызове процедуры.
И как же добиться нужного результата?

В параметре процедуры указан динамический массив, а Вы пытаетесь передать в процедуру статический массив [1..400]. Используйте или динамический массив или определите новый тип. Пример:

Код: Выделить всё

type
  TArr = array [1..100] of Integer;

procedure Test(var a: TArr);
begin
  a[1] := 100;
end;

procedure Form_Create;
var
  a: TArr;
begin
  a[1] := 1;
  Debug(a[1]);
  Test(a);
  Debug(a[1]);
end;

Zenitchik
Интересующийся
Сообщения: 66
Зарегистрирован: Чт мар 08, 2018 1:07 am

Re: Массивы

Сообщение Zenitchik » Вт апр 10, 2018 5:37 pm

Если я уменьшаю размер динамического массива, данные в нём остаются или сбрасываются?

Аватара пользователя
admin
Разработчик
Сообщения: 3819
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Массивы

Сообщение admin » Вт апр 10, 2018 8:45 pm

При изменении размера массива данные остаются.


Вернуться в «Язык программирования RemObject Pascal Script.»