Reputation: 45
I'm learning Fortran and found some strange things when writing with a format (I'm using Fortran onlinegdb)
Program Hello
real, dimension(3,2):: array
array = 0
write(*, '(A,/, A,/, F5.2, F5.2)') &
"1","2",((array(i, j), i = 1,3), j = 1,2)
End Program Hello
I expected
1
2
0.00 0.00
0.00 0.00
0.00 0.00
I get
1
2
0.00 0.00
0.00 0.00
What's wrong?
Upvotes: 3
Views: 274
Reputation: 32431
Vladimir F is correct in saying that the format given does not suit the items that are provided for output: with format reversion after writing two real values, the control goes back to looking at the edit descriptor A
but what corresponds to that isn't another character variable. This is not allowed.
However, the format suggested in an earlier revision of that other answer also does not give the output that you expect. If you want to write pairs of numbers on each line relying on an unlimited repeat specification, you'll need to explicitly put the file positioning into the format:
write(*, '(2(A,/),*(2F5.2,:,/))') "1", "2", transpose(array)
Without the /
edit in there at the end, the repeat will mean that all elements of the array go in the same record. We also have :
there, so that we don't get an extra line break after the final array element.
(I've also transpose
d the output array, as that's probably what you really mean. The implied do loop in the original output is a little unexpected and makes more sense moving over the final index first.)
With a limited repeat specification, as shown in the corrected form of that answer, format reversion does imply positioning:
write(*, '(2(A,/), 2(F5.2))') "1","2", transpose(array)
After processing the 2(F5.2)
reversion has this reused while there are still elements to write out.
In summary, if you are relying on format reversion to "skip" earlier parts of a format while keeping new records, you must correctly mark the part of the whole format to revert to using parentheses. With just the whole format surrounded by parentheses, and no others, format reversion reuses the whole format.
Upvotes: 2
Reputation: 60078
You requested two strings to be printed, each on a new line, then two floating point numbers. That happened correctly.
But then there were still remaining items in the array. The format interpretation started again from the beginning with a new line and again for two strings and two numbers. But the array did not contain any strings...
Try '(A,/, A,/, (F5.2, F5.2))'
instead. That will repeat the two-times floating point number format group until there are still numbers to be processed but this time the format does not return to the very beginning. (Note: the old and untested revision of the answer featured an extra repeat count - I did not realize this will disable the format reversion.)
Upvotes: 2