Объявить вектор без указания его размера - PullRequest
0 голосов
/ 20 февраля 2012

Каков синтаксис в современном Фортране для объявления массива без указания его длины и разрешения компилятору определять длину из объявления?

Следующие примеры не работают:

program ONE
  real :: V = [1,2,3]
end program

program ONE
  real :: V(*) = [1,2,3]
end program

но этот пример работает:

program ONE
  real :: V(3) = [1,2,3]
end program

Почему компилятор не может вычислить необходимую длину из объявления?Есть ли способ сделать это?

Ответы [ 4 ]

5 голосов
/ 20 февраля 2012

Вы можете сделать следующее, для чего требуются две строки, объявление и исполняемый оператор:

program ONE
  real, dimension (:), allocatable :: V
  V =  [1,2,3]
end program

Это позволяет использовать функцию перераспределения Fortran 2003 при назначении.

2 голосов
/ 21 февраля 2012

Как уже отмечали другие, то, что вы хотите сделать, в настоящее время невозможно в Фортране с переменными. Однако хочу отметить, что в Fortran 2008 добавлена ​​возможность делать это для именованных констант, объявленных с атрибутом parameter. Это называется «массив подразумеваемой формы» и будет выглядеть так:

program ONE
  real, parameter :: V(*) = [1,2,3]
end program

Также можно указать нижнюю границу для массива:

program TWO
  real, parameter :: V(2:*) = [1,2,3]
end program

Хотя я еще не слышал о каких-либо компиляторах Fortran 2008, многие компиляторы, вероятно, уже реализовали это, поскольку это не кажется слишком сложным.

Возможно, если через пару лет будет опубликовано обновление к текущему стандарту, это также станет возможным для переменных, хотя можно представить, что это было бы сделано сразу, в то же время, что и для именованных констант, если бы это было легко.

1 голос
/ 20 февраля 2012

Я никогда не сталкивался с существованием того, за чем вы, похоже, следовали, конечно же, не в контексте приведенных вами примеров.Однако (но вы, вероятно, хорошо это знаете), все обстоит иначе, если вы посмотрите на подпрограммы и функции (т.е. когда ваш массив становится фиктивным аргументом), так как здесь вы можете использовать массивы предполагаемой формы , как в

subroutine ONE (V)
   real :: V(:)
end subroutine ONE

В вышеприведенном случае подпрограмма V будет иметь такое же количество элементов, что и массив, который вы передаете ONE.Однако вне подпрограммы вы должны объявить V, используя требуемое количество элементов (или сделать его размещаемым и распределять его только после того, как вы знаете, сколько элементов у него должно быть).

Надеюсь, это помогло.

0 голосов
/ 20 февраля 2012

Нет, вы должны объявить это так или иначе.Явно или (скажем) неявно, но вы должны объявить его.

То, что вы ищете, является в большей степени характеристикой динамических языков.

Вы можете иметь выделяемые массивы, размер которых равеннеизвестен во время компиляции, но вы не можете иметь массив, размер которого неизвестен во время присвоения ему значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...