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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
и отключать графические смайлики при размещении фортран-кода

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
В том виде, как это сделано сейчас (до исправлений, предложенных plazmon) получается такая последовательность манипуляций с nf
 
a) В основной программе присваивается nf = n (как можно думать, исходное значение nf, которое каждый раз нужно восстанавливать.
 
б) Вызывается функция Pho_my, куда это значение nf передается через COMMON-блок и в этой функции используется  исходное значение для nf (определенное в основной программе). что с этой переменной делается в Pho_my из представленного кода непонятно
 
в) Затем вызывается подпрограмма Rho_subra, где nf сразу присваивается результат вычисления func. Где это вычисленное значение должно использоваться снова непонятно.
 
г) Перед  следующем вызовом из основной программы функции Rho_my восстанавливается исходное значение nf.  
 
При этом результат вычисления func в Rho_subra пропадает и нигде не используется.
 
Все это непонятно    .
 
Может быть Вы перепутали порядок вызова Pho_my и Rho_subra в основной программе?
 
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 23:23 02-12-2010
terminat0r



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

Цитата:
Это не совсем то, что мне надо.  

Так напишите внятно что вам надо. Я честно так и не понял. Разберитесь в конструкциях и стандартах фортрана, ибо использовать коммонблоки в модуле, это как на феррари паровой двигатель ставить.

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 23:27 02-12-2010
akaGM

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

Цитата:
Действительно, сильно зависит от конкретного компилятора

совершенно верно...
почти все компиляторы конца 80-х начала 90-ых на многих платформах позиционировались как F77 с "элементами"  (тот же MS начиная с версии 4.13 и 5.0-5.1, PowerStation, Watcom 77, NDP и др) я даже пофигачил на Фортране для "Электроники ДВК" -- он гордо назывался "версия 5", своя нумерация после F-IV...
так сказать трудное наследие непринятых стандартов Ф80 и Ф88, очень хотелось соответ. комитету и дальше придерживаться "красивых" чисел (Ф66, Ф77 итд)

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 13:24 03-12-2010
akaGM

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

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 21:04 03-12-2010 | Исправлено: akaGM, 13:47 06-12-2010
mishaLaz

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cнять получение ответов по e-mail

Всего записей: 2 | Зарегистр. 02-03-2010 | Отправлено: 12:13 06-12-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хорошая задача...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 13:50 06-12-2010
bubanoid



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

Цитата:
a) В основной программе присваивается nf = n (как можно думать, исходное значение nf, которое каждый раз нужно восстанавливать.

Так и есть
 

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

nf это количество первых слагаемых ряда, которое берётся для оценки бесконечного ряда. Pho_my - это и есть некоторый бесконечный функциональный ряд.
 

Цитата:
в) Затем вызывается подпрограмма Rho_subra, где nf сразу присваивается результат вычисления func. Где это вычисленное значение должно использоваться снова непонятно.

Оно используется там же, в Pho_my. Rho_subra это процедура, выполняющая некоторую подготовку для дальнейших вычислений. Эта процедура вычисляет оптимальное nf, далее с ним вычисляет Pho_my на некотором массиве точек, и далее вычисляет коэффициенты сплайна. Мне так надо потому, что вот это Pho_my есть определённой весовой ф-цией и с ней в дальнейшем мне надо будет интегрировать другие ф-ции. Понятно, что сплайн вычисляется гораздо быстрее чем суммируется функциональный ряд с навороченной ф-цией.
 

Цитата:
г) Перед  следующем вызовом из основной программы функции Rho_my восстанавливается исходное значение nf.

Само по себе не восстанавливается, а хотелось бы. Как я понял, ничего не поделаешь, надо восстанавливать руками
 

Цитата:
При этом результат вычисления func в Rho_subra пропадает и нигде не используется.

Ничего не пропадает. Всё это используется.
 

Цитата:
Все это непонятно...

ну... что Вам сказать... не хотелось говорить лишнего  
 

Цитата:
Может быть Вы перепутали порядок вызова Pho_my и Rho_subra в основной программе?

Вряд ли.
 
