Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на ФОРТРАН, как общего так и конкретного характера.
Постарайтесь дать как можно больше информации о возникшей проблеме -- это в конце концов в ваших же интересах чтобы вам помогли...

прежде чем просить помощи в задании
платное решение задач

ресурсы этого топика
ссылка на подборку ресурсов, собранных посетителями этого форума
 
то, чем мы решили поделиться
ссылка на страничку программ etc собственного изготовления, которыми любезно делятся наши форумчане


если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
 
просьба к пишущим и отвечающим все большие листинги оформлять тегом more
и отключать графические смайлики при размещении фортран-кода

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:11 14-01-2007 | Исправлено: akaGM, 09:47 01-03-2020
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Думаю Вы не правы в трактовке этой фразы. Полагаю, что имелось в виду следующее: нельзя делать такую конструкцию func(j,dble). С чего бы это нельзя было использовать конструкцию func(i,dble(j)) непонятно. Этак нельзя было бы использовать и конструкции вида func(i,a+b) Плюс еще более встроенная операция. (intrinsic)

Цитата:
"Note that none of the intrinsic subroutines can be passed as actual arguments. "

 
Пока писал
akaGM

Цитата:
т.к. тут передаётся _значение функции_, а не она сама (её адрес) в качестве _актуального аргумента  

Не совсем точно, передается не значение dble(j), а адрес этого значения. Во всяком случае при стандартном описании функции

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 17:49 19-11-2010 | Исправлено: Vskazka, 17:55 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Ты конечно можешь интерпретировать, как тебе угодно, но в "Y = FUNC ( I, DBLE( J))" DBLE передается как actual argument, т.е., в соответствии с описанием функции, он так cannot be passed. Если это не так, дай ссылку, где говорится об обратном - может я и неправ.
 
Vskazka
Цитата:
Этак нельзя было бы использовать и конструкции вида func(i,a+b)
Нет, это совсем другое дело: вот так "Y = FUNC ( I, DBLE( J)+7.D0)" можно, т.к. DBLE( J) здесь не является фактическим параметром.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 18:10 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Я не о том. есть встроенные процедуры и функции. Intrinsic. Их нельзя передавать как актуальные параметры. Нелязя на самом деле передаватиь адреса этих функций.  Т.Е. недопустима конструкция вида func(i,dble). Конструкция же  func(i,dble(j)) вполне допустима. тк передается адрес не функции, а результата от действия функции.
Чтобы не быть голословным, я для проверки (в том числе и своих представлений) сварганил код
#
 
 
Таки все работает. Можете сами убедиться оттранслировав его

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 18:35 19-11-2010 | Исправлено: Vskazka, 18:36 19-11-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
адрес ли, значение -- не суть, смысл всё равно понятен...
 
Igorr

Цитата:
Ты конечно можешь интерпретировать, как тебе угодно

зачем так жёстко? я ничего не интерпретирую...
вот тебе код:
Код:
 
       real*8 test
       external test
       intrinsic dsin, dcos, dble
       write (*,*) test(dsin, 10.d0)
       write (*,*) test(dcos, 10.d0)
! можешь откомментировать...
!       write (*,*) test(dble, 10.d0)
       end
 
       real*8 function test(F, X)
       real*8 F, X
       external F
       test = F(X)
       return
       end

-----
Vskazka
почти одновременно...
только мой код разрешает все наши непонятки...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:40 19-11-2010 | Исправлено: akaGM, 18:44 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Я собственно занудствую, потому что напаролся как-то на сей классический пример, когда  1 становится 2.
по типу  
write(*,*) 1
calll f(1)
 ....
 
write(*,*) 1
........
 
subroutine f(i)
i=i+1
end
с тех пор и помню, что в фортране (классическом) все передается по ссылке.
 
И еще из этой оперы (занудства)  
 external F  
в этом месте не нужен  
Эта директива в вызывающей программе нужна. А не в вызываемой.

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 18:53 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
akaGM
Друзья, к рассматриваемой проблемке я подхожу чисто формально, без всяких отсебятин. Возможно я сам что-то неправильно понимаю. То что код работает - вполне может быть, но нет никакой гарантии, что он не вносит наведенной ошибки в другом месте программы, т.к. он НАРУШАЕТ правило использования DBLE.
Собственно, у нас разница в понимании второго аргумента в "Y = FUNC ( I, DBLE( J))" - чем он является. Я считаю, что он является фактическим параметром, попадающим под упомянутое ограничение, вы - нет. Где прочитать про ИСТИНУ?

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 18:53 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr

Цитата:
 Где прочитать про ИСТИНУ?

