Как сдвинуть элементы массива в RPG?

Я знаю, что цикл можно использовать для перемещения каждого элемента в новое место назначения, но есть ли более простое и элегантное решение проблемы? Очевидно, что MOVEA здесь не очень помогает, так как не работает с тем же массивом.


person God_of_Thunder    schedule 19.09.2012    source источник


Ответы (2)


Сдвиньте вниз с помощью функции SUBARR.

 /FREE
    %subarr(array:1) = %subarr(array:2); // Shift elements
    array(%elem(array)) = *blanks;       // Reset the remaining element
 /END-FREE

C                   EVAL      %SUBARR(array:1) = %SUBARR(array:2)
C                   EVAL      array(%ELEM(array)) = *BLANKS

Сдвиг вверх требует использования временного массива или хранилища из-за перекрытия.

person James Allman    schedule 19.09.2012
comment
Является ли это полностью свободной реализацией стиля? - person God_of_Thunder; 19.09.2012
comment
@God_of_Thunder Это может быть произвольная форма или фиксированная. - person James Allman; 19.09.2012
comment
Изящный. Я полагаю, что эта функция была представлена ​​в версии V5R3, поэтому пользователи более старых версий AS/400 не смогут ее использовать. (Моя компания совсем недавно перешла с V5R2 на V5R4.) - person John Y; 20.09.2012
comment
Знаете ли вы, что мы можем полагаться на то, что элементы присваиваются слева направо? В руководстве (на которое вы ссылались) говорится, что если исходная часть массива перекрывает целевую часть массива, могут возникнуть непредсказуемые результаты (выделено мной). Для меня это означает, что если по какой-либо причине компилятор считает, что более эффективно назначать элементы справа налево (или наизнанку, или что у вас есть), он может это сделать. Даже если он всегда назначает слева направо сейчас, возможно, какая-то будущая версия компилятора выберет другое. - person John Y; 20.09.2012
comment
Джеймс – Как отмечает Джон, разве пониженная передача (как вы ее здесь используете) тоже не будет перекрываться? Видишь ли, вот почему я пытался полностью погрузиться в функциональное кодирование... - person Clockwork-Muse; 20.09.2012

memmove() — Копировать байты Функция C Library может безопасно копировать перекрывающиеся области памяти слева направо или справа налево. Одно из применений для меня - сканирование строки на наличие встроенного апострофа. Если я нахожу его, я беру строку, начинающуюся с этой позиции, и перемещаю (то есть «копирую») байты на одну позицию вправо. Это приводит к двойному встроенному апострофу со всеми последующими байтами, сдвинутыми на одну позицию.

Функция также возвращает указатель на новую позицию, и я использую его (плюс 1) в качестве отправной точки для сканирования остатка строки в поисках следующего внедренного апострофа. Я зацикливаюсь до тех пор, пока сканирование не возвращает совпадений. Строка — это, по сути, просто «массив» байтов, поэтому она работает точно так же и с реальными массивами.

person user2338816    schedule 06.04.2014