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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
djdtyfhu
всё-таки со строками фортран плохо сопрягается с другими языками
 

Цитата:
Спасибо за наводку насчет самому написать процедуру чтения, попробую.

CALL FREADC(8,Name_REC,string)
если ты ищешь запись по имени, то сам на Дельфи тоже застрянешь писать...
сначала надо прочитать файл в буфер, потом найти эту запись (или найти сначала эту запись) брр...
 
лучше продолжай играть с фор-дельфи
 
а, кстати, что не работает-то в твоей конструкции?

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 16:37 23-08-2007
djdtyfhu



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
 
В начале каждого бинарного файла есть сервиснная запись, что-то типа каталога, где описаны все входящие в файл массивы, с указанием их размера и началального положения в файле. Эту сервисную запись я уже умею извлекать, а по содержащейся там информации, думаю легко можно считать нужную переменную уже средствами Delphi.  
 
Все упрощается еще и тем, что каждый элемент записи имеет строго определенный набор: 4 байта, т.о. общий размер который надо считать будет:
  ( число элементов в массиве)*4 байт.
Остается только правильно интерпретировать эти 4 байта:
  Single
  Integer
  или же 4 символа.
 

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 17:20 23-08-2007
akaGM

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

Цитата:
где описаны все входящие в файл массивы, с указанием их размера...
 
т.о. общий размер который надо считать будет:   ( число элементов в массиве)*4 байт.  
 

 
может всё-таки в заголовке написан _общий_ размер массива, кот. надо считать  
и не надо его Х на 4 байта?

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 17:40 23-08-2007
djdtyfhu



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
 
Нет там точно описано общее количество элементов в каждой записи. Проверяется просто: стандартное число, которое там пишется это 978, что соответствует числу ТВС в реакторе БН-600, так и вычислил что это общее число элементов для записи.
 
Добавлено:
Вот кусок заголовка:
 

     !----------------!----------------!----------------!-----------------!
     !     Name       !    Length      !Start number    !      DATA       !
     !                !                !  Records       !     Blocks      !
     !----------------!----------------!----------------!-----------------!
     !    KTV         !        1000    !         4      !        0      0 !
     !    TCT         !       17604    !         5      ! 30112005 110046 !
     !    TCO         !       17604    !        23      ! 30112005 110046 !
     !    TG          !       17604    !        41      ! 30112005 110046 !
     !    TNOM        !         978    !        59      !   150199 135634 !
     !    TMAX        !         978    !        60      !   150199 135634 !
     !    TNA         !         978    !        61      !   150199 135634 !
     !    TH2         !         978    !        62      !   150199 135634 !

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 17:58 23-08-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а с другой стороны...
может в фортране читать просто блок байт, а на интерпретацию отдать в Дельфи и делать там с ним уже что тебе угодно?
 
что это вообще за формат?

Цитата:
в реакторе

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

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 18:59 23-08-2007
djdtyfhu



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
 
 
Спасибо за указание на то в какую сторону смотреть.
Сделал чтение символьных данных через функции Delphi:
 
 

Код:
procedure TForm1.btReadCHERTClick(Sender: TObject);
type
  TTypeCHAR=array[1..1000,1..4] of char;
var
  F:file;
  buf:TTypeCHAR;                             // буфер для отдельных символов
  bufSTR:array[1..1000] of string[4];        // буфер для отдельных подстрок
  bufCHERT:array[1..250] of string;          // буфер для полных названий чертежей
  bufTYPCHERT:array[1..250,1..2] of single;  // буфер для номера типа чертежа
  filename:string;
  RECLEN:Integer;
  i:integer;
  CHERTEZH:array [1..1000] of string;        // массив названий чертежей, где индекс массива это тип чертежа
begin
  RECLEN:=SizeOf(buf);
  filename:=edFileName.Text;
  AssignFile(F, filename);
  Reset(f,RECLEN);                           // открываем нетипизированный файл с размером записи в 4000 байт
 
  Seek(F,119-1);                             // перемещаемся на 119 запись
  BlockRead(f, buf,1);                       // читаем CHERTEZH
 
  Seek(F,120-1);                             // перемещаемся на 120 запись
  BlockRead(f, bufTYPCHERT,1); //читаем TYPCHERT
  CloseFile(f);
 
  for i := 1 to 1000 do                                // объединяем отдельные символы в подстроке
    bufSTR[i]:=buf[i,1]+buf[i,2]+buf[i,3]+buf[i,4];
  for i := 1 to 250 do                                 // объединяем отдельные подстроки в название чертежа
    begin
      bufCHERT[i]:=bufSTR[4*i-3]+bufSTR[4*i-2]+bufSTR[4*i-1]+bufSTR[4*i];
      Q_StrToAnsi(bufCHERT[i]);                        // переводим в кодировку Windows
    end;
  for i := 1 to 250 do                                 // пишем итоговый массив
    begin
      if Trunc(bufTYPCHERT[i,1])=0 then
        Continue;
      Form1.Memo1.Lines.Append(IntToStr(i) + ' ' +  IntToStr(Trunc(bufTYPCHERT[i,1])) + ' ' + bufCHERT[i]);
      CHERTEZH[Trunc(bufTYPCHERT[i,1])]:=bufCHERT[i]];
    end;
  ShowMessage(CHERTEZH[55]);
end;

 
Но от Фортрана все равно не уйти: иначе никак не узнать в какой по счете записи находятся нужные данные, а так уже сделал класс с функциями для чтения нужных данных.

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 13:53 24-08-2007
akaGM

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

Цитата:
Но от Фортрана все равно не уйти: иначе никак не узнать в какой по счете записи находятся нужные данные

почему?
сделай что-то типа initDataFile() на Дельфи, читай стартовый заголовок и вся информация о расположении записей -- твоя...
 
