Fortran Coder

新手学习fortran,调试时read会莫名触发断点。

查看数: 6469 | 评论数: 10 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-7-17 13:53

正文摘要:

各位前辈大佬、同学们好!我接触学习fortran、折腾代码好几天了就是解决不了问题,无奈向大家求助!如果发帖格式或者内容有什么不对,请管理员和大家指正! 1. 我目前在笔记本上测试代码,用的是Intel Parallel Stu ...

回复

fcode 发表于 2022-7-19 09:57:31
lz_beginner 发表于 2022-7-18 20:29
谢谢您的建议!我的问题找到了,是我这边读取外部文件的路径没有设置好,另外还需要配合read(标号,*)的形 ...

不需要放入 resource 里面。
(试想一下,微软的工程师在VS里写了word,他们可能把全世界用户的*.doc文件都添加在resource里吗?)

工程里的文件(不管是源代码,还是不该加入的.dat文件),都只是记录一个地址(或叫路径,有点像windows的快捷方式),当文件的物理地址改变后,工程中的地址并不会自动跟随改变。
lz_beginner 发表于 2022-7-18 20:52:42
zjk0112 发表于 2022-7-18 20:08
I和J乱码是因为没有初始化。就是要给出初值,否则它的是随机的。比如,在Fortran中声明   integer:: i.此时 ...

抱歉,我20点左右刚看到您们的回复就去测试了(白天在学习专业知识,没有看论坛),当时只看到您的第一条回复,没看到您的这条回复。
我就说为啥一开始虽然也是触发断点,但是看“局部变量”那里,显示i=1,j=8...balabala。提前声明integer::i可以防止报错(可能别的同学会遇到)。
您说的这个提前也可以给i声明一下确实一针见血!其实我在做Matlab循环前,也会在for循环前加一句output=[];或者output=zeros(i, j)*nan;不然matlab经常会报错数据不匹配(等式右边算出来的矩阵不能赋给一个毫无定义的或者维度不对的output)
lz_beginner 发表于 2022-7-18 20:35:34
zjk0112 发表于 2022-7-18 19:41
你那个read(100) 这里就有问题,应该是read(100,*) 100 表示通道号,*表示默认格式。默认read是按行顺序读 ...

谢谢您的建议!我的问题找到了,是我这边读取外部文件的路径没有设置好,另外还需要配合read(标号,*)的形式。
我修改代码试了好几次,发现如您所说,read(标号,*)是保障成功运行的关键!当我按照另一位高手所说的修改了路径之后,发现只用read(100)是不行的。此外,我测试了open行,我这边结果是无论open行里有没有form、有没有status都不影响结果。
总之,我非常感谢您的经验和指点意见,祝您生活愉快!
lz_beginner 发表于 2022-7-18 20:29:23
布衣龙共 发表于 2022-7-18 08:17
1. 发帖不需要什么特别的格式,说清楚就行。
2. 遇到断点,优先查看命令行窗口(通常是黑色窗口)的错误提 ...

谢谢您的建议!我的问题找到了,是我这边读取外部文件的路径没有设置好,另外还需要配合read(标号,*)的形式。
您给的建议,检查数据文件的路径,非常关键!当我把读取文件的代码行从open(标号,file='test.dat')改成了open(标号,file='D:\...\test.dat')这种格式后,就成功运行了!我之前以为把数据文件放到resource里面就可以略去之前的文件夹名,是我的锅。
另外,我注意到VS里面关于resource里的数据文件的显示是似乎滞后的。我把数据文件移动到新的文件夹后,再去点解决方案资源管理器的那个数据文件,显示的地址还是移动前的地址!有点无语。
总之,我非常您的经验和指点意见,祝您生活愉快!
lz_beginner 发表于 2022-7-18 20:21:18
风平老涡 发表于 2022-7-17 23:30
我觉得可能是变量定义的问题。Fortran程序中所有的变量必须在程序开始被定义。I 和 J 都没有定义(包括im, ...

谢谢您的建议!我的问题找到了,是我这边读取外部文件的路径没有设置好,另外还需要配合read(标号,*)的形式。不过您提到的i和j没有提前声明,我很重视,也测试了一下。因为我注意到前辈给我的代码里就有读取mask之后做小循环把mask里里面数值是1的那些格点按照公式计算成新的系数,但是循环里的i和j就没有在代码开头声明。结果证明:不提前声明i和j也是可以运行的(用于循环的小范围的即时的不需要?)。但其实我也不明白这是为什么,希望日后能学习到,或者如果有知道的大佬还请不吝赐教!总之,我还是非常感谢您的经验和指点意见,祝您生活愉快!
zjk0112 发表于 2022-7-18 20:08:26
I和J乱码是因为没有初始化。就是要给出初值,否则它的是随机的。比如,在Fortran中声明   integer:: i.此时和MATlab的区别是i并不是0,你需要给 i 赋值  ,像这样i=0.
zjk0112 发表于 2022-7-18 20:01:40
zjk0112 发表于 2022-7-18 19:41
你那个read(100) 这里就有问题,应该是read(100,*) 100 表示通道号,*表示默认格式。你试试open后面不用for ...

那个read(*,*)也是不对的用法。另外,楼主很不错,即主动有勤快,会主动注释排查错误,比很多往网上一挂等答案的强多了。至于不清楚问题的根源,还能把这么多信息和心路历程发出来,并且把错误排查在read的用法上,这里就很值得点赞。
zjk0112 发表于 2022-7-18 19:41:01
本帖最后由 zjk0112 于 2022-7-18 20:15 编辑

你那个read(100) 这里就有问题,应该是read(100,*) 100 表示通道号,*表示默认格式。默认read是按行顺序读取,read(100,*) m,n,nnz 表读取文件第一行的前三个值,这三个值分别按顺序存放在m,n,nnz中。如果你有100行就加一个do i=100的循环。        你试试open后面不用form那个参数。我一般就open(100,file='test.dat') 或者open(100,file='test.dat',status='old')

image-20220718193716736.png (40.24 KB, 下载次数: 183)

image-20220718193716736.png
布衣龙共 发表于 2022-7-18 08:17:47
1. 发帖不需要什么特别的格式,说清楚就行。
2. 遇到断点,优先查看命令行窗口(通常是黑色窗口)的错误提示。
3. 请给出你 test.dat 文件的内容。(1,2,3,4的排布)
4. 和 .f90 或 .for 扩展名无关。它只影响是自由格式还是固定格式。(甚至都不影响是F77还是F90)
5. 你不需要把 .dat 文件放在 Resource Files 里面。(当然放了也没关系)

综合来说,我觉得是你的 .dat 文件内容不对。或者是路径不对。

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-9 06:34

Powered by Tencent X3.4

© 2013-2024 Tencent

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