2016-02-05 2 views
0

Как написать функцию, которая принимает массивы произвольного размера при условии, что они имеют ранг 1? Это именно то, что может сделать внутренняя функция shape, поэтому я не думаю, что моя просьба слишком требовательна. На самом деле, функция shape делает больше. Он может (очевидно) принимать массив любой формы, то есть произвольный ранг и произвольную длину вдоль каждого измерения.Функция Fortran, которая принимает произвольные размеры ранга-1 массивов

Этот вопрос предназначен для написания функции sub2ind, которая соответствует одноименной функции MATLAB.

+0

Как часть этого вопроса вы, по-видимому, также заботитесь о том, что результат функции является массивом некоторых произвольных (но связанных) размеров? – francescalus

+0

Ну, я хотел бы узнать самый общий ответ, но первым шагом было бы ответить в том случае, если функция дает скаляр в качестве вывода. –

ответ

2

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

Современный стиль предполагается форма:

function f(a) 
    real :: a(:) 
    do i = 1, size(a) 
    ... 
    end functions 

Явного размера:

function f(n, a) 
    real :: a(n) 
    do i = 1, n 
    ... 
    end functions 

предполагается размер:

function f(n, a) 
    real :: a(*) 
    do i = 1, n 
    ... 
    end functions 

Для предполагаемой формы, явный интерфейс (лучше всего с помощью модулей) необходим.

+0

Я не хочу явно указывать размер, поэтому мне нужен первый и третий способы, но я не знаю, в чем разница; я также не знаю, каким образом я должен использовать модуль. (Я новичок в fortran). –

+0

Затем вы должны прочитать учебник. И поиск stackoverflow. Есть хорошие вопросы и ответы об этом. Для расширенной работы с массивами вам нужны модули. –

+0

http://stackoverflow.com/questions/8412834/correct-use-of-modules-subroutines-and-functions-in-fortran http://stackoverflow.com/questions/1240510/how-do-you-use- fortran-90-module-data http://stackoverflow.com/questions/11953087/proper-use-of-modules-in-fortran –