Я знаю, что цикл можно использовать для перемещения каждого элемента в новое место назначения, но есть ли более простое и элегантное решение проблемы? Очевидно, что MOVEA здесь не очень помогает, так как не работает с тем же массивом.
Как сдвинуть элементы массива в RPG?
Ответы (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
Сдвиг вверх требует использования временного массива или хранилища из-за перекрытия.
memmove() — Копировать байты Функция C Library может безопасно копировать перекрывающиеся области памяти слева направо или справа налево. Одно из применений для меня - сканирование строки на наличие встроенного апострофа. Если я нахожу его, я беру строку, начинающуюся с этой позиции, и перемещаю (то есть «копирую») байты на одну позицию вправо. Это приводит к двойному встроенному апострофу со всеми последующими байтами, сдвинутыми на одну позицию.
Функция также возвращает указатель на новую позицию, и я использую его (плюс 1) в качестве отправной точки для сканирования остатка строки в поисках следующего внедренного апострофа. Я зацикливаюсь до тех пор, пока сканирование не возвращает совпадений. Строка — это, по сути, просто «массив» байтов, поэтому она работает точно так же и с реальными массивами.