Начинающий читает код на фортране, но не могу понять этот бит - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь понять код на Фортране для стажировки, но я программист на С ++ и застрял в том, что делает этот бит кода. кто-нибудь может просветить меня?

real(kind=kind_real), pointer :: c(:,:,:)  (I think this created a pointer to a matrix )

self%c => self%gfld3d(:,:,ioff+1:) (this is in the constructor of the class)

flds%c(ibx,iby,2:flds%nc*flds%nl:2) (this is a function that calls the c variable of the class but I don't understand how the parameters work and what does the colon operator do as a a parameter)

Ответы [ 2 ]

5 голосов
/ 24 июня 2019
  • real(kind=kind_real), pointer :: c(:,:,:)

Как вы уже написали, эта строка объявляет переменную-указатель c, которая указывает на трехмерный массив из real чисел вида kind_real.Двоеточие здесь означает, что размеры для каждого измерения пока неизвестны.Предполагая, что это внутри блока type, c является членом типа.Обратите внимание, что в Fortran () используется как для индексов массива, так и для вызовов функций.

  • self%c => self%gfld3d(:,:,ioff+1:)

В конструкторе указателю назначается цель, который является частью трехмерного массива self%gfld3d, который также является членом того же типа.Указатели в Fortran содержат информацию о размерах фрагмента массива, на который они указывают.В этом случае первые два двоеточия означают, что срез массива охватывает все два первых измерения целевого массива.ioff+1: означает, что в третьем измерении цель указателя включает все значения в self%gfld3d, начиная с заданного значения ioff+1.Это упрощенный случай общего обозначения среза, где a(start:end:step) представляет срез массива a, начиная с индекса start и заканчивая end, с шагом step.

  • flds%c(ibx,iby,2:flds%nc*flds%nl:2)

Исходя из вышеизложенного, это не вызов функции.Это выражение, которое оценивает одномерный несмежный срез массива.Начиная с цели flds%c, по индексам ibx и iby в первых двух измерениях, она содержит каждое второе значение в третьем измерении, начиная с индекса 2 и заканчивая flds%nc * flds%nl.Первые два измерения в выходном массиве не учитываются, поскольку индексы в этих измерениях являются простыми скалярами.Это выражение не может быть само по себе в утверждении, поэтому я предполагаю, что вы оставили какую-то часть строки в своем вопросе.

2 голосов
/ 24 июня 2019

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

real(kind=kind_real), dimension(3) :: a
real(kind=kind_real), dimension(0:2) :: b
real(kind=kind_real), dimension(5:7) :: c

Эти три статических, реально значимых массива имеют по три элемента каждый. Массив 'a' начинается с элемента a (1), массив b - с элемента b (0), а c - с элемента c (5)

...