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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 330

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

akaGM

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

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

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


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

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
http://forum.ru-board.com/topic.cgi?forum=33&topic=7860&start=2463

Код:
 
       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

Цитата:
И еще из этой оперы (занудства)  
 external F  
в этом месте не нужен  
Эта директива в вызывающей программе нужна. А не в вызываемой.

как раз таки нужна, т.к. она стоит в _вызывающей_ (test зовёт F) п/программе

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:13 23-11-2010
Vskazka

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

Цитата:
как раз таки нужна, т.к. она стоит в _вызывающей_ (test зовёт F) п/программе

 
Вы не очень правильно трактуете термин "вызывающая" в этом случае.
 
Попробуйте закоментировать эту строчку и скомпилировать. Ничего не изменится. Эта директива здесь - и не мешает и не нужна. как собственно и объявление external test в головной программе закоментируйте все это и скомпилируйте.
 
А вот код для проверки

Код:
 
  real*8 test,g
         external g  
!       external test
       intrinsic dsin, dcos, dble
       
       a=sin(1d0)  
       write (*,*) test(dsin, 10.d0)
       write (*,*) test(dcos, 10.d0)
       write(*,*) test(g, 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  
       real*8 function g(z)
       real*8 z
       g=2*z
       end
 

Если Вы закоментируете здесь external g в головной - то будет ругань
Кстати, похоже объявление intrinsic заменяет для таких функций и external.
 
Вообще, объявление external необходимо делать в той програмной единице, где есть вызов процедуры с актуальным параметром - процедурой (функцией). Там этот актуальный параметр должен быть объявлен как  external. А формальные параметры  объявлять external не обязательно. Хотя и можно. По-моему, не противоречит ничему - но не влияет. Если, конечно, эта функция опять не передается как актуальный параметр еще какой-то процедуре. Тогда опять же надо.
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 15:57 23-11-2010 | Исправлено: Vskazka, 16:15 23-11-2010
GennadyN

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

Цитата:
Ой... Лучше бы g95... Поскольку dll в стандарт Ф77 никак не вписывается, а g77 местами и до стандарта не дотягивает... Хотя пристойный компилятор, это без вопросов!  

 
Да, спасибо, все ОК! Действительно, никаких заморочек. Запустил сначала с ключиком -c, потом -shared, и сразу появилась картиночка с шестеренками
 

Цитата:
ЗЫ: Да, g95 названия всех подпрограмм (в том числе и экспортируемых) в промежуточные файлы пишет мелкими буквами, и иначе никак. Так что PROGRAMM1 или Programm1 не прокатят, пройдет только programm1!  

 
 
Спасибо, учту.

Всего записей: 6 | Зарегистр. 03-10-2010 | Отправлено: 16:39 23-11-2010
akaGM

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

Цитата:
Если Вы закоментируете здесь external g в головной - то будет ругань

в IF 11.1.xx никакой ругани нет...

Цитата:
Попробуйте закоментировать эту строчку и скомпилировать. Ничего не изменится

да, не изменится, но это не значит, что эту директиву не стоит использовать...
 
щас попытаюсь объяснить что я имею в виду во всех этих случаях...
 
в Ф используют две модели организации программы main+п/п

Код:
1)
program main
  x = func() !здесь по формату вызова, а если func -- дефолтный массив?
end program
 
function func()
end function
и

Код:
2)
function func()
end function
 
program main
  x = func()
end program

при этом не всегда компиляторы были многопроходными, так вот в первом случае (где вызов опережает определение) нужно было ставить какое-то описание, чтобы компилятор не спутал, например, функу с массивом (зачем отдавать на откуп компилятору то, за что отвечает программист?), однопроходный уж точно не поймёт ничего...
и это стало хорошим тоном (что позднее вылилось в наследнике фортрана -- С в прототипировании, да и в поздних фортранах в interface)
это как и с implicit -- программист должен держать всё под своим контролем, лучше самому за это отвечать, чем полагаться на автоматизацию...
 
по кр. мере меня так учили -- "прежде чем использовать, опиши!"

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 16:47 23-11-2010 | Исправлено: akaGM, 17:52 23-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
У меня получается так.  При закоментированном.  
 

Цитата:
1>Compiling with Intel(R) Visual Fortran 11.1.065 [IA-32]...
1>Console2.f90
1>C:\Work\tests\Console2\Console2\Console2.f90(9): error #6637: This actual argument must be the name of an external user function or the name of an intrinsic function.   [G]
1>compilation aborted for C:\Work\tests\Console2\Console2\Console2.f90 (code 1)


Цитата:
по кр. мере меня так учили -- "прежде чем использовать, опиши!"
- С этим полностью согласен. почему и implicit none почти всегда использую.  
Еще раз - я же писал, что просто занудствую...
 
 
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 17:07 23-11-2010
akaGM

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

Цитата:
У меня получается так.

да, конечно, это я лоханулся (нет что бы копи/пастить твой код) -- руками написал
function g() и  x = g(5.d0), а
write(*,*) test(g, 10.d0) забыл
:)

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 17:49 23-11-2010
Andrew10

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

