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

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

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

Цитата:
А как лучше?

вопросом на вопрос: я для чего?
для читабельности программы? для производительности? для реюза?
 

Цитата:
статические массивы всегда лучше динамических, не говоря уж о вызовах...  
 
Это почему это?

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

Цитата:
Если у нас вычисляется несколько значений по выражениям, в которых есть совпадающие части, компилятор сам это оптимизирует так, чтобы совпадающие части вычислялись только 1 раз?

это вряд ли... если только полное выражение, но не часть, это 100% -- "нет", ручками... а так смотри ман используемого компилера...
 
я тут как-то в этом же трейде рекомендовал статью "как защититься от оптимизирующего компилятора", найди, почитай...
 
вообще, в чём проблема-то?

Цитата:
Кодер

и о чём тогда спич эбаут?
"как хозяин-барин решит так и будет"...
или код отдаётся в [оч]умелые ручки на дальнейшую эксплуатацию?

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 15:59 19-11-2007
KChernov



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

Цитата:
вопросом на вопрос: я для чего?
для читабельности программы? для производительности? для реюза?  

Основная задача - минимизировать время на реализацию формул и по возможности исключить ручную оптимизацию.
 

Цитата:
статические массивы всегда лучше динамических


Цитата:
я имел ввиду скорострельность...  

А разве доступ к элементу динамического массива происходит дольше?
Ведь в обоих случаях это просто область в памяти...
 

Цитата:
на вызовах, даже если всё через регистры передавать или заинлайнить, ты потеряешь в производительности...

Что потеряю, понятно, а вот хотелось бы знать насколько.
Если это проценты/десятки процентов - это одно, а если это разы/порядки - это уже совсем другое.
Думаю, что все таки скорее первый вариант, так как иначе тот же С++ кардинально отличался от С по производительности при работе с массивами, однако я ничего подобного не слышал.
 

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

Спасибо, поищу.
 

Цитата:
вообще, в чём проблема-то?

Да проблем особых пока нет, но хочется все вусмерть заоптимизировать %)
 

Цитата:
и о чём тогда спич эбаут?
"как хозяин-барин решит так и будет"...

Ну так я этим и занимаюсь сейчас здесь.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 17:17 19-11-2007
akaGM

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

Цитата:
А разве доступ к элементу динамического массива происходит дольше?
Ведь в обоих случаях это просто область в памяти...  

гы, парень, ты чё?
хочешь асм-листинг кода?

Код:
 
      integer*4 iStat(100)
      integer*4, allocatable :: iDyn(:)
       
      iStat(100) = 20
 
      allocate(iDyn(100))
      iDyn(100) = 30
 
      print *, iStat(100), ' ', iDyn(100)
 
      end
 

--------
iStat(100) = 20
        mov       DWORD PTR $ISTAT+396, 20

--------
всё...
 
 
--------
iDyn(100) = 30
строке, в которой непосредственно осуществляется это присваивание
предшествует минимум 8 инструкций типа mov, lea и add для вычисления адреса и смещения!
      mov       DWORD PTR [edx+ecx+400], 30

--------

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 17:47 19-11-2007 | Исправлено: akaGM, 17:55 19-11-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в лучшем случае мне удалось добиться:
        mov     eax, DWORD PTR $IDYN+32
        mov     DWORD PTR [eax+396], 30
 
всё равно это на одну инструкцию больше + косвенная адресация
хотя, тогда уж я сам бы написал
 
        mov     DWORD PTR $IDYN+428, 30 ; 396+32
 
так что отчасти ты прав...
но разные компиляторы со своими менеджерами памяти/кучи будут по-разному всё это хозяйство обслуживать,
например, visualC хранит iDyn как простой указатель (4 байта), а IF -- как отдельный блок-дескриптор с 32-байтным хидером
не всё так просто...
 
