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

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

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

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

Цитата:
IVF_11.0.074

ну так вот под ним же твой код идёт на "ура"...

Цитата:
Т.е. результат есть не 1 число, а вектор

чем вариант
Код:
subroutine myVector(N, resultVector)
  integer N
  real resultVector(N)
  ...
end subroutine

 
не подходит?
 
тем более для

Цитата:
Начинаю знакомиться с  FORTRAN

"от простого к сложному" -- самый верный подход...

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 20:33 15-07-2009 | Исправлено: akaGM, 20:41 15-07-2009
xMARx

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Программа начала компилироваться после того, как выставил: console7 properties/ fortran/ Diagnostics/ generate interface blocks=NO. Особо не шарю, что именно сделано )).. Сделал это на основании слов Steve Lionel, если я правильно их понял...
тут
З.Ы.: просто решил как то разобраться, в чем дело. За рекомендации спасибо- обязательно приму к сведению.

Всего записей: 66 | Зарегистр. 22-06-2009 | Отправлено: 23:40 15-07-2009 | Исправлено: xMARx, 23:40 16-07-2009
Vskazka

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

Цитата:
generate interface blocks=NO.

Лучше не делайте. А, вообще, посмотрите, что у Вас написано.  
здесь  
 
Цитата:
 ap = fap(a, n) + fap(b, n)  
n=3
Когда вызывается функция fap   в коде  
Цитата:
 do i = 1, size(a)  
size(a)=10. т.е. у Вас fap должно иметь размерность 10, а не три. В любом случае, правильно Вам говорит akaGM - не надо сложных конструкций на этапе изучения. И, вообще, хоть писать с помощью функций, значениями которых бывают массивы -легче,  сие не самый лучший путь. Если массивы большие, то много накладных расходов и требуется большой программный стек. В любом случае считается медленнее (проверял), а геморой с компиляцией легко нажить.  
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 06:08 16-07-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите советом... Программа скомпиленая в Борланд С++ Билдер вызывает в цикле несколько раз функцию из фортрановской длл. Ей передаются правильные параметры, на всех итерациях они даже одинаковые(тестовая задача), но нормально просчитываются только несколько первых итераций, на определенной итерации в длл происходит сбой при вызове своей же внутренней процедуры, хотя по дебагеру видно, что все параметрый ей переданы верно, и все вылетает с ошибкой. Либо есть еще вариант, что не вылелает, но отдает неправильное число, хотя ВСЕ входящие  числа однинаковые. И, наконец, в консоли все рабоает на ура...
Да, я понимаю, что всякие кросленгвиджи - это зло, но может ссть способ побороть... Пока у меня только мысль переходить на RAD Stuio 2009 с 2007...

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 19:57 29-07-2009
akaGM

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

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 15:32 30-07-2009 | Исправлено: akaGM, 15:41 30-07-2009
pir0texnik2



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

Код:
 
HINSTANCE HIns=NULL;
 
HIns=::LoadLibrary("ye_circ.dll");
if(HIns==NULL){ Application->MessageBox(L"ye_circ.dll not found!", L"Error", MB_OK); return;}
sub_fortran_1 ye_circ;
ye_circ   =(sub_fortran_1)(GetProcAddress((HMODULE) HIns,"YE_CIRC"));
 

 
прототип:

Код:
 
typedef void (__stdcall *sub_fortran_1)(double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const double*,const int*,const int*,const int*,const int*,const int*,complex<double>*);
 

 
вызывается соответственно так:
 

Код:
ye_circ (&precis,&a,&Li,&Di,&Lj,&Dj,&Z0i,&Z0j,&k,&k2,&pl2,&plik2,&qlik2,&qljk2,&df,&dl,&p,&q,&i,&j,&II,&Y);

 
вот так начинается процедура в фортране:
 

Код:
 
subroutine ye_circ (precis_out,a_,Li_,Di_,Lj_,Dj_,Z0i_,Z0j_,k_,k2_,pl2_,plk2_,qlk2_,qlkj2_,df_,dl_,p_,q_,i_,j_,M_max_,ye_circ_out)
!DEC$ ATTRIBUTES DLLEXPORT :: YE_CIRC
 
include 'link_fnl_shared.h'
 

 
Кол-во аргументов должно совпадать.
Оптимизации отключал, включал, переставлял, менял местами - без разницы...
 
