Шаги в файлах 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-битной Версией.