и правило тут одно:
чем больше универсальности, тем больше потеря производительности...
надо смотреть по месту...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 20:33 19-11-2007 | Исправлено: akaGM, 20:53 19-11-2007
rch

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
здравствуйте. Подскажите пожалуста как сделать такую штуку. Есть программа, которая в результате работы выдает файл, например rez.dat, на следующей итерации она заменяет его на новый. Как сделать так, чтобы файл не заменялся, а при каждой итерации создавался новый rez1, rez2, rez3 и т.д.? И еще, может кто-ниубдь сталкивался - расчетная программа, написанная в 77 фортране номально компилируется и запускается на MS PowerStation 4.0. Нет ли тут каких нибудь подводных камней связанных с комплиляцией, результаты счета будут такими же как 77 фортране?

Всего записей: 1 | Зарегистр. 19-11-2007 | Отправлено: 21:27 19-11-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Подводных камней при компилировании не очень старых программ (а Фортран77 - не такой старый стандарт, как Фортран66) на не очень новом (вариант - очень не новом, кому как нравится) компиляторе не должно быть в принципе. Фортран77 и более новые компиляторы без проблем понимают.
 
2. Примерно так:
 
character*12 filename
character*4 nomer  ! ну, это если счет итераций пойдет на тысячи
integer iterat           ! счетчик итераций  
 
iterat = 1
 
--- начало итерации ---
 
write(nomer,*) iterat   ! пишем в nomer число итераций, но могут записаться пробелы
call lefttrim(nomer)   ! функция LTRIM для удаления пробелов в начале строки
                              ! поддерживается некоторыми компиляторами. Если ее нет,
                              ! придется писать самим нечто подобное
filename = 'rez'//trim(nomer)//'.dat'
open(11, file = filename, form = 'formatted')
 
---- Тут мы что-то пишем в файл ----
 
close(11)
iterat = iterat + 1
 
------ конец итерации  -----
 
 
subroutine lefttrim(str)
-------------------------
character*(*) str
integer i, finish
 
do i = 1, len(str)
  if(str(i:i).ne.' ') then
    finish = i
    exit
end do
 
if(i.ne.1) str = str(finish:len(str))
return  
end
 
ЗЫ: кое-что поправил

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 00:04 20-11-2007 | Исправлено: XPEHOMETP, 09:17 20-11-2007
akaGM

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

Код:
 
хотя, тогда уж я сам бы написал
        mov     DWORD PTR $IDYN+428
 

грубейшая ошибка!
 
так и только так:

Код:
 
           mov     eax, DWORD PTR $IDYN+32
           mov     DWORD PTR [eax+396], 30
 

 
т.е. ещё раз... как и говорил --
+ одна лишняя инструкция и косвенная адресация (что на несколько тактов медленнее)
и на миллионе обращений выльется в ощутимые потери...
 
 
rch
MS PowerStation 4.0
проблем быть не должно, если там не использована микрософтная графика (тем более ДОСовская) или
что-то типа QuickWin
 
XPEHOMETP
лучше не тримать, а писать в nomer (гы) форматно ровно 4 чара с  дополнением слева нулями:
res0001.dat, res0002.dat... res9999.dat

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 16:09 20-11-2007 | Исправлено: akaGM, 16:19 20-11-2007
DeadVillage



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

Цитата:
do i = 1, len(str)
  if(str(i:i).ne.' ') then
    finish = i
    exit
    энд иф
end do  

 
и ещё про это разжуйте, а то непонятно:
 
   write(nomer,*) iterat   ! пишем в nomer число итераций, но могут записаться пробелы  
 
на этот момент nomer = ?

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 23:32 20-11-2007 | Исправлено: DeadVillage, 23:50 20-11-2007
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeadVillage
на этот момент nomer пуст (ну или там мусор или то что было записано в предыдущую итерацию, неважно), этот write пишет в переменную nomer (которая должна быть символьной) iterat в соответствии с заданным форматом, как уже кто-то говорил выше, стоит написать что-то вроде  

Код:
write(nomer,'(I4.4)') iterat
 тогда строка будет каждый раз дополнятся до 4 символов нулями и вы получите что-то вроде rez0001 rez0002 rez0003 ... что удобно для сортировки файлов итд

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 07:05 21-11-2007 | Исправлено: FuzzyLogic, 07:07 21-11-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
FuzzyLogic
спасибо!
действительно, когда переменная nomer символьная и когда формат указан, то проблем нет.
Интересно, что на отсутствие формата брыкался g95, а вот g77 спокойно проглатывал такой фокус.

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 08:36 21-11-2007
akaGM

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

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

