找回密码
 注册
Simdroid-非首页
查看: 111|回复: 8

[3. Fortran] fortran c++混合编译 调用参数错误

[复制链接]
发表于 2010-12-14 15:04:24 | 显示全部楼层 |阅读模式 来自 武汉大学
该例是关于vc用ADO连接access数据库,然后一次返回四个值给fortran程序
我改了好久都不能编译通过,很可能是调用参数的错误 但是我不知道怎么改正
应该是k的问题,我用k来定位记录在数据库的位置,应该是值引用啊  
fotran程序如下:
PROGRAM MAIN
IMPLICIT NONE
INTEGER:: E,F,G,H
INTEGER:: J
INTERFACE
   SUBROUTINE datainput1(a,b,c,d,k)
   !DEC$ATTRIBUTES STDCALL,ALIAS:'_datainput1@16'::datainput1
   INTEGER(4)::k[value]
   INTEGER(4)::a[reference]
   INTEGER(4)::b[reference]
   INTEGER(4)::c[reference]
   INTEGER(4)::d[reference]
   END SUBROUTINE
END INTERFACE
J=1
CALL datainput1(E,F,G,H,J)
WRITE(*,*)E,F,G,H
END PROGRAM
VC++程序如下:
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <icrsint.h>
class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
   ADO_NUMERIC_ENTRY(1,adInteger,a[0],1,0,m_ul_fnameStatus1,true)
   ADO_NUMERIC_ENTRY(2,adInteger,a[1],1,0,m_ul_fnameStatus2,true)
   ADO_NUMERIC_ENTRY(3,adInteger,a[2],1,0,m_ul_fnameStatus3,true)
   ADO_NUMERIC_ENTRY(4,adInteger,a[3],1,0,m_ul_fnameStatus4,true)
END_ADO_BINDING()
   
public:
   int     a[4];
   ULONG   m_ul_fnameStatus1;
   ULONG   m_ul_fnameStatus2;
   ULONG   m_ul_fnameStatus3;
   ULONG   m_ul_fnameStatus4;
  };
inline void TESTHR(HRESULT _hr)
{ if FAILED(_hr) _com_issue_error(_hr); }
extern"C"void _stdcall datainput1(int& a,int& b,int& c,int& d,int k)
{
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

::CoInitialize(NULL);
   try
   {
      _RecordsetPtr pRs("ADODB.Recordset");
      CCustomRs rs;
      IADORecordBindingPtr picRs(pRs);
      pRs->Open("SELECT * FROM 单元结点",
      "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=二维有压渗流数据.mdb",
      adOpenStatic, adLockOptimistic, adCmdText);
      TESTHR(picRs->BindToRecordset(&rs));
   pRs->AbsolutePosition=PositionEnum(k);
   a=rs.a[0];
   b=rs.a[1];
   c=rs.a[2];
   d=rs.a[3];
      
  }
   catch (_com_error &e)
   {
      printf("Error:\n");
      printf("Code = %08lx\n", e.Error());
      printf("Meaning = %s\n", e.ErrorMessage());
      printf("Source = %s\n", (LPCSTR) e.Source());
      printf("Description = %s\n", (LPCSTR) e.Description());
   }
    ::CoUninitialize();
}
附件为数据库文件 解压即可

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2010-12-14 22:18:15 | 显示全部楼层 来自 北京海淀
Simdroid开发平台
FORTRAN中的子程序名默认为大写,你修改过了吗
否则,函数名对不上,应该有一个unresolved的错误
回复 不支持

使用道具 举报

发表于 2010-12-15 04:40:57 | 显示全部楼层 来自 德国
fortran 的函数编译的时候大小写可能会发生变化, 要看 compiler的选项了, 而 c++的话 编译是不会改大小写的. 所以是不是两边编译出来的object文件里面, 函数的定义和调用名字不一致.
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 10:17:58 | 显示全部楼层 来自 武汉大学
2# penultimate
应该不是这个问题,我都加了stdcall的约定,约定为小写,朋友可以去掉k参数编译运行看下是可以运行的
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 10:21:35 | 显示全部楼层 来自 武汉大学
3# temgy1986
我弄了两天了,不是这个的问题,我想是参数传递的问题,我的参数里有些是地址传递,有些是值传递 我想是不是这里有问题
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 15:36:08 | 显示全部楼层 来自 武汉大学
各位大侠,帮小弟一把 我快崩溃了
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 16:20:53 | 显示全部楼层 来自 武汉大学
我发现问题了 就是参数的个数总和只能是4个 不能是其他的要不然就有错误 去掉一个a或b都能运行
真是让人费解 混合编译难道有bug
回复 不支持

使用道具 举报

发表于 2010-12-15 16:35:49 | 显示全部楼层 来自 北京海淀
在interface里改成 : _datainput1@20'
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 16:41:19 | 显示全部楼层 来自 武汉大学
我自己来自问自答吧,其实只要把fortran的stdcal和C的_STDCALL约定改为C和_cdecl(默认)就可以了
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 21:02 , Processed in 0.060303 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表