HSPで画像を読み込むときは通常picload命令を利用すると思います。
しかし、実行時に画像ファイルが見つからなかったら「内部エラー13」を出力してプログラム自体が落ちてしまいます。

スクリプトエディタからデバッグ実行しているときは行数なども出るのでまだマシですが、実行ファイルにした後は「内部エラー13」としか出ないのでかなり不便です。

解決策

プログラムの上の方にこのプログラムを差し込むと、picload命令が置き換わってくれます。

#undef picload
#module
#deffunc picload str filename
  exist filename
  if(strsize=-1){
    dialog "Cannot open image \""+filename+"\""
  }
  picload@hsp filename
  return
#global

ファイルが見つからなかった場合には「Cannot open image "(ファイル名)"」というダイアログが表示された後に内部エラーとなってくれるので、最悪どのファイルが欠けているかがわかるようになります。

1行目の#undef picloadでpicload命令を(グローバルスコープから)削除し、3~9行目で定義したpicload命令に差し替えています。
このやり方はpicload命令以外(noteloadなど)にも応用可能だと思います。

細かい注意点

内部でexist命令を呼ぶようになるので、picload命令使用時にstrsizeの値が変化します。使用する場合は、strsizeを使用する部分にまたいでpicload命令を入れないよう注意して下さい。

(まっとうなプログラム言語なら、ファイルが見つからなかったとしてもエラーにならずに例外が発生するので、try-catchでファイルが見つからなかった場合の処理が書けたりするはずなんですがね… あとなんでstrsize変数なんていうstaticな変数に結果を出力するんだろう(疎結合化できない)…)

picload命令の第2引数も使いたい場合(2019/1/2追記)

picload命令に第2引数があることを知りませんでした。
第2引数も使う必要がある場合は以下のようにすれば問題ありません。

#undef picload
#module __picload__
#deffunc local picload_ str filename, int mode
  exist filename
  if(strsize=-1){
    dialog "Cannot open image \""+filename+"\""
  }
  picload@hsp filename,mode
  return
#define global picload(%1,%2=0) picload_@__picload__ %1,%2
#global

(デフォルト引数を定義するときの面倒さよ…)

この投稿をシェアする