我在 C++ 和 FORTRAN 之间做一些混合编程。如代码所示,将字符数组从 FORTRAN 传递到 C++ 时出现问题。
CDll.h:
// CDll.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#define DLLEXPORT __declspec(dllexport)
DLLEXPORT void testchararray(char arr[][10]);
#ifdef __cplusplus
}
#endif
CDll.cpp:
// CDll.cpp
#ifndef __cplusplus
#define __cplusplus
#endif
#include "CDll.h"
#include <iostream>
using namespace std;
void testchararray(char arr[][10])
{
cout << arr << endl;
}
FMain.f90:
!DIR$ OBJCOMMENT LIB: "CDll.lib"
MODULE FModule
IMPLICIT NONE
INTERFACE
SUBROUTINE testchararray(arr)
!DIR$ ATTRIBUTES C, ALIAS: "testchararray" :: testchararray
CHARACTER(10), DIMENSION(:), INTENT(IN) :: arr
!DIR$ ATTRIBUTES REFERENCE :: arr ! <-- If the way is right, is the directive nessary to add ?
END SUBROUTINE testchararray
END INTERFACE
END MODULE FModule
PROGRAM Main
USE FModule
IMPLICIT NONE
character(10), dimension(2) :: arr = ["1234567890", "0987654321"]
write(*,"(Z)") loc(arr)
call testchararray(arr)
END PROGRAM Main
CDll.h 和CDll.cpp 生成DLL 并由FORTRAN 主程序链接。
调用子程序前后的内存地址不一致,因此没有正确传递字符数组。我做错了还是有什么我还没有注意到?谢谢你的帮助。
PS:项目在x64平台上调试。