2016-06-16 10 views
3

Если я ошибаюсь, в Фортране нет способа написать функцию или подпрограмму с произвольным числом аргументов (более известное как вариационная функция).Каковы функции MAX и MIN, реализованные в Fortran без поддержки вариационных функций?

Например: RESULT = FUNC(A1, A2 [, A3 [, ...]])

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

Итак, как же тогда Fortran компилятор реализует, MAX или MIN, которые являются, по сути,

RESULT = MAX(A1, A2 [, A3 [, ...]])

Что особенно озадачивает, что эти VARIADIC MAX и MIN функции, evidently, часть стандарт Fortran 77. Поэтому всякая возможность для реализации этих функций должна была быть доступна в 1977 году.

+1

Да, вы и я не можем написать истинную вариационную функцию, но я также прочитал этот вопрос как «почему бы не встроенные функции Fortran всегда следовать правилам пользовательских процедур?». По существу: зачем? То есть компилятор Fortran не ограничен, чтобы реализовать 'мин' так, как мы. Он может делать все, что ему нравится (возможно, как сама программа C), пока он получает ответ, требуемый от него. – francescalus

+0

Да, ваше альтернативное чтение вопроса - это то, что тоже перешло мне в голову, и я пришел к тому же выводу, что и вы: «По существу: зачем они?». Но тем не менее я все еще расстраиваюсь. – EMiller

ответ

7

Вариадическая функция - это поддержка компилятором, которая позволяет программисту написать функцию, которая принимает переменное количество аргументов.

Даже если он может выглядеть так же, как и у программиста, MAX() в Fortran не требуется быть функцией, переменным или иным образом - он может быть реализован как возможность, встроенная в компилятор, для распознавания последовательности токенов и выражения и испускать столько кода (например, в файл объекта), сколько необходимо для получения требуемого результата. Это может включать вызовы библиотечных функций, или это может быть не так.

Например, при

RESULT = MAX(A,B,C) 

все, что требуется, это признание аргументов, A, B и C во время синтаксического анализа и (с учетом заявления/выражения будучи действительно - такие, как все три имеющие один и тот же тип и вид) испускает код, который обрабатывает каждый аргумент, чтобы найти максимум.

Так что компилятор может перевести что-то вроде

RESULT = MAX(A,B,C) 

в нечто, что выглядит (предполагая, что у нас есть Fortran компилятор, который генерирует код C), как

result = a; 
    if (b > result) result = b; 
    if (c > result) result = c; 

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

И, да, такая возможность существовала в компиляторах задолго до 1977 года. Такая возможность является одним из основных моментов наличия компилятора - автоматизировать процесс преобразования чего-то простого для программиста в любую более сложную логику.

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

  • Нет связанных вопросов^_^