2015-06-08 3 views
1

В некотором унаследованном коде, я нашел следующую строкуразмера Настройки() скаляр

size(k)=N 

Что (если что-нибудь) делает это делать? Насколько мне известно, нет смысла устанавливать size(thing) значение в Fortran.

Кроме того, k неявно определяется как скаляр integer (то есть там, где он не объявлен в исходном файле), он используется как счетчик циклов. N также integer, считывается из файла.

Если я окружаю заявление с отладочных гравюр,

write(0,*) size(kkk), N, kkk 
size(kkk)=N 
write(0,*) size(kkk), N, kkk 

я получаю выход, как в следующем:

-619273800   601   1 
     601   601   1 
    11007   595   2 
     595   595   2 
-619273800   620   3 
     620   620   3 
    11007   595   4 
     595   595   4 
     0   617   5 
     617   617   5 
     0   618   6 
     618   618   6 
     0   612   7 
     612   612   7 

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

+2

'size (k) = N' имеет смысл, когда' size' является переменной массива. Вы можете найти декларацию для этого где-нибудь? – francescalus

+0

@francescalus вы абсолютно правы! 'size (:)' был объявлен в модуле, импортированном в мою подпрограмму. Мой редактор подчеркивает его как ключевое слово, и я даже не считаю его переменной. Я думаю, что я хочу переименовать эту переменную, хотя ... Возможно ли вообще ссылаться на внутреннюю процедуру 'size()', где переменная 'size' находится в области видимости? – xebtl

ответ

3

SIZE - это имя встроенной функции, которая возвращает размер массива. В этом контексте вы правы, что иметь его в левом размере выражения присваивания не имеет смысла. И это не разрешено.

Однако Fortran позволяет объявлять переменные (и функции и т. Д.) С тем же именем, что и внутренняя функция. Когда это произойдет, ссылка на имя указана на переменную, а не на функцию. Вы можете прочитать об этом в 16.3.1 Fortran 2008, в котором говорится о локальных идентификаторах . В частности, он отмечает:

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

Класс (1) охватывает названные переменные.

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

use module_with_size, not_intrinsic_size => size 

и обращаться к нему по его новому имени оттуда, оставив size обратиться к собственному функция.

Имея size(k)=N, также имеет смысл для size функция, если это объявление функции оператора.

Смежные вопросы