Динамическое определение имен переменных в соответствии со строкой в ​​Фортране - PullRequest
1 голос
/ 02 марта 2012

Я хочу создать динамическое имя переменной, используя Fortran.

Имя переменной будет получено путем объединения строки и другой строки / целого числа. Затем я хочу использовать это имя переменной для хранения значения или другой переменной.

, например

! assign values to 2 variables

    my_string = h
    my_integer = 1

! perform concatenation resulting in the dynamic variable name,  h1


! Set the value of variable h1 to another integer value

    h1 = 5

Ответы [ 4 ]

3 голосов
/ 02 марта 2012

Боюсь, что вы не сможете этого сделать. Fortran требует, чтобы переменные имели имена и типы во время компиляции. Вы (или другие СО) можете придумать какой-нибудь клудж для имитации того, что вы хотите, но это будет клудж.

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

EDIT

Ну, я подумал об этом еще немного, и вот клудж, незаконченный. Сначала UDT для «динамических» переменных:

type dynamic_var
  character(len=:), allocatable :: label
  class(*), allocatable :: value
end type

объявить некоторое пространство для таких переменных:

type(dynamic_var), dimension(:), allocatable :: run_time_vars

и, работая с исходными данными

allocate(run_time_vars(10)) ! No error checking, reallocate if necessary
! lots of code
write(run_time_vars(1)%label,'(a1,i1)') my_string, my_integer
allocate(run_time_vars(1)%value, source = my_value)

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

  • Запись в поле метки неверна.
  • Источник распределения в поле значения, кажется, не работает правильно. Может потребоваться написать функцию 'decode' для использования следующим образом:

    allocate (run_time_vars (1)% value, source = decode (my_value))

Как я уже сказал, это клудж.

2 голосов
/ 02 марта 2012

Я думаю, что вы хотите использовать структуру данных. Если у вас есть пары или группы значений, которые объединяются, то создайте производный тип данных, который может содержать оба. На этой странице есть объяснение:

http://web.mse.uiuc.edu/courses/mse485/comp_info/derived.html

Если у вас есть список этих пар (например, ваша строка и int выше), вы можете создать массив этих типов. Пример кода ниже взят со страницы, указанной выше:

type mytype
   integer:: i
   real*8 :: a(3)
end type mytype

type (mytype) var

Массив:

type (mytype) stuff(3)

var%i = 3
var%a(1) = 4.0d0
stuff(1)%a(2) = 8.0d0

Значительным преимуществом этого является то, что вы можете передавать пары / группы элементов в функции / подпрограммы вместе. Это важный принцип программирования, называемый инкапсуляцией, который широко используется в парадигме объектно-ориентированного программирования.

1 голос
/ 03 марта 2012

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

Вместо использования переменных h , объединенных с 1, 2 или любым другим числом, почему бы не создать массив h (1: N) , где N не нужно знать во время компиляции: нужно просто объявить массив h как выделяемый.

ЭтоЯ думаю, законным путем в Фортране 90+.

1 голос
/ 02 марта 2012

Нет, в Фортране это невозможно.

Для получения дополнительной информации смотрите Отражение (компьютерное программирование) .

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