exponenta event banner

Обновление файлов Fortran MEX для использования 64-разрядного API

Шаги в разделе Обновление файлов MEX для использования 64-Bit API применяются к исходным файлам Fortran и C/C + +. Fortran использует аналогичные подписи API, идентичныеmwSize / mwIndex типы и аналогичные компиляторы и отладчики.

Однако чтобы сделать исходный код Fortran 64-разрядным, выполните эти дополнительные задачи.

Использовать файл заголовка Fortran API

Чтобы сделать файл Fortran MEX совместимым с 64-разрядным API, используйте fintrf.h в исходных файлах Fortran. Назовите исходные файлы прописными буквами .F расширение файла. Дополнительные сведения об этих требованиях см. в разделе Компоненты файла Fortran MEX.

Объявить указатели Fortran

Указатели представляют собой 32-разрядные или 64-разрядные адреса в зависимости от типа компьютера. Это требование не связано напрямую с размерами массива, но при перемещении 32-разрядного кода на 64-разрядные машины в рамках этого преобразования могут возникнуть проблемы.

Дополнительные сведения см. в разделах Макросы препроцессора и mwPointer.

Компилятор C/C + + автоматически обрабатывает размер указателя. В Fortran MATLAB ® использует mwPointer введите для обработки этого различия. Например, mxCreateDoubleMatrix возвращает mwPointer:

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag)
mwSize m, n
integer*4 ComplexFlag

Требовать объявления типа Fortran

Fortran использует неявные определения типов. Необъявленные переменные, начинающиеся с букв I через N неявно объявленные типы INTEGER. Имена переменных, начинающиеся с других букв, неявно объявлены типом REAL*4. Использование неявного INTEGER тип может работать для 32-разрядных индексов, но не безопасен для MEX-файлов больших массивов. Чтобы принудительно объявить все переменные, добавьте IMPLICIT NONE заявление для ваших подпрограмм Fortran. Например:

subroutine mexFunction(nlhs, plhs, nrhs, prhs)
implicit none

Этот оператор помогает определить 32-разрядные целые числа в коде, которые не имеют явных описаний типов. Затем их можно объявить как INTEGER*4 или mwSize / mwIndexПо обстоятельствам. Для получения дополнительной информации о IMPLICIT NONE, обратитесь к документации компилятора Fortran.

Использование переменных в вызовах функций

Если в качестве аргумента функции используется число, компилятор Fortran может присвоить аргументу неверный тип. На 64-разрядной платформе может производиться неверный тип Out of Memory ошибки, нарушения сегментации или неправильные результаты. Например, определения для типов аргументов для mxCreateDoubleMatrix функции:

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag)
mwSize m, n
integer*4 ComplexFlag

Предположим, что у вас есть файл C/C + + MEX со следующей инструкцией:

myArray = mxCreateDoubleMatrix(2, 3, mxREAL); 

Большинство компиляторов C/C + + интерпретируют число2 как 64-разрядное значение. Некоторые компиляторы Fortran не могут обнаружить это требование и предоставить 32-разрядное значение. Например, эквивалентная инструкция Фортрана:

myArray = mxCreateDoubleMatrix(2, 3, 0)

Компилятор интерпретирует значение ComplexFlag аргумент 0 правильно как тип INTEGER*4. Однако компилятор мог интерпретировать аргумент 2 как 32-разрядное значение, даже если аргумент m объявлен тип mwSize.

Независимым от компилятора решением этой проблемы является объявление и использование mwSize / mwIndex переменная вместо литерального значения. Например, следующие операторы однозначно называют mxCreateDoubleMatrix функция в Фортране:

mwSize nrows, ncols
INTEGER*4 flag
nrows = 2
ncols = 3
flag = 0
myArray = mxCreateDoubleMatrix(nrows, ncols, flag)

Управление предупреждениями компилятора Fortran

Некоторые компиляторы Fortran не могут обнаружить столько несоответствий типов, сколько аналогичные компиляторы C/C + +. Эта неспособность может усложнить Твердость шага,-largeArrayDims Строят Неудачи, и Предупреждения, оставляя больше проблем, чтобы найти с Вашим отладчиком на этапе Выполняют 64-битный Файл MEX и Сравнивают Результаты с 32-битной Версией.

См. также

| |

Связанные примеры

Подробнее

Внешние веб-сайты