Шаги в файлах MEX Обновления, чтобы Использовать 64-битный API применяются к исходным файлам Фортрана и C/C++. Фортран использует подобные подписи API, идентичный mwSize
/ mwIndex
типы, и подобные компиляторы и отладчики.
Однако, чтобы сделать ваш исходный код Фортрана 64-битным совместимый, выполните эти дополнительные задачи.
Чтобы сделать ваш файл MEX Фортрана совместимым с 64-битным API, используйте fintrf.h
заголовочный файл в ваших исходных файлах Фортрана. Назовите свои исходные файлы с прописным .F
расширение файла. Для получения дополнительной информации об этих требованиях, смотрите Компоненты файла MEX на языке Фортран.
Указатели являются 32-битными или 64-битными адресами, на основе типа машины. Это требование непосредственно не связывается к измерениям массива, но вы могли столкнуться с проблемами при перемещении 32-битного кода в 64-битные машины как часть этого преобразования.
Для получения дополнительной информации смотрите Макросы Препроцессора и mwPointer
.
Компилятор C/C++ автоматически обрабатывает размер указателя. На Фортране MATLAB® использует mwPointer
введите, чтобы обработать это различие. Например, mxCreateDoubleMatrix
возвращается mwPointer
:
mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag) mwSize m, n integer*4 ComplexFlag
Фортран использует неявные определения типа. Необъявленные переменные, начинающиеся с букв I
через N
неявно объявляются вводят INTEGER
. Имена переменных, начинающиеся с других букв, неявно объявляются, вводят REAL*4
. Используя неявный INTEGER
тип мог работать на 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-битное значение. Например, эквивалентный оператор Fortran:
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-битный файл MEX и Сравнивают Результаты с 32-битной Версией.