回 帖 发 新 帖 刷新版面

主题:[原创]求助 fortran77的动态数组定义问题

[size=3]如题,怎样才以实现在fortran77下进行动态数组的定义,我试过好多办法好像都实现不了。
我的程序里面会涉及许多矩阵,并且是多维矩阵,主程序在一个封闭的obj文件里面,我没有办法更改,所以只有依靠解决这个问题来解决我的问题了。
另外,如果有谁可以告诉我怎么能在CVF下使用在dos下编译出来的obj文件,我的问题也可以解决。
还望高手能指点一二。
 [/size]

回复列表 (共17个回复)

11 楼

猜想楼主遇到的问题是这样的:
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 楼

不用HIMEM的话,640K-1M之间也没法用啊
这个都是98之前的事了

关键是怎么把16位obj变成32位的呢
98之前是16/32位混合时可以兼容16位DLL

这种变法也没听说过,如果可以轻松变的话,单片机obj到PC那不是很Easy

我想只能通过dump代码段来解决,但也无法解决扩充问题,obj可以直接反汇编么?

13 楼

把16位obj变成32位exe的办法是这样的:
先用UE打开这个16位obj,找到程序的入口,再把里面入口到未尾的代码全部COPY,待用;
然后在32位fortran编译器下建立一个空壳的调用函数,并将这个空壳函数编译成exe文件;
然后把obj里面的代码加到这个exe文件的未尾,修改exe的入口地址;
这样16位obj就变成32位exe文件了。

并且我还可以肯定地告诉你们,这个OBJ文件还真的能用。

现在我的想法是能不能用32位控制台软件的DOS界面操作指令把纯DOS的界面操作指令给代替了?

14 楼

这个应该不太可能。

一般来说,16位纯DOS的界面,用的是int中断实现。
32位console程序,用的是API吧。

那么多中断和函数,你一一替换,有难度吧

15 楼

那还不是我说的dump的方法

接触到中断就完蛋

16 楼

想那么多奇淫异巧还不如重写了。。。
给你讲了那么多,就是想让你知道,实时模式下的内存访问跟保护模式下根本不一样,你再牛X也扩充不了~~~~
当然,您要是有兴趣改机器代码,把访问内存的地方全都改成32位保护模式访问方式那倒也可以。但费那么大的劲值得么?兴许还是重写一个来的快吧。。。

17 楼

对于这个OBJ来讲,现在所做的这些所谓的“奇思异想”根本不值一提。因为这个软件值得我们去费这么大的神。
呵呵,那就只能慢慢研究了。

我来回复

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