求教:fortran怎么获得本*.for文件所在的绝对路径吗?(windows系统)

在网上查到可以用GetCurrentDirectory()函数来获得,所以写了以下一小段程序,但编译一直提示错误,错误内容为:Error:Theshapematching... 在网上查到可以用GetCurrentDirectory()函数来获得,所以写了以下一小段程序,但编译一直提示错误,错误内容为:Error: The shape matching rules of actual arguments and dummy arguments have been violated. [LPBUFFER]
result=GetCurrentDirectory(nBufferLength,lpBuffer)

程序:
program mian
USE DFWIN
Integer(4) result
Parameter(nBufferLength=1000)
CHARACTER lpBuffer(nBufferLength)
INTEGER N
result=GetCurrentDirectory(nBufferLength,lpBuffer)
end
展开
 我来答
天河流纹石
2013-03-31 · TA获得超过1.3万个赞
知道大有可为答主
回答量:7624
采纳率:76%
帮助的人:4046万
展开全部
楼主犯了很多错。

1.Fortran 是编译型的语言,是永远无法获得本 for 所在的路径的。实际上,一些大型程序,是由若干(几个,几十个,甚至成百上千个) for 源代码文件共同书写完成。他们可以在同一个文件夹,也可以在不同的文件夹。

2.源代码文件一旦编译成 exe,就永远无法获得原来的 exe 在哪儿了。它此时已经完全与 for 源代码文件没有关系了。就好像:我用拼音打了几个字,发送给你了。你永远无法知道我是用QQ拼音打的,还是谷歌拼音,还是百度拼音输入法。

3.你可以获得本 exe 所在的文件夹,或者当前活动路径(CurrentDirectory)。大多数时候,你用IDE编译的话,这三个是在同一个文件夹的。(但不绝对,正如我之前说的那样,多个for共同书写同一个代码,for可以在很多个文件夹下)
实际这几个的关系是这样的:
a.大多数人把工程文件和for文件放在同一个文件夹。
b.大多数编译器会自动把生成的exe放在工程文件夹(或debug文件夹或release文件夹)
c.通过windows资源管理器或编译器运行exe,则其CurrentDirectory默认为exe所在文件夹

于是,你就把 CurrentDirectory 当做了 for 所在的文件夹。实际上,上述的过程每个环节都可以变动。

4.当前活动路径与 exe 所在路径不同。比如你在桌面上随便找一个快捷方式,右键属性,你会看到,目标,起始位置,是不同的。目标决定一个exe所在的路径,而起始位置,windows会当做当前活动路径。
而如果通过windows资源管理器直接运行exe,则exe所在路径windows就会自动设置为本历程的当前活动路径。

5.程序可以通过多种方式改变当前活动路径,而同一个 exe,还可以有多个历程。每个历程都可以自由改变自己的活动路径。(就好像你安装了一个QQ,却可以登陆多个号码一样,每个号码的QQ是一个历程,每个里程的CurrentDirectory可以不同,而且还不固定,QQ可以随时改变它)

6. CHARACTER lpBuffer(nBufferLength) 是一个数组,每个字符串长度是1。如果你要定义一个 nBufferLength 的字符串。请这样定义:
Character( Len = nBufferLength ) lpBuffer

7.GetCurrentDirectory 用于获得当前活动路径。而 GetModuleFilename,可以获得当前 exe 所在的路径。

8.不管是 GetCurrentDirectory 还是 GetModuleFilename。它们都是 windows 的功能,而不是 Fortran。所以具体使用方法,要看你的编译器说明书。

9.回到最终,你无法获得 for 文件所在的路径。(甚至它根本不是唯一的)
追问
谢谢你,我的问题主要是第六条引起的!现在已经调通了,但是定义的字符串太长,输出时有好多的空格,但trim()函数去不掉,请问有什么办法可以让我从lpBuffer提取出只有路径的信息?
追答
首先,你的字符串不需要1000长度。
windows定义了一个叫MAX_PATH的常量,是512,也就是说,路径最多不会超过512

其次,GetCurrentDirectory 是 windows 的函数,windows自身是 C/C++书写的,至少在应用层是这样。因此,获得的字符串是 C 字符串,以 0 结尾。
他返回的 result 记录了字符串的长度。因此,我们需要让 result 以后的字符为空格,而不是 0。

以下代码既可实现:
result=GetCurrentDirectory(nBufferLength,lpBuffer)
lpBuffer(result+1:) = " "

最后,我还是希望你弄明白:for 所在路径,exe所在路径,当前活动路径。三者的区别和联系。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式