в качестве замечания по стилю (без обид):
 
  array [1..250]
  array [1..1000]
 
  Seek(F,119-1);
  Seek(F,120-1);  
 
все непосредственные значения лучше выносить в начало в блок констант..
const
 N_что-то_там = 250;
 BUFFSIZE = 1000;
 ЕЩЁ_ЧТО-ТО = 120;
 
  Seek(F, Pred(ЕЩЁ_ЧТО-ТО)-1);
  Seek(F, ЕЩЁ_ЧТО-ТО-1);  
 
потом править и понимать, в общем, жить легче окажется...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:43 24-08-2007
djdtyfhu



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

Цитата:
в качестве замечания по стилю  


Цитата:
Seek(F,119-1);  
  Seek(F,120-1);  

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

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 12:31 27-08-2007
akaGM

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

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 19:27 27-08-2007
djdtyfhu



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пытаюсь получить путь по которому находится exe файл:
 

Код:
 
hWndDPlot=FindWindow('DPlot'c, NULL)
hInstDPlot=GetWindowLong(hWndDPlot,GWL_HINSTANCE)
wStatus=GetModuleFileName(hInstDPlot,szDPlot, len(szDPlot))

 
где  

Код:
szDPlot - переменная в которой нахоо сохранить путь к exe

 
Но после выполнения кода в переменной появляется путь, по которому находится моя запускаемая программа на фортране.
 
Как же получить путь к exe через дескриптор окна?
 
P.S. В справке приводилась немного отличная процедура:

Код:
hInstDPlot=GetWindowWord(hWndDPlot,GWW_HINSTANCE)
wStatus=GetModuleFileName(hInstDPlot,szDPlot,len(szDPlot))

 
но мануале по Compaq Visual 6.6 прочитал что функция устарела и надо использовать новую
 
 

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 14:37 05-09-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
djdtyfhu
 
не понял...
что получить? на чём? на Дельфи? на Фортране?
к текущему исполняемому? просто к дисковому?
 
гы
 
myPath1 := ExtractFilePath(paramstr(0));
myPath2 := ExtractFileDir(paramstr(0));

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 15:27 05-09-2007 | Исправлено: akaGM, 16:18 05-09-2007
djdtyfhu



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
 
Пишу на Digital Fortran 6.6
Надо из запущенной программы узнать путь к другой программе по дескриптору окна той другой программы.
 
Понятно, что в Delphi проблем бы не было

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 16:41 05-09-2007
akaGM

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

Цитата:
Пишу на Digital Fortran 6.6

имхо, не то ты на нём пишешь...
 
щас...
 
--------------------------------------
всё правильно у тебя, только
поменяй
hWndDPlot=FindWindow('DPlot'c, NULL)
на
hWndDPlot=FindWindow(NULL, 'DPlot'c)
 
второй параметр -- имя окна, первый -- класса...

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
и вообще, вместо
GetModuleFileName()
в NT'ях надо
GetModuleFileNameEx()
использовать...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 17:14 06-09-2007
djdtyfhu



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

Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 17:44 06-09-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
djdtyfhu
странные это всё проблемы... какие-то нерасчётные они...
может в постановке задачи что-то не так?
 
что в принципе хотелось бы, если не секрет? хакаешь что ли кого?

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 18:01 06-09-2007
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна функция Бесселя Jn, диапазон аргументов от 1е-5 до 1е+5,  n=0-8
но с точностью минимум 18-20 знаков. Не хуже Maple и Mathematica
(я так понимаю надо мне MPFUN90 подключать) но как саму функцию считать? Посоветуйте что-нибудь.
 
Все что я нашел, дает где-то 6-7 знаков в сравнении с Maple.

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 21:03 06-09-2007
akaGM

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

Цитата:
18-20 знаков

на фига такая точность?
дабл всё равно тебе только 15-16 знаков даст...
или у тебя 64-битная арифметика?
 

Цитата:
надо мне MPFUN90

тогда да...
 

Цитата:
но как саму функцию считать?

imsl, nag, numerical recepiens
 
вот ещё:
http://gams.nist.gov/Classes.html
cм. класс C10:
http://gams.nist.gov/serve.cgi/Class/C10/
 
и вообще, для кого я шапку здесь сотворял?

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 23:09 06-09-2007 | Исправлено: akaGM, 23:24 06-09-2007
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
 
мне надо интеграл от BesselJ(n, a(x))* (b(x)+I*c(x))*exp(-I*d(x)) dx посчитать
 
тут все a,b,c,d функции- заданы только чисельно и значения принимают от 1е-2 до 1е8.
При этом оказывается этот интеграл очень чуствителен к функции Бесселя.
 
Мне таких интегралов надо посчитать тысячи (разные a,b,c,d и n) и  просуммировать. (одна сумма- это точка на граффике)
 
Я написал в Maple программку, но он считает 100 таких инеграллов где-то 3-4 часа при Digits:=20. Это очень долго.
К тому же мне не хватает оперативки ( или там есть утечки памяти) - после ночи вычислений я прихожу и вижу забитых 4 Гб РАМ и 8 Гб свопа.  
 
Программа на фортране считает все где-то за 8-10 часов но есть разница с Maple  и при некоторых значениях очень существенная.
 

Цитата:
imsl, nag, numerical recepiens

это как раз приблизительно то
Цитата:
Все что я нашел, дает где-то 6-7 знаков в сравнении с Maple.

там во всех функциях стоят параметры-коэффициенты с недостаточным количеством знаков. Где взять недостающие цифры?
 
Интересно бы узнать как Maple и Mathematica это делают.
 
 

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

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

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 19:31 07-09-2007 | Исправлено: akaGM, 19:32 07-09-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 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