В общем правиле - что значит передать актуальные параметры процедуре.
Всегда передается ссылка. На значение ли, на процедуру ли, не важно - передается ссылка на объект. И далее, если передается ссылка на функцию, то она вызывается. Если же передается ссылка на действие функции, то из этого места вытаскивается сие число. То что Вы приводили, означает просто, что ссылку на встроенную функцию dble недопустимо передавать, как актуальный параметр.
И скомпилируйте код akaGM. Забавно. У меня компилятор ругми ругается.  
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 18:59 19-11-2010 | Исправлено: Vskazka, 19:02 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
Похоже я понял - о чем Вы.
И так, устаканиваем: "Y = FUNC ( I, DBLE( J))" - можно, "Y = FUNC ( I, DBLE)" - нельзя.
Факт?

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:08 19-11-2010 | Исправлено: Igorr, 19:19 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
такой код  

Цитата:
 
external ff
real*8 ff
......
g=func(i,ff)
.....
 
reaL*8 FUNCTION func(i,g)
real*8 g
func=i+g(i)
end
 
real*8 function ff(i)
ff=2d0*i
end
 

Грубо говоря означает следующее.
Компилятору сказано объявлениями external ff , real*8 ff
что при вызове функции func на месте второго аргумента стоит адрес (первого байта) кода функции ff, возвращающую Real*8. Поэтому при соответствующем вызове в теле функции funс вместо формального g(i) , будет передано управление на реальный адрес функции ff,  с уже сформированным стеком для вычисления.  
Так вот, по какой-то причине с dble такого делать нельзя. Нельзя передавать ее адрес. (Возможно, он все время меняется по ходу выполнения программы?)    
 
PS

Цитата:
Факт?

Да
 
 
 
 
 
 
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 19:26 19-11-2010 | Исправлено: Vskazka, 19:28 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
Еще чуть-чуть:
Цитата:
func(i,ff)
при вызове функции func на месте второго аргумента стоит адрес (первого байта) кода функции ff
а при вызове func(i,ff(j)) - что стоит на месте второго аргумента?

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:43 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
стоит адрес первого байта куда компилятор положил ff(j), после вычисления сего числа.
при вызове func(i,ff(j)) сначала вычисляется ff(j) потом в стек записывается адреса i ,ff(j), адрес возврата и (мб что-то там еще- не помню) и управление предается на адрес func

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 19:48 19-11-2010 | Исправлено: Vskazka, 19:52 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
Чтобы вычислить ff(j), надо знать адрес ff. Где он хранится в func(i,ff(j))?

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:52 19-11-2010
cRAcKErSoft

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте! Помогите, пожалуйста написать программу по Фортрану. Файл с произвольным текстом хранится на диске. Ввести имя файла с клавиатуры, прочитать текст. Заменить комбинацию символов 'aa' на '#'. Только не могу убрать пробелы

Код:
program file
implicit none
integer i,l
character (100)b  
open(11,file='text.txt')
read (11,100)b
100 format (a 100)
l=len_trim(b)
print *,b
  do i=1,l
    if (b(i:i+1)=='aa') then
        b(i:i+1)='#'
    endif
  enddo
write(*,100)b
end program file

Всего записей: 5 | Зарегистр. 19-08-2009 | Отправлено: 19:59 19-11-2010 | Исправлено: cRAcKErSoft, 20:00 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
 

Цитата:
Чтобы вычислить ff(j), надо знать адрес ff. Где он хранится в func(i,ff(j))?  

 
зачем его здесь хранить-то. Компилятор видит, что предписано вычислить ff(j) ну и вычисляет его. Он же (компилятор) сам дает адрес для функции ff и распределяет куда положит ff(j).
 
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 20:02 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
Цитата:
зачем его здесь хранить-то. Компилятор видит, что предписано вычислить ff(j)
а что, в func(i,ff) компилятор не видит, что предписано вычислить ff? Не понятна разница.
 
Добавлено:
Если разницы нет, тогда - "Не Факт". Вопрос остается открытым до ознакомления с соответствующей официальной информацией по данному вопросу (ссылки на нее явно бы не помешали).

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 20:20 19-11-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr

Цитата:
а что, в func(i,ff) компилятор не видит, что предписано вычислить ff? Не понятна разница

а где здесь написано, что ff надо вычислять?
я вот, как ты говоришь, интерпретирую (кстати, компилятор тоже), что её надо не вычислять, а передать её адрес дальше в п/п
при условии, конечно, что где-то есть определение этой функции
для этого и существуют интерфейсы (прототипы) функций чтобы не было неоднозначности
 
для случаев
1. i = foo(j, ff)
2. i = foo(j, ff)
необходимо писать что-то типа
Код:
 
1.
interface
  function foo(i, f)
  integer i
  interface
    real function f
    end function
  end interface
 
end interface
 
или
2.
interface
  function foo(i, f)
  integer i
  real f
end interface

 
ты не понимаешь, наверное, разницу между адресом функции (обычно в сегменте кода) и её возвращаемом значением...
i = f(x) здесь i хранится в сегменте данных, адрес i известен во время сборки программы
а здесь
i = foo(j, f(x))
адрес _получаемого_ значения от f(x) хранится в промежуточной динамической переменной или сразу же пихается в стек для вызова foo()
 