Я оч. постарался избавить Вас от неинтересных Вам деталей. Только ни фига из этого не вышло. Всё равно пришлось объяснять детали чтобы снять с себя подозрения в слабоумии. Вообще-то из всего этого я для себя почерпнул кое-что ценное. А именно возможность декларировать переменные в начале модуля. Кроме того, опираясь на Ваши советы я решил избавится от коммонблоков в модуле. Так что спасибо. Прошу прощения, что такая мелочь превратилась в жевание мочалки.

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 21:02 06-12-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кстати, интеловцы раздают свою ODE solver library здесь
http://software.intel.com/en-us/articles/intel-ordinary-differential-equations-solver-library/
Похоже что очень неплохая библиотека,  хотя надо бы бенчмарки сделать...
Кто-нибудь уже пробовал?
 
Добавлено:
bubanoid

Цитата:
 
Цитата:
г) Перед  следующем вызовом из основной программы функции Rho_my восстанавливается исходное значение nf.
 
Само по себе не восстанавливается, а хотелось бы. Как я понял, ничего не поделаешь, надо восстанавливать руками  

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

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 18:21 07-12-2010
akaGM

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

Цитата:
Не хотите чтобы внешняя переменная менялась в процедуре,- так не меняйте ее!  

лучше и не скажешь...
я её не хочу менять, но меняю, а она почему-то меняется...
:)
 
bubanoid,
если тебе не подходят советы типа
sub foo(n)
 integer, intent(in) :: n
 
или
 
sub foo(n)
!DEC$ attributes value :: n
 integer n
 
или
 
восстановление по входу/выходу (что есть изврат),
 
то вообще непонятно что же ты хочешь...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 19:17 07-12-2010 | Исправлено: akaGM, 21:48 07-12-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[технический пост]

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 15:47 08-12-2010 | Исправлено: akaGM, 15:48 08-12-2010
Vladik71

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем привет!
 
Есть одна непонятная ситуация: вычисляется интеграл методом симпсона
 
                  program iondisk
      IMPLICIT DOUBLE PRECISION (a-h,o-z)
      DIMENSION sad(1000)
      N=1000
                  ...
                  sad(i)=sad(i)+(aah/6.0)*(freqfunc(aa1)+4.0*freqfunc(aa2)+freqfunc(aa3))
      aa1=aa1+aah
      
получаю ответ компилятора:
 
F:\77\mc.f90(15) : Error: This name has not been declared as an array.   [SAD]
   sad(i)=sad(i)+(aah/6.0)*(freqfunc(aa1)+4.0*freqfunc(aa2)+freqfunc(aa3))
----------^
Error executing df.exe
 
Почему компилятор не реагирует на строку:    DIMENSION sad(1000)    ???

Всего записей: 81 | Зарегистр. 12-07-2010 | Отправлено: 01:04 12-12-2010
nonOnix

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста. в Фртране формируется файл путём скидывания в него 6 массивов:
 
COMMON /CM3/ Circum(600), Arcd(1100), Direct(500), Circumk(600), Arck(1100), Directk(500)
 
Open(1, FILE=Catal, STATUS='unknown', FORM='UNFORMATED')
 
Write(1) Circum, Arcd, Direct, Circumk, Arck, Directk
 
Close(1)
 
Этот файл потом необходимо прочитать в Delphi, хотелось бы понять какую структуру он имеет.

Всего записей: 1 | Зарегистр. 12-12-2010 | Отправлено: 15:24 12-12-2010
terminat0r



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

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 15:44 12-12-2010 | Исправлено: terminat0r, 15:45 12-12-2010
Vladik71

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

Цитата:
не очень понятно что там у вас, но посмотрите как по стандарту обьявляется массив в фортране.  

 
Проблема решилась просто заменил маленькие буквы на заглавные и всё прошло !!!
 
Скажите пожалуйста, может я чего пропустил в жизни? Раньше не было разницы из каких букв должно состоять имя массива, лишь бы оно не начиналось с цифры, и не содержало бы вясческих знаков типа ">", "=", "\" и тому подобных...
 
К тому же у меня куча программ, где имена массивов прописаны маленькими и все прекрасно работает...

Всего записей: 81 | Зарегистр. 12-07-2010 | Отправлено: 16:34 12-12-2010
Andrew10

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

