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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум 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