主题:[原创]求助 fortran77的动态数组定义问题
gurilla
[专家分:0] 发布于 2011-10-31 21:06:00
[size=3]如题,怎样才以实现在fortran77下进行动态数组的定义,我试过好多办法好像都实现不了。
我的程序里面会涉及许多矩阵,并且是多维矩阵,主程序在一个封闭的obj文件里面,我没有办法更改,所以只有依靠解决这个问题来解决我的问题了。
另外,如果有谁可以告诉我怎么能在CVF下使用在dos下编译出来的obj文件,我的问题也可以解决。
还望高手能指点一二。
[/size]
最后更新于:2011-10-31 21:15:00
回复列表 (共17个回复)
11 楼
cgl_lgs [专家分:21040] 发布于 2011-11-03 08:02:00
猜想楼主遇到的问题是这样的:
1、有很多用F77 MSDOS版本编译器编译出来的OBJ——这部分是核心计算;
2、有源码的部分仅仅是数组的定义及核心程序的调用;
3、现在需要扩充这个程序的计算能力。
但是:
1、Fortran 77标准里就根本没有动态数组!并且刚开始有动态数组时甚至有些FORTRAN界的牛人还抵触过;
2、MSDOS如果不使用EMM386之类的模块,那就根本无法使用超过1M的内存空间。并且据我所知,在MSDOS下就没有直接支持EMM386接口的编译器(库),只能是自己编程。
3、以前我在DOS年代编程时,倒是有:“32位程序调用16位子系统”这样一个试验,但那是用汇编;
4、如果真的是计算核心在16位OBJ里,那你扩充了也没有用:)因为16位系统分编译规模的不同,允许的数组大小也不同:
1)小型规模允许所有程序代码+栈空间+所有变量不得大于64K;
2)中型规模允许栈空间+所有变量不得大于64K,程序代码可跨段;
3)大型规模允许栈空间不大于64K,单个变量不得大于64K,程序代码可以跨段;
4)巨型规模允许栈空间不大于64K,单个变量可大于64K但所有变量不大于640K,程序代码可以跨段;
而你需要用到动态数组的话,想必就是希望能突破这些限制吧?
但是这已经是铁律了,改不了~~~~~
故楼主还是用文件交换吧~~~~慢是慢些,但只能如此了:)
12 楼
dongyuanxun [专家分:7180] 发布于 2011-11-03 15:44:00
不用HIMEM的话,640K-1M之间也没法用啊
这个都是98之前的事了
关键是怎么把16位obj变成32位的呢
98之前是16/32位混合时可以兼容16位DLL
这种变法也没听说过,如果可以轻松变的话,单片机obj到PC那不是很Easy
我想只能通过dump代码段来解决,但也无法解决扩充问题,obj可以直接反汇编么?
13 楼
gurilla [专家分:0] 发布于 2011-11-04 05:33:00
把16位obj变成32位exe的办法是这样的:
先用UE打开这个16位obj,找到程序的入口,再把里面入口到未尾的代码全部COPY,待用;
然后在32位fortran编译器下建立一个空壳的调用函数,并将这个空壳函数编译成exe文件;
然后把obj里面的代码加到这个exe文件的未尾,修改exe的入口地址;
这样16位obj就变成32位exe文件了。
并且我还可以肯定地告诉你们,这个OBJ文件还真的能用。
现在我的想法是能不能用32位控制台软件的DOS界面操作指令把纯DOS的界面操作指令给代替了?
14 楼
臭石头雪球 [专家分:23030] 发布于 2011-11-04 08:33:00
这个应该不太可能。
一般来说,16位纯DOS的界面,用的是int中断实现。
32位console程序,用的是API吧。
那么多中断和函数,你一一替换,有难度吧
15 楼
dongyuanxun [专家分:7180] 发布于 2011-11-04 20:04:00
那还不是我说的dump的方法
接触到中断就完蛋
16 楼
cgl_lgs [专家分:21040] 发布于 2011-11-04 23:35:00
想那么多奇淫异巧还不如重写了。。。
给你讲了那么多,就是想让你知道,实时模式下的内存访问跟保护模式下根本不一样,你再牛X也扩充不了~~~~
当然,您要是有兴趣改机器代码,把访问内存的地方全都改成32位保护模式访问方式那倒也可以。但费那么大的劲值得么?兴许还是重写一个来的快吧。。。
17 楼
gurilla [专家分:0] 发布于 2011-11-05 07:02:00
对于这个OBJ来讲,现在所做的这些所谓的“奇思异想”根本不值一提。因为这个软件值得我们去费这么大的神。
呵呵,那就只能慢慢研究了。
我来回复