Нам все еще нужны подпрограммы? [закрыто

StackOverflow https://stackoverflow.com/questions/3941732

  •  30-09-2019
  •  | 
  •  

Вопрос

В Фортране существует четкое разница между функцией и подпрограммой: функции возвращают одно значение, подпрограммы не возвращают значения. Это представляет каскад различий между двумя. Одним из примеров является вызовая семантика: вы можете вызвать функцию, как на других языках, но для того, чтобы вызвать подпрограмму, вы должны выдать call Заявление первым.

С добавлением указателей и типов данных в Fortran95, оказывается, что нет технического ограничения в какую-либо подпрограмму функции и поддерживать подпрограммы только для наследия. Функции могут вернуть ноль (вы просто возвращаете фиктивное целое число), один или несколько значений (например, вы можете вернуть указатель на выделенный экземпляр типа типа, таких как C ++ STL).

Я ошибся? Нам все еще нужны подпрограммы в программировании Fortran из-за некоторой функции, которые имеют подпрограммы и функции не имеют?

Это было полезно?

Решение

Если вы ищете архивы Comp.lang.Fortran, вы найдете дискуссии о семантике функций. IIRC оказывается, что он не совсем указан в стандарте, что и что не допускается для функций, которые имеют побочные эффекты.

Например, может оптимизировать компилятор

x = foo (args) + foo (args)

в

x = 2 * foo (args)

Или для другого примера рассмотреть

x = y + foo (y)

Что если foo () меняет значение y? Помните, что Fortran не имеет концепции C точек последовательности.

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

Другие советы

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

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

ОБНОВИТЬ:

Почему вы говорите «хлопот»? Подумаешь? Я не согласен с идеей, что подпрограммы - «хлопот», когда они используются в соответствующей ситуации.

Fortran поддерживал различие между функциями и подпрограммами с версии 77 и, вероятно, ранее. Другие языки С-семьи тоже делают. Почему это внезапно такое хлопот? Даже языки, имеющие указатели и объекты в течение длительного времени, имеют методы, которые возвращают пустоту.

Вы пытаетесь запрограммировать C в Форттрене снова, не так ли? ;-)

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

Также -1, потому что я считаю, что это не конструктивный вопрос. Если вам они не нравятся, то не используйте их.

Если я правильно понимаю, Стефано не против идеи подпрограммы. Мнение против них - ерунда. Он против использования разных стилей для подпрограмма / функций.

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

При императивном программировании у нас есть государство и заявления, чтобы изменить его. В процедурном программировании наши инструменты для выполнения изменений являются процедуры (мы локализуем изменения внутри процедур). Процедура может или не может вернуть некоторую ценность. И я не думаю, что этот факт (любая процедура возвращается значением или нет) настолько важной причиной иметь 2 различных объекта в языке программирования. Мы можем иметь только функции (например, в C) и просто вернуть что-то особенное, когда нам на самом деле не нужно что-то возвращать (void). Или мы можем иметь только процедуры и специальный синтаксис, позволяющий возвращать значения, такие как в Modula-2, Oberon, ...

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

Тот факт, что я должен ответить на себя на этот вопрос, безумно, но вот как это так.

Разница связана с тем, что вы не можете «вызывать функции, такие как на других языках» в Fortran. В то время как в C вы можете вызвать целочисленную функцию без назначения значения, пример

int foo() {
    return 5;
}
int main() {
    foo(); // this works
}

В Фортране вы всегда должны связать приемную. Пример

module test
   implicit none

contains
   integer function foo()
      print *, "hello"
      foo = 0
   end function

end module

program hello
   use test
   integer :: x

   x = foo() ! this works
   foo() ! this does not compile

end program hello

Это означает, что «эмулировать» функцию пустоты, возвращая фиктивное целое число, все равно не позволит вам звонить, не имея переменную приемника.

В Фортране, void Тип возврата не существует. Технически, вы можете структурировать вашу программу со всеми функциями, заменить каждое вхождение call заявление с x = Как видно выше, но это не сделает ваш синтаксис похож на C или другие языки в любом случае, где отсутствует различие между функциями возврата пустоты и функциями возврата недействительной. Подпрограммы - это единственные объекты, которые позволяют «вернуть пустоту», но семантический для выполнения вызова просто отличается. Кроме того, нет разницы между ними.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top