2013-08-02 2 views
4

Мне нужно прочитать много данных из файла в программе Fortran. Размер данных является переменным, поэтому я хотел бы динамически распределять массивы. Моя идея - сделать подпрограмму, которая читает все данные и выделяет память. Упрощенная версия программы:Выделение массивов в подпрограмме Fortran

program main 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n 

    !This subroutine will read all the data and allocate the memory 
    call Memory(v,n) 

    !From here the program will have other subroutines to make calculations 

    end 


    subroutine Memory(v,n) 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n,i 

    n=5 
    allocate(v(n,2)) 
    do i=1,n 
    v(i,1)=1.0 
    v(i,2)=2.0 
    enddo 

    return 
    end subroutine Memory 

Эта программа дает мне следующую ошибку:

Error: Dummy argument 'v' of procedure 'memory' at (1) has an attribute that requieres an explicit interface for this procedure 

Является ли это правильный способ структурирования такого рода программы? Если да, то как я могу решить эту ошибку?

Спасибо.

ответ

8

Если предположить, что у вас есть один исходный файл, содержащий как программу и подпрограммы, как подсказывает ваш пост, проще исправить это заменить строку, содержащую оператор

end 

строкой, содержащей заявление

contains 

и писать, в конце исходного файла строку, содержащую заявление

end program 

(Да, ключевое слово program не требуется, но это полезно.)

Проблема, что ваш компилятор сообщил, что, как вы структурировали свой код, программа ничего не говорит о интерфейсе с подпрограммой знать memory, этот интерфейс в терминах Fortran, неявный. Когда вы хотите вызвать подпрограмму и либо передать, либо передать выделенный массив, подпрограмма должна иметь явный интерфейс.

Существует несколько способов обеспечения явного интерфейса. Один из них, как я показал вам, должен содержать подпрограмму внутри программы. Другой, и более полезный способ, когда ваши программы становятся немного большими, заключается в том, чтобы писать свои подпрограммы в модулях и использовать-ассоциировать их в программе, которая хочет их использовать. Прочтите части своего учебника по Fortran, которые охватывают module s и инструкцию use.

Существует, по крайней мере, еще один вариант, но он, особенно для начинающих, непривлекателен, и я не буду упоминать его здесь.

И, хотя я пишу, узнаю и использую ключевое слово intent, чтобы указать, будет ли аргумент для подпрограммы считываться, записываться в или для обоих. Это отличная помощь для безопасного программирования, ваши любимые ресурсы Fortran будут подробно объясняться.

+0

Спасибо! В моей реальной программе у меня есть несколько файлов, я попробую использовать модуль. – Msegade

+5

И если я могу сделать другое предложение - попробуйте «разучить» использование нестандартного реального синтаксиса * 8 и целого * 4, он ограничивает гибкость. Популярным методом является определение модуля KINDS, который использует SELECTED_INT_KIND и SELECTED_REAL_KIND для объявления серии констант PARAMETER для видов, которые вы будете использовать, таких как SP и DP, а затем используйте REAL (DP) для своих объявлений. Я согласен с Марком в том, что модули - ваш лучший выбор здесь. –