1

我在 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平台上调试。

4

0 回答 0