внутренняя запись возможна только в _символьные_ переменные...
 
character*4 number
прокатит, а
character number(4)
нет...
 
 

Цитата:
когда формат указан, то проблем нет

безформатно вот так можно:
 
      integer*4 istat
 
      write(number, FMT=*, IOSTAT=istat) iterat
 
только длина number должна быть больше дефолтной длины безформатной записи...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 15:34 21-11-2007 | Исправлено: akaGM, 15:46 21-11-2007
DeadVillage



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

Цитата:
а ты не знал?  

до 09-10-2007 не знал. Потом увидел этот трюк в посте XPEHOMETPа
 
но я попробовал сделать подобное с integer переменной. Результат похожий немного - нет нулей в начале номера, и приходится задавать значение для number до write(number...

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 15:53 21-11-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeadVillage
афаир, это ещё в четвёрке было, во всех учебниках написано...
ту же sprintf() Си наследовал...

Цитата:
Результат похожий немного - нет нулей в начале номера, и приходится задавать значение для number до write(number...  

вот смотри:

Код:
 
      integer*4 iterat
      character*4 number
      iterat = 10
      write(number, '(I4.4)') iterat
      print *, number
      end
 
output:
 
 0010
 
компилятор IF 9.0.018
 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 16:51 21-11-2007 | Исправлено: akaGM, 17:43 21-11-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
akaGM
дык, эт я уже понял. наверное я невнимательно буквари читал.
 
а ты попробуй так же просто, но с integer*4 number, т.е. вот такое:
 
      integer*4 iterat
      integer*4 number
      iterat = 10
      write(number, '(I4.4)') iterat
      print *, number
      end  
 
output:
 
не получишь ничего пока не  присвоишь что-нить намберу до write(number...

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 17:48 21-11-2007 | Исправлено: DeadVillage, 17:51 21-11-2007
akaGM

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

Цитата:
наверное я невнимательно буквари читал

ну ты и посты невнимательно читаешь...

Цитата:
а ты попробуй так же просто, но с integer*4 number

 

Цитата:
akaGM
внутренняя запись возможна только в _символьные_ переменные...  
 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:03 21-11-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
akaGM
(про бесформатный вариант)

Цитата:
только длина number должна быть больше дефолтной длины безформатной записи...

т.е.? извиняй, буксую страшно.

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 20:44 21-11-2007 | Исправлено: DeadVillage, 20:46 21-11-2007
akaGM

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

Код:
 
      integer*4 istat, iterat
      character*4 number
      character*200 str
      iterat = 10
      write(number, FMT=*, IOSTAT=istat) iterat  ! ошибка
      write(str, FMT=*, IOSTAT=istat) iterat  ! норм
 

 
по-моему интел пишет дефолтом 12 символов integer*4
 
  character*12 minStr
  write(minStr, FMT=*, IOSTAT=istat) 10 ! норм
а
  character*11 minStr
уже вылет...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 21:20 21-11-2007 | Исправлено: akaGM, 21:25 21-11-2007
sergsergik

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нароод! Подскажите пожалуйста как использовать программы(уже исполняемые файлы .exe),  т.е. вставлять их в subroutine к примеру, Фортране 77. Работаю под DOS.  
Заранее спасибо!

Всего записей: 3 | Зарегистр. 26-11-2007 | Отправлено: 17:52 26-11-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sergsergik
для интел-Фортрана, например, вот так:

Код:
 
      use ifport
      logical*4 lresult
      integer*4 iresult
      lresult = SYSTEMQQ('my_exe.exe') ! вызов внешнего экзюка
      iresult = SYSTEM('my_exe.exe') ! или так...
      end
 

в своём дос-компиляторе ищи аналогичные функции...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:18 26-11-2007 | Исправлено: akaGM, 18:29 26-11-2007
sergsergik

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня еще такой вопрос, а как узнать программным образом какая функция сейчас выполняется, т.е. ее имя, другими словами внутри функции нужно получить ее имя, я работаю в Фортране 77

Всего записей: 3 | Зарегистр. 26-11-2007 | Отправлено: 20:48 26-11-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 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