回 帖 发 新 帖 刷新版面

主题:在64位LINUX系统下用F77和C混编读写超100G的特大二进制文件问题

本人用F77和C混编读写超100G的特大二进制文件的程度,主程序和计算用F77,读写用C,本程序在UNIX下应用正常,移植到64位LINUX下出问题乐,请高手老师分别给出F77和C的编辑选项为盼!!!关键程序如下:
  PARAMETER (LTRMAX=36200)
  INTEGER*2 DATAK1(LTRMAX)
  INTEGER*4 DATAK2(LTRMAX)
  EQUIVALENCE (DATAK1(1),DATAK2(1))
  IUNIT1=BOPEN(IFILE1,0)
  C ___________ READ 3200 BYTES REEL HEAD _________________________
  CALL BREAD(IUNIT1,3200,DATAK2,IST)
  IF(IST.LE.0) THEN
  WRITE(*,*) 'READ 3200 BYTES REEL HEAD ERROR !'
  STOP
  END IF
C ___________ READ 400 BYTES FILE HEAD __________________________
  CALL BREAD(IUNIT1,400,DATAK2,IST)
  IF(IST.LE.0) THEN
  WRITE(*,*) 'READ 400 FILE HEAD ERROR !'
  STOP
  END IF
  NS1=DATAK1(11) 返回的这个值不对
  IFORMT=DATAK1(13) 返回的这个值也不对
  stop
  end
  SUBROUTINE BREAD(IUNIT,LEN,IBUF,ISTAT)
  INTEGER*4 IUNIT,IBUF(1),ISTAT,bbread
  integer*4 len
  istat=bbread(IUNIT,IBUF,len)
  RETURN
  END
 int bbread_(fd1_pf,cbuf,len_pf)
char cbuf[];
int *fd1_pf;
int *len_pf;
 {
  int len;
  int fd1,n;
  len= *len_pf;
  fd1= *fd1_pf;
/* printf("len=%d,fd1=%d\n",len,fd1);*/ 这些值显示是对的
  n=read(fd1,cbuf,len);
/* printf("n=%d\n",n);*/ n显示也是对的
  return(n);
 }
请大家看看问题在哪里,怎么改   

回复列表 (共14个回复)

11 楼

[quote]谢谢各位的指导!
    我的64位LINUX系统上确定没安装gfortran编译器,哪位朋友老师能提供的话不甚感激!
    我的32位LINUX系统下装有gfortran编译器,用ld -V查显示:
  GNU ld version 2.15.92.0.2 20040927
  Supported emulations:
   elf_x86_64
   elf_i386
   i386linux
 说明有64位库,但不知怎么用,请老师指教为盼!!!
    谢谢![/quote]
这个显然不能证明你有64位库

只能说ld在链接时可以尝试生成64位代码,一般在编译时加入-m64即可,但如果没有64位库会出现链接错误,并且如果编译器不支持-m64也会出现不支持的错误。即使生成了,你在32位系统也跑不了。

从你的ld版本来看,你的工具链版本太低,很多不支持也是很正常的。

各大发行版都提供较新版本的工具链,如果没有,请咨询系统提供商。

12 楼

ld在链接时可以尝试生成64位代码,一般在编译时加入-m64即可,但如果没有64位库会出现链接错误,并且如果编译器不支持-m64也会出现不支持的错误。即使生成了,你在32位系统会产生移动吧?

13 楼

非得这么蛮干? 干嘛用100g的文件

14 楼


谢谢大家指导!
    我的PC机和LINUX都是64位的,用gfortran和gcc分别编译上面的程序问题依旧!

我来回复

您尚未登录,请登录后再回复。点此登录或注册