HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0816
猫山田広nkfcnvのモジュール化時のエラー2解決


猫山田広

リンク

2012/8/16(Thu) 12:23:20|NO.48607

先日はmes画面表示内容の保存でお世話になりました。
大変ありがとうございました。

今回はテキストファイル(ex. index.html)の内容を表示する
プログラムを書いていて、モジュール化のところで
躓いています。

まず最初に以下のような通常のコードを書いて正常に
動くことを確認しました。

;//////file_cat_a//////////////////////////////ここから
#include "hspinet.as" ;nkfcnvを使うためにinclude

notesel file_buffer ;テキストバッファを指定
file_name="./index.html" ;ファイル名を指定
noteload file_name ;テキストバッファにファイルを読み込む

repeat notemax ;読み込んだファイルの各行で以下を繰り返す
noteget file_contents,cnt ;ファイルの各行を読み出す
buf = file_contents ;一度テンポラリバッファ変数に格納
nkfcnv buf,buf ;文字コードを変換  ←エラーは出ない
mes buf ;テキストバッファ内容を表示
loop

stop
;/////file_cat_a//////////////////////////////ここまで


つぎに、このなかでファイルを読み込んで表示する
部分だけをモジュール化しようとして、以下のような
コードを書いたところ、nkfcnvのところで
「文法が間違っています」
とエラーが出て動きません。

;/////file_cat_b//////////////////////////////ここから
#include "hspinet.as" ;nkfcnvを使うためにinclude

#module filecat filename ;モジュール宣言開始
#deffunc file_cat str file_name ;ファイル内容を表示する命令"file_cat"を定義

notesel file_buffer ;テキストバッファを指定
noteload file_name ;テキストバッファにファイルを読み込む

repeat notemax ;ファイルの行数だけ以下を続ける
noteget file_contents,cnt ;行の内容を読み出す
buf = file_contents ;一度テンポラリバッファ変数に格納
nkfcnv buf,buf ;文字コードを変換 ←ここで"文法が間違っている"というエラー
mes buf ;テキストバッファ内容を表示
loop

noteunsel ;テキストバッファを戻す
return
#global ;モジュールここまで

;以下mainコード

file_cat "./index.html" ;mainのコード

stop
;/////file_cat_b//////////////////////////////ここまで

ちなみにfile_cat_bでもnkfcnvが含まれる一行をコメントアウトすると
エラー無しで動くことから、nkfcnvあるいはそれが含まれるhspinet.asの
includeの問題ではないかと思うのですが、このあたりについて
何が問題なのかお分かりの方はご指摘をお願いできませんでしょうか。

よろしくお願いいたします。



この記事に返信する


inovia

リンク

2012/8/16(Thu) 12:49:30|NO.48609

hspinetの命令の宣言でglobalがついていないので、
モジュールの外側で作成された命令・関数が認識できない状態になっています。
対策としては、

1. hspinet.as を直接修正して global宣言をつける
2. モジュール内に再度hspinetの定義をする
3. nkfcnv@ と書いて呼び出す

の3通りが考えられます。
1. と 2. は手間がかかるので、3. の手段のほうが良いでしょう。
@を最後につけることで通常空間のものを参照します。


#include "hspinet.as" ;nkfcnvを使うためにinclude #module filecat filename ;モジュール宣言開始 #deffunc file_cat str file_name ;ファイル内容を表示する命令"file_cat"を定義 notesel file_buffer ;テキストバッファを指定 noteload file_name ;テキストバッファにファイルを読み込む repeat notemax ;ファイルの行数だけ以下を続ける noteget file_contents,cnt ;行の内容を読み出す buf = file_contents ;一度テンポラリバッファ変数に格納 nkfcnv@ buf,buf ;文字コードを変換 ←ここで"文法が間違っている"というエラー mes buf ;テキストバッファ内容を表示 loop noteunsel ;テキストバッファを戻す return #global ;モジュールここまで ;以下mainコード file_cat "./index.html" ;mainのコード stop

2. のほうだとこんな感じ

#module filecat filename ;モジュール宣言開始 #uselib "hspinet.dll" #func nkfcnv nkfcnv $202 #deffunc file_cat str file_name ;ファイル内容を表示する命令"file_cat"を定義 notesel file_buffer ;テキストバッファを指定 noteload file_name ;テキストバッファにファイルを読み込む repeat notemax ;ファイルの行数だけ以下を続ける noteget file_contents,cnt ;行の内容を読み出す buf = file_contents ;一度テンポラリバッファ変数に格納 nkfcnv buf,buf ;文字コードを変換 ←ここで"文法が間違っている"というエラー mes buf ;テキストバッファ内容を表示 loop noteunsel ;テキストバッファを戻す return #global ;モジュールここまで ;以下mainコード file_cat "./index.html" ;mainのコード stop



猫山田広

リンク

2012/8/16(Thu) 18:52:54|NO.48613

大変ありがとうございました。>inovia様

命令の末尾に@をつけることでエラーが出なくなり、処理も正常に出来るようになり
解決いたしました。これでプログラムをすっきりさせることができ、なんとか全体の
構成に集中することができるようになりました。感謝いたします。

よくわからなかったのが、なぜこのhspinet.as内部の命令がglobal指定をされて
いないのか、というところです。あえて命令をlocalに限定する意味とは何なのか
よくわかりませんでした。


ともあれ、本当にありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.