在 Fortran 77 中创建表
首先我要说的是,我完全没有资格在 Fortran 77 中工作,但可惜的是,我在这里,正在学习我能学到的东西。
我正在开展一个项目,涉及对不同条件下的火焰特性进行建模。 这里我有一个片段,它输出表中的第一行,为相应列下方的行提供标签。 (KSYM 是一个字符串数组,标记存在的不同化学化合物)
WRITE(LOUT,1) "Standoff(cm)", "Density(g/cm3)",
+ "HeatReleaseRate(erg/cm3/s)","Temperature(K)",
+ KSYM(1),KSYM(2),KSYM(3),KSYM(4),KSYM(5),KSYM(6),KSYM(7),
+ KSYM(8),KSYM(9),KSYM(10),KSYM(11),KSYM(12),KSYM(13),KSYM(14),
+ KSYM(15),KSYM(16),KSYM(17),KSYM(18),KSYM(19),KSYM(20),
+ KSYM(21),KSYM(22),KSYM(23),KSYM(24),KSYM(25),KSYM(26),
+ KSYM(27),KSYM(28),KSYM(29),KSYM(30),KSYM(31),KSYM(32),
+ KSYM(33)
然后在每个对峙间隔的循环中
WRITE(LOUT,6) X(J),F(J),HR(J),(SN(N,J), N=1,NATJ-1)
格式如下:
1 FORMAT(A16,3X,A16,3X,A30,3X,A16,3X,80(A16,3X))
2 FORMAT(I10)
3 FORMAT(3(I10,3X))
4 FORMAT(3(E17.7,3X))
5 FORMAT(80(E17.7,3X))
6 FORMAT(F17.7,3X,F17.7,3X,F20.7,3X,80(E15.5,3X))
我的问题是数据出现在第一行及其相应列中的标签之外在前几列之后不要保持对齐,这使得阅读和操作变得困难。
我能想到的两种可能的解决方案: 1. 要么使用“T”格式描述符来创建绝对列 2. 忽略立即可读性的问题,在每个条目后插入逗号或分号,然后在 excel 中将其作为 .CSV 文件打开。
由于我最终要绘制数据图表,所以我不妨选择选项 2。 我尝试在第一个代码片段的每个条目之间添加“,”,但我不断收到语法错误,所以我假设我做错了什么。
编辑:
为了测试想法 2,我在每个条目之间添加了“,”。
WRITE(LOUT,*) 'Name',KSYM(1),';',KSYM(2),';',KSYM(3),';',
+ KSYM(4),';',KSYM(5),';',KSYM(6),';',KSYM(7),';',KSYM(8),';',
+ KSYM(9),';',KSYM(10),';',KSYM(11),';',KSYM(12),';',
+ KSYM(13),';',KSYM(14),';',KSYM(15),';',KSYM(16),';',
+ KSYM(17),';',KSYM(18),';',KSYM(19),';',KSYM(20),';',
+ KSYM(21),';',KSYM(22),';',KSYM(23),';',KSYM(24),';',
+ KSYM(25),';',KSYM(26),';',KSYM(27),';',KSYM(28),';',
+ KSYM(29),';',KSYM(30),';',KSYM(31),';',KSYM(32),';',
+ KSYM(33)
但与以前相同的语法错误。我正在使用一个特殊的编译器 pgf77 如果这有什么区别的话。
Let me preface my question by saying that I am completely unqualified to be working in Fortran 77, but alas, here I am and I'm learning what I can.
I'm working on a project involving modeling flame properties under different conditions.
Here I have a snippet that is outputting the first row in a table, giving labels for the rows underneath their appropriate columns. (KSYM is a array of strings that label the different chemical compounds present)
WRITE(LOUT,1) "Standoff(cm)", "Density(g/cm3)",
+ "HeatReleaseRate(erg/cm3/s)","Temperature(K)",
+ KSYM(1),KSYM(2),KSYM(3),KSYM(4),KSYM(5),KSYM(6),KSYM(7),
+ KSYM(8),KSYM(9),KSYM(10),KSYM(11),KSYM(12),KSYM(13),KSYM(14),
+ KSYM(15),KSYM(16),KSYM(17),KSYM(18),KSYM(19),KSYM(20),
+ KSYM(21),KSYM(22),KSYM(23),KSYM(24),KSYM(25),KSYM(26),
+ KSYM(27),KSYM(28),KSYM(29),KSYM(30),KSYM(31),KSYM(32),
+ KSYM(33)
then later in a loop for each standoff interval
WRITE(LOUT,6) X(J),F(J),HR(J),(SN(N,J), N=1,NATJ-1)
And here's the formats:
1 FORMAT(A16,3X,A16,3X,A30,3X,A16,3X,80(A16,3X))
2 FORMAT(I10)
3 FORMAT(3(I10,3X))
4 FORMAT(3(E17.7,3X))
5 FORMAT(80(E17.7,3X))
6 FORMAT(F17.7,3X,F17.7,3X,F20.7,3X,80(E15.5,3X))
My problem is that the data comes out in away that the labels in the first row and their appropriate columns don't stay aligned after the first few columns, making it difficult to read and manipulate.
The two possible solutions I can think of:
1. would be to either use the "T" format descriptor to make absolute columns
2. ignore the issue of immediate readability, insert commas or semicommas after every entry to then open in excel as a .CSV file
Since I'm going to end up graphing the data eventually, I might as well do option 2.
I've tried just adding "," in between each entry in the first code snippet, but I kept getting syntax errors, so I'm assuming I'm doing something wrong.
EDIT:
To test idea 2, I've added ",", inbetween each entry.
WRITE(LOUT,*) 'Name',KSYM(1),';',KSYM(2),';',KSYM(3),';',
+ KSYM(4),';',KSYM(5),';',KSYM(6),';',KSYM(7),';',KSYM(8),';',
+ KSYM(9),';',KSYM(10),';',KSYM(11),';',KSYM(12),';',
+ KSYM(13),';',KSYM(14),';',KSYM(15),';',KSYM(16),';',
+ KSYM(17),';',KSYM(18),';',KSYM(19),';',KSYM(20),';',
+ KSYM(21),';',KSYM(22),';',KSYM(23),';',KSYM(24),';',
+ KSYM(25),';',KSYM(26),';',KSYM(27),';',KSYM(28),';',
+ KSYM(29),';',KSYM(30),';',KSYM(31),';',KSYM(32),';',
+ KSYM(33)
But same syntax errors as before. I am using a peculiar compiler pgf77 if that makes any difference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
基本问题是格式 1 和 6 中的字段宽度不同。在格式 1 中,间距为 3X,字符串(标签)长度为 16。除了 A30 之外。在用于值的格式 6 中,空格为 3,并且数字项的字段具有不同的长度,例如 17、20 或 15。如果将每个数字格式项设置为 16 长(第三项除外),则应该排队。
通过用隐含的 do 循环替换数组的 33 个单独索引的值,第一次写入会更容易阅读:(ksym (i), i=1,33)。不妨使用数组功能,而不是把所有这些东西写出来!
The basic problem is that your field widths in formats 1 and 6 are different. In format 1 you have spacings of 3X and strings (labels) of length 16. Except one is A30. In format 6, used for the values, you have spaces of 3, and fields for the numeric item with different lengths such as 17, 20 or 15. If you make every numeric format item 16 long, except for the 3rd item, then things should line up.
The first write would be much easier to read by replacing 33 separately indexed values of the array with an implied do-loop: (ksym (i), i=1,33). Might as well use array features instead of writing all of that stuff out!
格式语句在很大程度上与可变宽度输出(例如 CSV)不兼容。相反,只需使用列表定向输出:(
未经测试)
Format statements are largely incompatible with variable width output such as CSV. Instead, just use list-directed output:
(untested)