make_mirror.pro
sswdb_upgrade.proでは、PERL(MIRROR?)からftpを実行している。
make_mirror.proでは、その設定ファイルを作っている。
on_ioerrorの修正を行った後でsswdb_upgradeを実行すると、このプロシージャの終わりあたり、ファイルの書き込み部分でエラーが出た。
% STRING: Format parser: NoViableAlt
% Execution halted at: MAKE_MIRROR 197 /???/ssw/gen/idl/system/make_mirror.pro
197行目付近の内容は以下。
> form='(' + strtrim(npacks,2) + '(1h#,/,a,/,'+ strtrim(ntags-1,2) + '(3x,a,/)))'
> file_append,mirror_file,string(allpacks,format=form) ;, /new
file_appendが書き込みプロシージャ、mirror_fileが設定ファイル、allpacks(構造体のアレイ)には、各データ(ydb, goes/x-ray, soho/genなど)のディレクトリ情報などが入っている。
構造体の内容をformできれいに整えて書き込んでいる訳だが、どうもここでエラーになる。
npacksが全データ数、ntagsは1データで必要とされる情報の要素数(構造体のタグ数)。
実際、GDL> print, string(allpacks,format=form) としてもエラーが出る。
ここではallpacksの全データをまとめて書いているが、どうもこれが良くないようで、1データずつなら表示できた。
全データ(例えば7データ)の場合のformatは、「form=(7(1h#,/,a,/,15(3x,a,/)))」となっていて、1h#以下が、1データの内容に相当する。
GDL> print, string(allpacks[0],format="(1h#,/,a,/,15(3x,a,/))") なら表示できた。
なので、1データずつ書き込むように書き換え。
< form='(1H#,/,a,/,'+ strtrim(ntags-1,2) + '(3x,a,/))'
<for i0=0,npacks-1 do begin
< s1=string(allpacks[i0],format=form)
< file_append,mirror_file,s1 ;, /new
< if i0 eq npacks-1 then goto,L100
<endfor
<L100:
なお、for文がnpacks-1で終了しないため、強引にgoto文で脱出している。(なんだこれ?)
試しに、
GDL> sswdb_upgrade,/spawn,/loud
を実行すると、ファイル取得できていた。
追記
その後SSWDBのインストールをしようとすると、下記のメッセージが出てGDL自体が落ちる事が何度かあった。
gdl: /build/gnudatalanguage-yJFcE3/gnudatalanguage-0.9.6v2/src/gdlarray.hpp:210: T& GDLArray<T, IsPOD>::operator[](SizeT) [with T = std::__cxx11::basic_string<char>; bool IsPOD = false; SizeT = long long unsigned int]: Assertion `ix < sz' failed.
Magick: abort due to signal 6 (SIGABRT) "Abort"...
Abort (core dumped)
GDLはまだ不安定なのかも。
さらに追記
3度ほどやり直すと、実行できるようになった。(何だったのか)
データをダウンロードできているが、さすがにファイル数が多い。
さらにさらに追記
ssw_upgradeを実行すると、元ファイルが上書きされてしまうので、手動で修正が必要。FTP転送の際、ファイルの容量の違いで判断している模様。
前回の記事のfile_stat.proも同じく修正が必要。
0 件のコメント:
コメントを投稿