avinsk
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору [more] Здравствуйте! Столкнулся с проблемой - при работе в Intel Fortran 15.0.7 создаю COMMON блок с двумя динамическими массивами: COMMON /MYARRS/ DAR,IAR INTEGER, DIMENSION(:), POINTER :: IAR REAL, DIMENSION(:), POINTER :: DAR Успешно их размещаю функцией ALLOCATE и как-то работаю с ними. Потом хочу получить к ним прямой доступ из программы, написанной на Си. В ней пишу следующий код: struct fortran_arrays { float *pR; int *pI; }; extern "C" { struct fortran_arrays MYARRS; } Все прекрасно видится для первого массива (конечно, учитываю сдвиг начального индекса - 0 для Си, 1 - для фортрана), а второй массив - не виден! Точнее, указатель pI ссылается на какой-то левый адрес в самом начале пространства адресов. Путем изучения памяти выяснил, что в COMMON блоке после адреса динамически размещаемого массива идет 32 байта какой-то служебной информации, т.е. следующая модификация кода отлично работает для обоих массивов: struct fortran_arrays { float *pR; int iSpace1[8]; int *pI; int iSpace2[8]; }; Вопрос - описано ли такое добавление 32 битов, не изменится оно как-нибудь при переходе на другую версию компилятора / смену разрядности программы 32 -> 64? Возможно ли как-нибудь сделать прямой доступ к обоим массивам более стандартным образом или убрать это добавление? Можно, конечно, написать функцию, которая будет передавать нужные данные через аргумент, типа SUBROUTINE ARRAYS_ACCESS(N, DV, IV) COMMON /MYARRS/ DAR,IAR INTEGER, DIMENSION(:), POINTER :: IAR REAL, DIMENSION(:), POINTER :: DAR INTEGER N [VALUE] INTEGER IV [REFERENCE] REAL DV [REFERENCE] DV = DAR(N) IV = IAR(N) END но это не слишком удобно. | Всего записей: 3 | Зарегистр. 22-09-2016 | Отправлено: 11:53 22-09-2016 | Исправлено: avinsk, 11:54 22-09-2016 |
|