Кстати, поставил 2009 РАД студию... переклмпилировал. Там, где раньше считало какие-то циферки теперь НАНы, другой в общем результат...

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 02:05 31-07-2009
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
На первый взгляд видно 2 момента:
1) По поводу "::LoadLibrary":
а) когда эта функция у меня вызывалась много раз (> ~40 - не помню, давно это было) возникала порча памяти и результатом был набор случайных цифр. Я потом нашел информацию, что эти вызовы (не сами dll, а информация о вызовах) как-то фиксируются в ограниченном куске памяти, предоставляемом системой. Если этот кусок переполняется, то захватывается соседняя память --> имеем порчу памяти;
б) фиксация вызовов и поведение этой функции зависит от ОС, т.е. она может возвращать как HINSTANCE уже загруженной dll (если таковая имеется в памяти), так и размещать новую копию dll, даже если есть уже загруженная.
Возможные решения:
а) использовать в цикле "::FreeLibrary" столько раз, сколько используется "::LoadLibrary";
б) вынести "::LoadLibrary" из цикла (ну и добавить "::FreeLibrary");
2) попробуйте заменить "complex<double>*" на "double*, double*", а в фортране использовать DCMPLX(,).

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 03:31 31-07-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за мысли, у меня ::LoadLibrary происходил как раз ДО начала цикла, а в самом  цикле уже вызов ф-ции крутится. Когда все заканчивается происходит FreeLibrary(HIns).
Пока попробую п. 2) но терзают меня сомнения, что это из-за него...
Глючит оно всегда.. Начиная с самого включения, т.е. до того кога я мог ее загрузить и не выгрузить.

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 05:22 31-07-2009 | Исправлено: pir0texnik2, 05:27 31-07-2009
Igorr

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

Цитата:
Глючит оно всегда.. Начиная с самого включения, т.е. до того кога я мог ее загрузить и не выгрузить.
Не понял смысла
Если глючело всегда, тогда надо начинать с проверки соответствия типов аргументов и следить за неприсвоением величин в фортране параметрам типа "const". Если с этим все в порядке, тогда детальная проверка кода в C++ и фортране на предмет порчи памяти.  
 
Добавлено:
Кстати про "const": в фортране ему соответствует "INTENT(IN)". Не могу сказать насколько критично это соответствие, т.к. при смешенном программировании всегда использую простые переменные.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 07:13 31-07-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
а я бы вообще отказался от динамической загрузки
делаешь Ф-ДЛЛ и линкуешь с .lib, никаких указателей -- чистый вызов...
а complex <double>* всегда можно struct {double re, im;} обойти
 
а вот __stdcall -- это уже серьёзно
во-первых, тогда неплохо это и в Ф-интерфейсе прописать:
 
!DEC$ ATTRIBUTES STDCALL, DLLEXPORT :: ye_circ
 
а во-вторых (!) при стдкалл в Сях передача параметров _по значению_, так что вызов  
ye_circ (&precis,&a,&Li,...) -- полная херня, если не оговорено особо:
 
!DEC$ ATTRIBUTES STDCALL, DLLEXPORT :: ye_circ
!DEC$ ATTRIBUTES REFERENCE :: precis,a,Li

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 13:51 31-07-2009
pir0texnik2



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

Цитата:
Не понял смысла  
Если глючело всегда, тогда надо начинать с проверки соответствия типов аргументов и следить за неприсвоением величин в фортране параметрам типа "const". Если с этим все в порядке, тогда детальная проверка кода в C++ и фортране на предмет порчи памяти.  

глючит всегда в смысле, когда винда только загружена и при первом же запуске уже неправильно работает, т.е. до того как я мог загрузить что-либо.
Все константные аргументы идут как  real*8 , intent(in) :: a_,Li_,Di....
 
Про утечку памяти.. Не знаю как она может портиться, максимум, что используется - это статические массивы,  никаких эллокейтов...
akaGM
да. можно и статически,но димамически удобнее пользоваться... не надо С++ проект все время перекомпилировать...
Комплексное число можно просто заменить на два дабла и все, попробую.
По по поду __stdcall ... переписал прототип
typedef void (__stdcall *sub_fortran_1)(double,const double .....,complex<double>);
ублал в вызове & - получил аксес виолейшн. тот способ, что до этого был вполне себе все привильно передавал, по дебагеру в фортране было видно...  
 
!DEC$ ATTRIBUTES STDCALL, DLLEXPORT :: ye_circ
 
так же дает ошибку хоть суказателями, хоть без.

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 22:03 31-07-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
да надо было все передаваемые параметры не полениться и с атрибутом reference написать
 
complex<double>
а это просто не верно, если в фотране не написано:
 
complex*16 compl
DEC$ ATTRIBUTES REFERENCE :: compl
 
да и implicit не забыл?

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 22:09 31-07-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так я писал  
!DEC$ ATTRIBUTES REFERENCE :: список всех аргументов....
 
 толку...
 
 
 
Добавлено:
а что implicit ?

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 22:13 31-07-2009
Igorr

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

Цитата:
глючит всегда в смысле, когда винда только загружена и при первом же запуске уже неправильно работает, т.е. до того как я мог загрузить что-либо.  
Все константные аргументы идут как  real*8 , intent(in) :: a_,Li_,Di....