короче, код
i = foo(j, f(x))
эквивалентен
 
!allocate tmp
tmp = f(x)
i = foo(j, tmp)
!deallocate tmp
 
а код
i = foo2(j, f)
 
эквивалентен
ptr = get_proc_address (f)
i = foo2(j , ptr)
 
понятно?
 
Vskazka

Цитата:
И скомпилируйте код akaGM. Забавно. У меня компилятор ругми ругается

на что? и какой компилятор? по-моему, я не отошёл даже от 77-стандарта...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 21:58 19-11-2010 | Исправлено: akaGM, 22:09 19-11-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Цитата:
ты не понимаешь разницу между адресом функции (обычно в сегменте кода) и её возвращаемом значением...
Вряд ли тебе судить о моих пониманиях.
 
Еще раз, третий: Где можно ознакомится с описанием разницы между передачей параметров в похожих ситуациях как func(i,ff) и func(i,ff(j)). Всего-то прошу дать компетентную ссылку. А если таковой нет - тогда о чем мы говорим? О мнениях? Нет смысла.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 22:23 19-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
на что? и какой компилятор? по-моему, я не отошёл даже от 77-стандарта...

Я просто раскоментировал строку с вызовом write (*,*) test(dble, 10.d0)  (компилятор -IVF)
Кстати, похоже я понял причину запрета на передачу таких функций, типа dble.  
При общем правиле компиляции, когда каждая подпрограмма сама по себе компилируется, и если в ней стоит что-то типа ff(i), не описанная, как массив, то подготавливается вызов и обращение, как к функции, которая получает в качестве аргумента целое число.  И что бедному компилятору делать, когда рядом стоят вызовы ff(1) и ff(1e0), что ему подготавливать без интерфейсов, кои достаточно позднее изобретение и не в стандарте 77. Я, кстати, в Вашем примере попробовал вместо dsin поставить sin - тоже самое ругми ругается. Другими словами, чем при dble, но по тем же причинам полагаю
Igorr
Найдите поиском стандарт языка ISO. Там прочтете. Если Вам оно надо.
 
 
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 07:26 20-11-2010 | Исправлено: Vskazka, 07:34 20-11-2010
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я вижу, мой вопрос вызвал весьма оживленную дискуссию, что, несомненно, всем на пользу. Однако, вернемся к нашим баранам. Я, извиняюсь, фигею: код
Код:
            F = FUNC(I,DBLE(J))
работал неправильно, а вот
Код:
            Z = DBLE(J)
            F = FUNC(I,Z)
работает. Компилятор --- Intel Fortran (Linux). Тут писали про тонкости стандарта (я пока его не знаток), но вот такого кидка не ожидал(. Ну да ладно
 
Andrew10
Цитата:
Должно работать!
 
REAL(8)  Y
INTEGER I, J
REAL(8) FUNC
 
 . . . . . . .
Y = FUNC ( I, DBLE( J))
. . . . . . .  
 
Если нет, пришли кусок кода с объявлениями переменных и вызовом функции
 
Как видишь, не работает такой вариант
 
akaGM
Цитата:
в вызывающей программе используй интерфейс (типа Сишный прототип)
А без него нельзя?

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 07:39 20-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert

Цитата:
Я вижу, мой вопрос вызвал весьма оживленную дискуссию, что, несомненно, всем на пользу. Однако, вернемся к нашим баранам. Я, извиняюсь, фигею: код
Код:
            F = FUNC(I,DBLE(J))
работал неправильно, а вот
Код:
            Z = DBLE(J)
            F = FUNC(I,Z)
работает. Компилятор --- Intel Fortran (Linux). Тут писали про тонкости стандарта (я пока его не знаток), но вот такого кидка не ожидал(. Ну да ладно  

В моем примере, который я приводил ранее, такая конструкция работает. Попробуйте его откомпилировать и посмотреть что у Вас получится.  
Но, навскидку, такого сорта поведение (когда вроде бы одинаковое что-то , написанное по-разному, дает разные результаты) бывает при ошибках, типа нарушений памяти - выход за границы массивов, несоответствие между подпрограммами и их вызовами, неполадки в common'ах и тп. Тут даже вставка Write(*,*) может все изменить. Причем ошибка может быть совсем в другом месте. И близко не лежащем к этому куску кода. Попробуйте откомпилировать текст на других компиляторах. Например через Silverfrost FTN95. Мне он, как-то помог выловить такого сорта неясную ошибку. Там у них собственный отслеживатель runtime errors.  И хорошо отлавливается использование не инициализированных переменных, например.  
PS - без интерфейсов, конечно, можно. Стандарт 77 еще никто не отменял. До сих пор все, что написано в 77, ДОЛЖНО компилироваться на любом трансляторе.  
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 07:57 20-11-2010 | Исправлено: Vskazka, 08:06 20-11-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru