Шаги в Upgrade MEX Files to Use 64-Bit API применяются к исходным файлам Фортран и C/C + +. Фортран использует похожие сигнатуры API, идентичные mwSize
/ mwIndex
типы и подобные компиляторы и отладчики.
Однако, чтобы сделать исходный код Фортран 64-разрядным, выполните эти дополнительные задачи.
Чтобы сделать ваш файл MEX на языке Фортран совместимым с 64-битным API, используйте fintrf.h
заголовочный файл в исходных файлах ФОРТРАН. Назовите свои исходные файлы заглавной точкой .F
расширение файла. Дополнительные сведения об этих требованиях см. в разделе Компоненты файла MEX на языке Фортран.
Указатели представляют собой 32-разрядные или 64-разрядные адреса на основе типа машины. Это требование не связано непосредственно с измерениями массива, но вы можете столкнуться с проблемами при перемещении 32-битного кода на 64-битные машины в рамках этого преобразования.
Для получения дополнительной информации см. Preprocessor Macros и mwPointer
.
Компилятор C/C + + автоматически обрабатывает размер указателя. На языке Фортран, MATLAB® использует mwPointer
тип, чтобы обработать это различие. Для примера, mxCreateDoubleMatrix
возвращает mwPointer
:
mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag) mwSize m, n integer*4 ComplexFlag
В ФОРТРАН используются неявные определения типов. Необъявленные переменные, начинающиеся с букв I
через N
неявно объявленные типы INTEGER
. Имена переменных, начинающиеся с других букв, неявно объявлены как тип REAL*4
. Использование неявного INTEGER
type может работать для 32-битных индексов, но не безопасен для больших измерений массива Файлов MEX. Чтобы заставить вас объявить все переменные, добавьте IMPLICIT NONE
заявление на ваши стандартные подпрограммы ФОРТРАН. Для примера:
subroutine mexFunction(nlhs, plhs, nrhs, prhs) implicit none
Этот оператор помогает идентифицировать 32-битные целые числа в коде, которые не имеют явных объявлений типов. Затем можно объявить их как INTEGER*4
или mwSize
/ mwIndex
По обстоятельствам. Для получения дополнительной информации о IMPLICIT NONE
см. документацию компилятора Фортран.
Если вы используете число в качестве аргумента функции, компилятор Фортран может назначить аргументу неправильный тип. На 64-разрядной платформе неправильный тип может привести к Out of Memory
ошибки, нарушения сегментации или неправильные результаты. Для примера, определения типов аргументов для mxCreateDoubleMatrix
функции:
mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag) mwSize m, n integer*4 ComplexFlag
Предположим, что у вас есть файл MEX на C/C + + со следующим оператором:
myArray = mxCreateDoubleMatrix(2, 3, mxREAL);
Большинство компиляторов C/C + + интерпретируют число 2
как 64-разрядное значение. Некоторые компиляторы ФОРТРАН не могут обнаружить это требование и предоставить 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)
Некоторые компиляторы ФОРТРАН не могут обнаружить столько несоответствий типов, сколько аналогичные компиляторы C/C + +. Эта невозможность может усложнить шаг Устранение отказов и предупреждений сборки -largeArrayDims, оставив больше проблем для поиска с отладчиком на шаге Выполнение 64-Bit файла MEX и Сравнение результатов с 32-Bit версией.