Цитата:
Проблема решилась просто заменил маленькие буквы на заглавные и всё прошло !!!
 

 
Скорее всего где-нибудь рядом был непечатный символ. Интересно, что будет, если назад заменить на строчные буквы?
 
Вообще-то в стандарте фортрана регистр не играет значения.
 
 
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 17:35 12-12-2010
Vladik71

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

Цитата:
Скорее всего где-нибудь рядом был непечатный символ. Интересно, что будет, если назад заменить на строчные буквы?  
 
Вообще-то в стандарте фортрана регистр не играет значения.  

 
Спасибо за ценную мысль, скорее всего, действительно проблема была в каком-то непечатном символе, который никак не отображался. Или в каком-то "свойстве символа", который как-то "прицепился".
 
Одного не пойму, откуда он взялся? Т.к. в основном, если нужно что-то написать, или посчитать, берется скелет старой программки и вписывается нужный алгоритм... Но, все старые-то проги - "рабочие".

Всего записей: 81 | Зарегистр. 12-07-2010 | Отправлено: 19:38 12-12-2010
bubanoid



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

Цитата:
Наверно вам надо на доске раз 200 написать
"Все переменные  по умолчанию в фортране передаются по ссылке". Если вы передали в процедуру или функцию какую то переменную, то вы работаете с этой переменной а не с ее копией. Не хотите чтобы внешняя переменная менялась в процедуре,- так не меняйте ее!  

Вот я вас понял, а вы меня нет. Мне НАДО менять переменную nf в процедуре. Эта переменная учитывается при расчёте функции Rho_my(x). Единственный способ передать переменную в Rho_my(x) - common block или через описание переменной nf вверху модуля (я не знаю, как правильно назвать эту область. может интерфейс модуля?). Было бы выходом передавать переменную след. образом:  
subroutine Rho_subra(...,nf,...)
integer, intent(in) :: nf  
и  
real(8) Rho_my(x,nf)
integer, intent(in) :: nf  
только так делать я не могу: Rho_my мне нужна именно в виде Rho_my(x), так как в программе я её интегрирую IMSL-овской процедурой.  
 
Вопрос не стоял ПОЧЕМУ переменная меняется по выходу из процедуры, а стоял ЕСТЬ ЛИ СПОСОБ сделать так, что бы она не менялась. И написав мне 200 раз на доске "Все переменные по умолчанию в фортране передаются по ссылке" вы не отвечаете на мой вопрос. Иначе я вас сразу же спрашиваю: а как НЕ по умолчанию передать переменную, чтобы по выходу из Rho_subra она не поменяла своё значение?
 
akaGM
первый способ - не катит,
второй - не катит,
третий (тот что изврат) - единственное, что осталось.
 
Второй способ я попробовал, но не совсем понимаю, что это. Я мельком глянул в гугл (не вникая) и такие конструкции встречаются при необходимости создавать процедуру затем вызываемую из C. Это так?  
 
Добавлено:
Vladik71
Иногда бывает, что по неосторожности какое-то "c" или "o" в названии переменной набираются кириллицей.

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 20:56 12-12-2010 | Исправлено: bubanoid, 21:00 12-12-2010
KChernov



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

Цитата:
Иногда бывает, что по неосторожности какое-то "c" или "o" в названии переменной набираются кириллицей.

Вот для избегания таких проблем implicit none и нужен

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 21:51 12-12-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
Почему нельзя сделать так:
Переприсваивать нужно не в вызывающей программе, а в вызываемой, т.е. в Rho_my. При входе в нее пишете одну строчку, что-нибудь вроде
nf1 = nf
 и дальше в этой подпрограмме работаете с nf1. Тогда не нужно будет восстанавливать nf в main-программе после каждого вызова. И никакого изврата в этом нет.
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 23:29 12-12-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
Я сразу заявлял что мне не понятно что вы хотите. Сейчас понял. Послушайте Andrew10 и сделайте как он говорит.

Цитата:
Второй способ я попробовал, но не совсем понимаю, что это. Я мельком глянул в гугл (не вникая) и такие конструкции встречаются при необходимости создавать процедуру затем вызываемую из C. Это так?  

Это кстати именно передача не по ссылке а по значению.   2003 стандарт.

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 04:08 13-12-2010 | Исправлено: terminat0r, 06:37 13-12-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