トップ «前の日記(2008-02-26) 最新 次の日記(2008-02-28)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2008-02-27 [長年日記]

_ [SAD][Fortran]Q編集記述子

Q編集記述子は、すでに調べた通りベンダー拡張なので 使うべきでは有りません。read文に置いては、Q編集記述子が 表れた時点でバッファ無いに有る文字数を返すので(Q,A)と 書けば、読み込んだ文字列の長さが判るわけです。 Fortranの文字列仕様(変数のサイズは固定でも中身のサイズが判らない)で パーサー書くには必須とも言える機能なので、新しいFortranには 同等の機能が無いはずは無いと思うのですが...やはり有りました(w

Fortran90の停留入出力での入力で、

integer :: nc
character(len=256) :: s
read(lfno, fmt='(A256)', advance='no', size=nc) s

という構文が使えます。ここでは、 sは長さ256の文字列バッファに 入力lfnoから改行・ファイル終端が来るか最大256文字読み込むまで 読み込み、読み込んだ文字数を ncに格納します。 停留入力なので、改行が来る前に書式指定の終端に達した場合は、 ファイルポインタはそこで停止します。 つまり、入力を1文字づつ読み込むことも可能です。

これ自身は、Fortran90規格に有るので g95でも使えるのが味噌

ただし、改行は特別扱いなので unibyte-stream入力には 厳しいですね。もちろん、改行記号特定1-character のみな処理系なら改行を検知したところで、バッファに自前で 改行記号を送り込めば良いわけですが、移植性がありませんね (改行記号が1-characterでもCRかLFかそれ以外かは環境依存)

実際、Fortran I/O libraryが気を利かせている実装の場合、unix上でも CR-LFのシーケンスを改行記号に扱ったり(例えばg95/gfortran)、 単独のCRに対して次のLFを読みにいってCR+LFで無い場合は 改行記号扱いし次の一文字は読み飛ばしたままだったり(例えばgfortran) するのでunibyte-stream入力を停留入力で扱うのは難しそうです。


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記