Я не вижу никакой причины из того, что было опубликовано, почему эти объявления Фортрана не могут быть заменены вашим любимым подходом C # для определения зубчатых массивов , то есть массива, в котором каждая строка имеет различное количество элементов (в этом случае, конечно, удваивается).
Перво-наперво, объявление, такое как
TYPE(Cell), POINTER :: PMAT(:)
не объявляет массив указателей на вещи type(cell)
, он объявляет указатель на массив вещей type(cell)
; то есть есть один указатель, а его указатель является массивом. В Фортране указатели имеют примерно две цели:
- Их можно использовать для динамического выделения памяти во время выполнения; это почти то же самое, что объявить переменную
allocatable
.
- Они могут использоваться для предоставления нескольких ссылок на одни и те же переменные и, в случае массивов, для ссылки на разные слайсы одного и того же массива. Вы узнаете, что происходит в вашем коде, если найдете переменные одного типа с атрибутом
target
. Если вы не можете, тогда использование pointer
почти наверняка является просто способом достижения динамического управления памятью.
Определение типа
TYPE Cell
DOUBLE PRECISION, POINTER :: column(:)
END TYPE Cell
объявляет cell
массивом значений типа double, сколько будет установлено во время выполнения. Затем приходит
TYPE(Cell), POINTER :: PMAT(:)
, который объявляет, что PMAT
будет массивом cell
с, и, чушь, у вас есть зазубренный массив двойных чисел. Это обычная фортрановская идиома для объявления зубчатых массивов. Как и все языки правильного мышления, он действительно рассматривает неровные массивы как мерзость, поэтому вам нужно прыгнуть через обруч, чтобы реализовать их.
Я не программист на C #, но я подозреваю, что все эти объявления могут быть реализованы в C # следующим образом:
double[][] pmat = new double[3][];
...
pmat[0] = new double[5];
pmat[1] = new double[4];
pmat[2] = new double[2];