Прошло более 25 лет с тех пор, как я сделал ФОРТРАН.
Я считаю, что ФОРТРАН, в отличие от многих других языков, выкладывает массивы в
основной столбец заказа. Это означает, что самый левый индекс
тот, который изменяется наиболее часто при обработке мульти
размерный массив в линейном порядке. однажды
максимальный размер самого левого индекса достигнут, установите его обратно в 1, предполагая, что 1 основано
индексирование, увеличение индекса следующего уровня на 1 и запуск процесса заново.
Для расчета конфигурации индекса для любого заданного смещения адреса
вам нужно знать значение каждого из 4 измерений массива. Без этого
ты не можешь сделать это.
Пример:
Предположим, ваш массив имеет размеры 2 на 3 на 4 на 5. Это подразумевает
всего 2 * 3 * 4 * 5 = 120 ячеек в матрице. Вы хотите индекс, соответствующий
до 200 байта.
Это будет (200/4) - 1 = 49-я ячейка (это предполагает 4 байта на ячейку и смещение нуля
первая ячейка).
Сначала понаблюдайте, как конкретные индексы переводятся в смещения ...
В каком номере ячейки находится элемент X (1,1,1,1)? Простой ответ: 1
На каком номере ячейки находится элемент X (1, 2, 1, 1)? Так как мы проехали
крайнее левое измерение это должно быть это измерение плюс 1. Другими словами,
2 + 1 = 3. Как насчет X (1, 1, 2, 1)? Мы ездили на велосипеде через первые два измерения
что составляет 2 * 3 = 6 плюс 1, чтобы дать нам 7. Наконец, X (1, 1, 1, 2) должно быть:
2 * 3 * 4 = 24 плюс 1 дает 25-ю ячейку.
Обратите внимание, что следующий правый индекс не увеличивается до номера ячейки
превышает произведение индексов слева от него. Используя это наблюдение, вы можете
рассчитать индексы для любого данного числа клеток, работая с самого правого
индекс слева направо следующим образом:
Максимальный правый индекс увеличивает каждые (2 * 3 * 4 = 24) ячейки. 24 входит в 49 (номер ячейки
мы хотим найти индексацию для) дважды
оставив 1 осталось. Добавьте 1 (для 1 на основе индексации), который дает нам самый правый
значение индекса 2 + 1 = 3. Следующий индекс (двигаясь влево) меняет каждую (2 * 3 = 12) ячейку. Один идет в 12
ноль раз, это дает нам индекс 0 + 1 = 1. Следующий индекс меняется каждые 2 ячейки. Один идет в 2 ноль
раз, давая значение incex 1. Для последнего (крайний левый индекс) просто добавьте 1 к любому
осталось 1 + 1 = 2. Это дает нам следующую ссылку X (2, 1, 1, 2).
Дважды проверьте, вернув его к смещению:
((2 - 1) + ((1 - 1) * 2) + ((1 - 1) * 2 * 3) + ((3 - 1) * 2 * 3 * 4) = 49.
Просто измените числа и используйте один и тот же процесс для любого количества измерений
и / или смещения.