Цитата:
Делаем цикл (по i например) от 2 до целой части от корня из n.  

 
Цикл, наверное, нужно делать до n, иначе не проходит вариант, когда n само простое

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 00:53 24-11-2010
KChernov



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

Цитата:
Цикл, наверное, нужно делать до n, иначе не проходит вариант, когда n само простое  

Это да, я переоптимизировал.
Но цикл до n делать почему-то не хочется (возможно потому, что уж совсем бессмысленная работа).
Я бы отслеживал этот вариант по тому, что других делителей у n нет.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 01:45 24-11-2010
Andrew10

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

Цитата:
Но цикл до n делать почему-то не хочется (возможно потому, что уж совсем бессмысленная работа).  

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

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 10:17 24-11-2010
cluclu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может быть есть у кого исходники библиотеки IMSL? Нужен исходник подпрограммы DSPWF. (Алгоритм Левинсона-Дарбина). Заранее благодарен.Подпрограмма вместо выставления флага ошибки печатает вывод текста ошибки. Что не позволяет определить из программы корректно ли завершилась работа , и не позволяет корректировать точность при повторном вызове.

Всего записей: 5 | Зарегистр. 24-11-2010 | Отправлено: 19:09 24-11-2010
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cluclu
Есть специальная тема
http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=16451#1

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо!

Всего записей: 5 | Зарегистр. 24-11-2010 | Отправлено: 06:35 25-11-2010
galina23

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
написать программу в Фортране 77
Дано натуральное число N.Разложить его на простые множители
я сделала 1 цикл
     Do 11 i=1,n/2
     if (mod(n,i).eq.0) then
 
     else
     endif
11  Continue
это я нашла простые множители а как теперь разложить его подскажите

Всего записей: 3 | Зарегистр. 21-11-2010 | Отправлено: 12:38 26-11-2010
KChernov



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

Цитата:
это я нашла простые множители а как теперь разложить его подскажите

Что значит как? Множители - они умножаются. Значит если нашли - надо делить.
 
Как-то так:
     Do 11 i=1,n
     if (mod(n,i).eq.0) then
       print *, i
       n=n/i
       do while (mod(n,i).eq.0)
         n=n/i
       end do
     endif
11  Continue

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 14:07 26-11-2010
galina23

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
а в фортране 77 есть функция while я как знаю нету

Всего записей: 3 | Зарегистр. 21-11-2010 | Отправлено: 18:07 26-11-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот моя старинная версия нахождения простых множителей на 77-ом Ф

Код:
 
      logical function isPrime(N)
      implicit none
        integer N
        integer Divisor
        logical FoundDivisor
 
        if (N .eq. 2) then
          isPrime = .true.
          return
        endif
 
        if (mod(N, 2) .eq. 0) then
          isPrime = .false.
          return
        else
          Divisor = 3
          FoundDivisor = .false.
          do while ((Divisor .le. int(sqrt(real(N)))) .and.
     &              (.not. FoundDivisor))
            FoundDivisor = (mod(N, Divisor) .eq. 0)
            Divisor = Divisor + 2
          enddo
          isPrime = .not. FoundDivisor
        endif
 
        return
      end function
 
тест
 
      implicit none
      logical isPrime
 
        write(*,*) isPrime(17)
        write(*,*) isPrime(100)
      end

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 18:46 26-11-2010
KChernov



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

Цитата:
а в фортране 77 есть функция while я как знаю нету

Ну раз нет - её можно сделать (например бесконечный цикл, в котором стоит if, который либо делает очередной n=n/i , либо прерывает цикл (и поскольку exit-а в 77-м тоже нету, то через goto)).
А вообще конечно 77-й фортран в наше время уже давно анахронизм.
 
Добавлено:
akaGM

Цитата:
вот моя старинная версия нахождения простых множителей на 77-ом Ф

Так там же нету while-а
 
Добавлено:
А вообще эта программа пишет, простое число или нет, а не выводит простые делители
 
Добавлено:
И приведение к int в цикле там лишнее (или это особенность компилятора 77-го?).

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 18:51 26-11-2010
akaGM

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

Цитата:
Так там же нету while-а

у меня есть...
VMS VAX Fortran-77 (образца конца 80-ых), нестандарт, конечно...
 

Цитата:
А вообще эта программа пишет, простое число или нет

ну да, я её как isPrime и использовал в своё время...
 

Цитата:
И приведение к int в цикле там лишнее

бережёного как известно...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 19:10 26-11-2010 | Исправлено: akaGM, 19:11 26-11-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Раз пошла такая пьянка
Мой код, конечно не оптимальный, но уж что получилось
 
Подробнее...

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 21:59 26-11-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10
Конечно 77 фортраном тут точно не пахнет
 
Навскидку: уж в таком навороченном варианте использовать статические массивы точно моветон
И пример с выводом наглядно показывает, насколько проблематично в фортране организовать читабельный вывод - приходится всё форматировать вручную с точностью до позиции каждого символа

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 23:32 26-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 330

Компьютерный форум 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