2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 goto \\ Fortran
Сообщение25.11.2009, 17:11 


27/07/08
107
Russia
В ходе выполнения программы мне потребовалось из определенной подпрограммы перейти вдругуюподпрограмму.
Я хочу устроить это с помощью оператора GOTO
Составление модельной программы показало, чтоэто невозможно... может кто-то сталкивался с подобной задачей??


код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program maingoto
implicit none

double precision :: x, y, z
integer :: i, j, k, lbl

i = 1
call cont(i)

10 write(*,*) 'goto 10 use...'

contains

subroutine cont(i)
implicit none
integer, intent(in) :: i
integer :: k, lbl

do k = i, 100
  write(*,*) 'k :: ', k
  if (k>=10) goto 10
end do

return
end subroutine cont

end program maingoto
 

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение25.11.2009, 18:45 
Заслуженный участник


09/08/09
3438
С.Петербург
Оператор GOTO не предназначен для нелокальной передачи управления.
Ulrih в сообщении #265269 писал(а):
может кто-то сталкивался с подобной задачей
С задачей, подобной чему?
Каких целей Вы хотите достичь таким экстравагантным способом? Почему Вас не устраивает традиционный способ вызова подпрограммы оператором CALL?

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение25.11.2009, 21:40 


27/07/08
107
Russia
Потому что я хочу исключить не очень приятный момент в вычислительной программе.
В той подпрограмме из которой я хочу уйти посредством оператора goto, возникает (видимо) сингулярная матрица и эта подпрограмма не может найти ее собственные значения.
Нужно выйти - и записать куда-нибудь соответствующее сообщение...
И перейти далее по списку начальных условий для моей задачи...

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение25.11.2009, 22:03 
Заслуженный участник


09/08/09
3438
С.Петербург
Обычно такие проблемы решаются примерно следующим образом:
код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
subroutine main
    ...
    if fun1(...) = 0 then
        нормальное выполнение программы
    else
        запись сообщения об ошибке
        дальнейшие действия
    end if
end

integer function fun1(...)
    что-то вычисляем
    if получилось then
        нормальное продолжение
        fun1 = 0
    else
        возникла ошибка
        fun1 = 1
    end if
end
 
Другими словами, при возникновении нештатной ситуации происходит возврат в вызывающую подпрограмму с передачей кода ошибки, а та уже определяет, что надо делать дальше.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение26.11.2009, 01:04 
Заслуженный участник


11/05/08
32166
Ulrih в сообщении #265341 писал(а):
В той подпрограмме из которой я хочу уйти посредством оператора goto,

Вы не можете выйти в какой бы то внешний модуль оператором "goto". Независимо от языка.

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

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

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение26.11.2009, 02:22 


27/07/08
107
Russia
ewert в сообщении #265400 писал(а):
Ulrih в сообщении #265341 писал(а):
В той подпрограмме из которой я хочу уйти посредством оператора goto,


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


А вот если я сам для себя знаю причину выхода из этой подпрограммы??
Это моя рассеянность? :lol:

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение26.11.2009, 13:18 
Заслуженный участник


31/12/05
1527
В древние времена были так называемые "альтернативные выходы".

http://www-linac.kek.jp/cont/langinfo/w ... rm0146.htm

Используется синтаксис Fortran
   CALL CHECK(A, B, *10, *20, C)
   ...
10 ...
20 ...
   SUBROUTINE CHECK(X, Y, *, *, C)
   ...
50   IF (X) 60, 70, 80
60   RETURN
70   RETURN 1
80   RETURN 2
   END

Вредная возможность, которая, к счастью, устарела еще в Fortran 90. Есть нормальные человеческие IF.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение26.11.2009, 13:55 
Заслуженный участник


11/05/08
32166
В древнем Фортране (не знаю, как сейчас) была и другая экзотика -- несколько точек входа в процедуру. Правда, это были не метки, а альтернативные заголовки.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение27.11.2009, 18:52 
Заслуженный участник


15/05/05
3445
USA
Оператор ENTRY существует до сих пор. Но (ЕМНИС) в FORTRAN 2003 этот оператор наконец-то объявлен устаревшим.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 02:32 
Аватара пользователя


19/03/07
597
Bielefeld
Решила написать сюда, хотя и несколько не по теме...

В Фортране 90 вызывается подпрограмма оператором CALL. Скажите, как найти, где эта подпрограмма находится - то есть где она определена?

Спасибо этому форуму, все мои вопросы кажутся мне самой глупыми, и тем не менее я не могу на них ответить... :(

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 03:58 
Заслуженный участник


09/08/09
3438
С.Петербург
Таня Тайс в сообщении #266635 писал(а):
В Фортране 90 вызывается подпрограмма оператором CALL. Скажите, как найти, где эта подпрограмма находится - то есть где она определена?
Программа на Фортране "собирается" из следующих компонентов:
1. Исходные файлы на Фортране
2. Объектные модули, полученные компиляцией с Фортрана или других языков программирования
3. Библиотеки объектных модулей (в том числе, стандартные)
4. Разделяемые библиотеки, подключаемые при загрузки программы для выполнения.
Соответственно, подпрограмма, вызываемая оператором CALL, может быть определена в любом из этих компонентов. Если она находится в исходном файле, посмотреть на неё довольно просто: достаточно найти этот исходный файл :) Объектные модули и библиотеки имеют двоичную форму, поэтому если подпрограмма определена в них, найти ее довольно проблематично. Но вообще, вся информация о внешних именах должна присутствовать в map-файле, создаваемом компоновщиком.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 09:44 
Аватара пользователя


19/03/07
597
Bielefeld
Maslov в сообщении #266638 писал(а):
подпрограмма, вызываемая оператором CALL, может быть определена в любом из этих компонентов

Вроде, была какая-то команда, показывающая все места, где упоминается эта подпрограмма? Что-то типа поиска...
Спасибо.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 11:31 
Заслуженный участник


28/04/09
1933
Таня Тайс
Таня Тайс в сообщении #266651 писал(а):
Вроде, была какая-то команда, показывающая все места, где упоминается эта подпрограмма? Что-то типа поиска...
При работе в командной строке есть утилита GREP (в различных реализациях Fortran'а вроде бы присутствует, если не ошибаюсь).

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 16:22 
Заслуженный участник


19/07/08
1266
Таня Тайс в сообщении #266651 писал(а):
Вроде, была какая-то команда, показывающая все места, где упоминается эта подпрограмма? Что-то типа поиска...

Код:
find . | xargs grep 'имя подпрограммы'

Это если под линуксом. В виндах не знаю.

 Профиль  
                  
 
 Re: goto \\ Fortran
Сообщение30.11.2009, 22:31 
Аватара пользователя


19/03/07
597
Bielefeld
nestoklon в сообщении #266765 писал(а):
Это если под линуксом.

Конечно, под линуксом! Спасибо всем!!!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group