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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
А что дает?  
Но все равно хорошо что клопа нашли!
 
2ALL
 
Кручу-верчу: фортран и си++
Может кто подскажет что здесь не так со структурой в fun.cpp - туда ничего с фортрана не долетает почему-то. А у меня на ночь уже кризис мозга наступил
 

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 05:05 10-01-2014
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
 
ну я сам отчасти виноват, асин требует аргумент <=|1|
 
у тебя структуры не выровнены одинаковым образом, каждый компилер оптимизировал по-своему...
 
для гнуся надо использовать
-fpack-struct=1
а для гфортрана
-fpack-derived
 
должно работать...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 12:59 10-01-2014
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
не помогает :/
хотя где-то здесь собака - добавляю 16 для указателя в сишной функции перед приведением типа - все начинает работать. (система 64битная)  

Код:
 
void fun(int* neq, double* t, double y[], double ydot[], void * user_data)
{
     int i;
     intptr_t nptr;
     nptr=(intptr_t)user_data+16;
     user_data=(void *)nptr;
     parameters_c * p =(parameters_c*)(user_data);  
      ...
 

 
Комбинация icc и ifort дают уже разницу в -32 по дефолту

Код:
       
      nptr=(intptr_t)user_data-32;
      user_data=(void *)nptr;
      parameters_c * p =(parameters_c*)(user_data);
 

 
Не врубаюсь, как мне это все ровнять?

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 15:34 10-01-2014
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
 
а такие строчки что у тебя говорят?
 
write(*,*) ' F: sizeof = ', sizeof(fdata)
 
cout << " C: sizeof = " << sizeof(parameters_c) << endl;

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 16:58 10-01-2014
terminat0r



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

Код:
 
type, bind(c) :: parameters_f
      real(c_double) :: t_init
      real(c_double) ::t_end
      real(c_double) ::dt
      integer(c_int) :: neq
      integer(c_int) :: nout
end type
 
typedef struct  
{
           double  t_init;
           double t_end;
           double dt;
           int neq;  
           int nout;
}  parameters_c;

 
 
  F: sizeof =  32
  C: sizeof = 32
 
 
---
Не представлял  раньше какой геморрой я себе откапываю с этой introperability. Со строками там труба, со производными типами и структурами -как видим тоже, даже массив больше одной размерности перебросить как параметр  - уже не сахар. После несколько ночей пришло понимание, что надо будет все-таки переписывать весь интерфейс к сольверам с юзерфункциями и якобианами на фортране.  
 
Но тут тоже проблема- думал, что получится хотя бы пробросить сишную структуру с параметрами в фортрановскую юзерфункцию и там прочитать, но реально она содержит также несколько строк с именами файлов итп и константы, так что уже не знаю получится ли.

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 17:31 10-01-2014 | Исправлено: terminat0r, 17:45 10-01-2014
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
 
я бы делал это на if и закатал бы всё в длл...
 
Добавлено:
задрало меня это бинданье...

Код:
C
 
void fun(int& neq, double& t, double y[], double ydot[], int& intp)
{
      cout<<"inside fun"<<endl;
//      const parameters_c * p =(parameters_c*)user_data;
      const parameters_c * p =(parameters_c*)intp;
...
 
FOR
 
subroutine fun(neq, t, y, ydot, user_data) bind (c, name="fun")
...
!            type(c_ptr) :: user_data
            integer(c_int) :: user_data
end subroutine fun
 
в main
 
integer(c_int) :: user_data
...
!user_data = c_loc(fdata)
user_data = loc(fdata)

как и советовал с самого начала трахаться с адресами-поинтерами как с простыми целыми числами...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:14 10-01-2014
terminat0r



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

Цитата:
как и советовал с самого начала трахаться с адресами-поинтерами как с простыми целыми числами...

Ага, спасибо, работает!
В принципе я попробовал похожее но "с этим бинданьем" + замена c_ptr на long int и integer(c_long) как параметр - тоже работает! Может все-таки когда-то докопаемся что там не так с этим c_ptr ...

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 20:17 10-01-2014
akaGM

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

Код:
    TYPE, BIND(C) :: C_PTR
        PRIVATE
        INTEGER(C_INTPTR_T) :: ptr
    END TYPE C_PTR

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 23:26 10-01-2014
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кстати, нашёл интеловский аналог
!GCC$
о кот. раньше не знал...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 09:21 11-01-2014
terminat0r



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

Цитата:
не знаю как в гфортране, исходники не смотрел, а у интела всё в порядке  

так в gfortran-е все аналогично, я не сомневаюсь. Вопрос в другом - как передать этот пойнтер правильно -я перепробовал наверное все опции компиляции да и прагмы в Си функции для выравнивания и упаковки структур - там это не помогает - надо это делать в gfortrane именно для type декларации - а там это как я понял еще не сделали
 

Цитата:
кстати, нашёл интеловский аналог
!GCC$

и какой?
а понял
а в интела какой?

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 19:55 11-01-2014 | Исправлено: terminat0r, 20:29 11-01-2014
akaGM

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

Цитата:
Вопрос в другом - как передать этот пойнтер правильно -я перепробовал наверное все опции компиляции да и прагмы в Си функции для выравнивания и упаковки структур - там это не помогает - надо это делать в gfortrane именно для type декларации - а там это как я понял еще не сделали

да сделали, только в интеле это всё гораздо удобнее делается через атрибуты...
слава богу в гнуси уже есть, скоро и фортран подтянется...
 
на
поменяй в самых начальных своих исходниках только один символ и пользуйся на здоровье:
 
void fun(int& neq, double& t, double y[], double ydot[], void * & user_data);

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 21:56 11-01-2014 | Исправлено: akaGM, 21:59 11-01-2014
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Да вы батенька гений! Спасибо. И как я это прошляпил

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 16:35 12-01-2014
akaGM

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

Цитата:
не доверяю я этим интентам...

есть в гфортране интеловский аналог?
integer(4), intent(in), value :: i
integer(4), intent(out), reference :: j

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 17:15 12-01-2014
Caspers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!=)  
 
Я тут столкнулся со следующей проблемой. В своей проге использую библиотеки IMSL 6.0. При запуске программы на одном компе - все работает отлично, на другом, где установлено та же самая VS 2008, fortran, IMSL при запуске выдает ошибку  
"Точка входа в процедуру atan2.J не найдена в библиотеке DLL libmmd.dll".
Может ли быть причиной то, что на втором компе пользователь набран кирилицей? или как с этим можно бороться?

Всего записей: 9 | Зарегистр. 14-12-2005 | Отправлено: 22:38 10-02-2014 | Исправлено: Caspers, 22:39 10-02-2014
akaGM

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

Цитата:
Может ли быть причиной то, что на втором компе пользователь набран кирилицей?
если это единственное различие между писюками, то это просто проверяется...
а вот если 32/64 или тип прцессора с разными версиями sse, то надо смотреть что за сборка библиотеки...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 13:38 11-02-2014
kkuuhhaa

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
налетел тут на странности с перегрузкой функции
    interface
      integer  function ZipAdd(i,file1,file2)
!DUB$  ATTRIBUTES C, ALIAS:'_ZipAdd' :: ZipAdd
    integer i
      character*(*) file1,file2
!DUB$ATTRIBUTES REFERENCE :: file1,file2
      END function
      integer  function mem2zip(i,file1,j,k)
!DUB$  ATTRIBUTES C, ALIAS:'_ZipAdd' :: mem2zip
    integer i,j,k
      character*(*) file1
!DUB$ATTRIBUTES REFERENCE :: file1
      END function
    end interface
Результат зависит от последовательности описания функций, но вместе не работают.
 
extern "C" ZRESULT ZipAdd(HZIP hz,const TCHAR *dstzn, void *src,unsigned int len);
 ZRESULT ZipAdd(HZIP hz,const TCHAR *dstzn, const TCHAR *fn);
1я (ZipAdd) крэшится по защите доступа вне зависимости от порядка записи, а, если объявить наоборот, то 2й вызов (mem2zip) не работает. Что-то я не понимаю на уровне ДНК
 
Спасибо
ЗЫ Фу, рассосалось.

Всего записей: 131 | Зарегистр. 14-05-2008 | Отправлено: 12:46 20-02-2014 | Исправлено: kkuuhhaa, 13:19 26-02-2014
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kkuuhhaa
 
честно пытаюсь помоччь, но наши женщины сегодня празднуют 23-е...
 
не нравится мне
character*(*) file1
попытайся исключить передачу ФОР-строк в Си
есть силы/умение пользуйся указателями, не уверен -- используй глобаоьные статические строки на первое время...
 
Добавлено:
на самом делe как-то так:

Код:
interface
 subroutine cproc(sin, sout) bind(C)
    use :: ISO_C_BINDING
    chsrascter(kind=C_CHAR), dimension(*) :: sin,sout
 end subroutine cproc
end intrface
 
character(80) ostr, istr
 
istr = "Testing..."C
 
call cproc(istr, ostr)
 
-----
extern "C" void cproc(char* istr,  char* ostr);

 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 14:36 20-02-2014
kkuuhhaa

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

Цитата:
не нравится мне  character*(*) file1
Вот уж здесь как раз никогда проблем не было в Си вызовах, обычная штатная запись (    character(C_CHAR ничего не меняет). Забыл упомянуть, если нет описания 2й функции, то 1я работает. Т.е. по отдельности всё работает, а вместе не хочет, при вызове из Си опять же работает. Причину нашёл (вторая С-компоновка перегруженной функции "функция" не допускается)  
http://msdn.microsoft.com/ru-ru/library/5z9es6ec.aspx  
только вот, как это обойти?

Всего записей: 131 | Зарегистр. 14-05-2008 | Отправлено: 15:34 20-02-2014 | Исправлено: kkuuhhaa, 21:13 21-02-2014
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день всем!
 
Обнаружил следующее поведение у компилятора IVF, версия 13.1.0.149
 
В основной программе открываю файл и считываю из него несколько строк.
Затем номер устройства ввода передаю в подпрограмму и продолжаю считывание данных построчно.
 
При этом получается следующее:
1) Если основная программа и подпрограмма компилируются в исполняемый код,  
объединяясь в один exe-файл, то все работает нормально.
 
2). Если подпрограмму отдельно скомпилировать в dll-библиотеку, а затем создать исполняемых модуль, который при выполнении загружает эту библиотеку, то выдается ошибка на операторе READ в подпрограмме, хотя номер устройства ввода передается в подпрограмму правильно.
Код ошибки:
severe (29): File not found.
 
Вопросы:
 
1. Это баг или фича IVF, или так и должно быть, согласно канонам?
2. Если так и должно быть, что посоветуете сделать, чтобы это обойти?
Ест-но, совет типа"компилируй все вместе" я себе уже дал сам  .
 
Для интересующихся: здесь архив, в котором файлы с исходниками теста, файл данных и readme c командами для создания exe-файла в командной строке Intel Visual Fortran, а также с выводом на экран в обоих случаях.
 
Спасибо!
 
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 16:02 20-02-2014 | Исправлено: Andrew10, 16:09 20-02-2014
kkuuhhaa

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

Цитата:
Andrew10

повторить не удалось. Всё работает, как в lib и в obj варианте. И где тут  dll? Это standalone б-ка
http://i60.fastpic.ru/big/2014/0220/06/cd0c76022a772dd8aee8cf65b21dd406.jpg

Всего записей: 131 | Зарегистр. 14-05-2008 | Отправлено: 17:30 20-02-2014
Открыть новую тему     Написать ответ в эту тему

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