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