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
1487
В древние времена были так называемые "альтернативные выходы".

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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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