И все-таки, я так и не понял: "при первом же запуске" чего?, "неправильно работает" что?
Если вы уберете все модификаторы "const" (и в фортране INTENT(IN)), оставите только указатели на простые аргументы-переменные ("int*" и "double*"), и типы и количество параметров в C++ и в фортране совпадают, то ваш код должен работать 100% (личный опыт). Если не работает, то дело не в передаче параметров.  
 
Добавлено:
Следующий код в MSVC & Compaq/Intel Fortran работает без проблем.

Код:
Фортран:
SUBROUTINE Sub1(ip, dp)
  !DEC$ ATTRIBUTES DLLEXPORT :: Sub1
  INTEGER ip
  DOUBLE PRECISION dp
...
END SUBROUTINE Sub1
-----------
C++:
typedef void (__stdcall* CPP_Sub1)(int* pip, double* pdp);
CPP_Sub1 VF_Sub1;
... func()
{
  HINSTANCE hDll = ::LoadLibrary(_T("Sub1.dll"));
  VF_Sub1 = (CPP_Sub1)::GetProcAddress(hDll, "SUB1");
  int ip; double dp;
  VF_Sub1(&ip, &dp);
  ::FreeLibrary(hDll);
...
}


Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 23:22 31-07-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Первый запуск я имею в виду, вот включил компутер, запустил программу, а она уже с первого раза и неправильно работает, хотя никто эту длл еще пользоваться не должен был.
 
Пока на данный момент нашел проблему в precis_out, она была описана как INTENT(OUT) и в нее С++ должен был передавать желаемую точность, а фортран записывать достигнутую. Это и работало через раз, когда в ней оказывался NAN длл становилась на дыбы. И не помог даже INTENT(INOUT)... Тот же результат. Переменная precis, что передавалась, была не const ! Помогло только разделение, сделал отдельно чисто входную пременную и другую выходную, пока работает. Так же в С++ поубирал везде const, но не уверен, что это необходимо, но работает, поэтому как в том анеке про восход солнце решил ничего не трогать, не менять.

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 04:55 01-08-2009
Igorr

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

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 07:59 01-08-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да нет... дело имно не в соответствии...
до этого все параметры соответствовали друг другу, проверял несколько раз... типы, кол-во, порядок - все совпадало.
В общем результат таков:
нерабочий код:

Код:
subroutine ye_circ (precis_out,a_,Li_,....,Ye_circ_out)
!DEC$ ATTRIBUTES DLLEXPORT :: YE_CIRC
 
include 'link_fnl_shared.h'
 
        complex*16, intent(out) :: Ye_circ_out
        real*8, intent(inout) :: precis_out
        
        Integer, intent(in) :: p_,....
        real*8 , intent(in) :: a_,....
 

рабочий

Код:
 
subroutine ye_circ (a_,Li_,.....,precis_in,precis_out,ReYe_circ_out,ImYe_circ_out)
!DEC$ ATTRIBUTES DLLEXPORT :: YE_CIRC
 
include 'link_fnl_shared.h'
 
        real*8, intent(out) :: ReYe_circ_out,ImYe_circ_out
        real*8, intent(out) :: precis_out        
        
        Integer, intent(in) :: p_,q_........
        real*8 , intent(in) :: a_,Li_,......,precis_in
 

 
плюс удалил все const из вызова в С++.

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 22:55 01-08-2009 | Исправлено: pir0texnik2, 22:58 01-08-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
не вижу большой разницы кроме как разнесения комплекса...
и всё равно советую пользоваться reference/value

Цитата:
плюс удалил все const из вызова в С++

и правильно сделал...
 

Цитата:
а что implicit ?

implicit none
что ж ещё...
 

Цитата:
include 'link_fnl_shared.h'

а это что за хрень, что-то своё что ли7
 
кстати
Integer*4
тоже не помешает, может у тебя 8-байтная целочисленная где-то в проекте проскальзывает...
и ещё кстати, с Сями принято длл-функции с атрибутом __declspec(dllimport) использовать

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 11:23 05-08-2009 | Исправлено: akaGM, 12:07 05-08-2009
Eugeen



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CUDA: теперь и на ФОРТРАНе :
http://www.pgroup.com/lit/articles/insider/v1n1a1.htm
http://www.pgroup.com/lit/articles/insider/v1n2a1.htm

Всего записей: 231 | Зарегистр. 24-07-2005 | Отправлено: 08:14 08-08-2009
pir0texnik2



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

Цитата:
The Portland Group and NVIDIA will release the Fortran language specification for CUDA GPUs at the International Conference on Supercomputing in Hamburg, Germany this week. The CUDA Fortran compiler will be added to a production release of the PGI Fortran compilers scheduled for availability in November 2009.

 
короче, ждем как минимум до ноября...
 
Добавлено:
akaGM
include 'link_fnl_shared.h' - это надо для вызова IMSL процедур.

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 21:03 08-08-2009
Открыть новую тему     Написать ответ в эту тему

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