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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0515
ありくい自作の文字列置換モジュール16解決


ありくい

リンク

2006/5/15(Mon) 22:32:49|NO.748

 こんにちは。
 今、複数のテキストファイルに対して文字列置換を行うソフトを書いて
るのですが、置換する文字列にワイド文字が混じるといまいちうまくいきません。
 モジュールと本体、どちらのスクリプトに難が(或いは両方にかも)あるかわからないので、
とりあえず短いモジュールの方を乗せます。
 よろしければ添削してください。


#module subMethod ;置換メソッド #defcfunc sub str o, str ai, str al org = o : aim = ai : alt = al bef = "" : af = "" r = instr(org,0,aim) if r = -1 : return org bef = strmid(org,0,r) af = strmid(org,-1,strlen(org)-strlen(bef)-strlen(aim)) return bef+alt+af #global #module gsubMethod ;文字列内網羅Ver. #defcfunc gsub str o, str ai, str al org = o : aim = ai : alt = al res = org repeat r = instr(res,0,aim) if r = -1 : break res = sub(res,aim,alt) loop return res #global ;実行例スクリプト torg1 = "こんにちは。山田 太郎です。はじめまして。" torg2 = "こんにちは。山田 太郎です。はじめまして。太郎って呼んでください。" taim = "太郎" talt = "タロウ" mes "sub実行例" mes torg1 mes "\t↓" m = sub(torg1,taim,talt) mes m+"\n\n\n" mes "gsub実行例" mes torg2 mes "\t↓" m = gsub(torg2,taim,talt) mes m stop



この記事に返信する


MOTI

リンク

2006/5/16(Tue) 16:42:49|NO.751

僕ので、上のスクリプトを実行したら、太郎がタロウに変わり変換できました。
半角文字を混ぜてみてもできました。



ありくい

リンク

2006/5/16(Tue) 18:55:14|NO.752

 確認ありがとうございます。
 では、本体の方がダメなんでしょうか…。
 置換文字列にワイド文字を混ぜると、処理はうまく
いかないし、終了時にエラーを起こします。
 デバックも完全に行き詰りました。
 ↓長いですが、本体のスクリプトです。


#include "hspext.as" #include "sub.hsp" #define LIST_MAX 100000 #define BUF_MAX 64000 #define LINE_MAX 8000 #define DEFAULT_DIR "C:\\" ;以下定義必須(nullString "" でも可) #define SOFTNAME "置換野郎" #define VERSION "Ver 0.5β" #define ETC_MSG "ありくい -all rights reserved" ;ここまで goto *init #module capMake #defcfunc caption str t, str n, str v, str e tmp = t : name = n : ver = v : etc = e cap = tmp cap = sub(cap,"%n",name) cap = sub(cap,"%v",ver) cap = sub(cap,"%e",etc) return cap #global *init title caption("%n -%v %e",SOFTNAME,VERSION,ETC_MSG) gosub *GUI_build sdim buf,BUF_MAX fmask = "*.htm","*.html" *main ;メインループ stop ;========== "処理スタート!" ボタンのイベント ================================ *processing notesel flistnote sdim flist,LINE_MAX,notemax repeat notemax noteget flist(cnt),cnt loop foreach flist ;取り扱うファイルを読み込む exist flist(cnt) if strsize = -1 : continue sdim file,strsize+32 bload flist(cnt),file,strsize notesel file ;ファイル全行に置換処理i repeat notemax noteget buf,cnt m = buf buf = gsub(m,aim,alt) noteadd buf,cnt,1 loop ;処理したバッファをセーブする notesave flist(cnt) wait 5 loop dialog "Finish!" goto *main ;================================================================================== ;********** "ディレクトリ選択" ボタンのイベント ******************************* *seldir ;;ファイル列挙は一階層下まで ;リスティングディレクトリ選択 selfolder dir,"" if stat = 1 : goto *main ;選択ディレクトリ内のファイルリストアップ workdir = dir gosub *htmlsearch ;子ディレクトリを検出 sdim subdir,LINE_MAX,1 sdim buf,BUF_MAX dirlist buf,"*.*",5 if stat <= 2 : goto *seldirend notesel buf : gosub *pathlong notesave "test.txt" repeat notemax noteget subdir(cnt),cnt loop ;子ディレクトリ内をリストアップ foreach subdir workdir = subdir(cnt) gosub *htmlsearch loop *seldirend objprm flistbox,flistnote goto *main *htmlsearch ;リストアップルーチン本体 if instr(workdir,0,"System Volume Information") != -1 : return chdir workdir foreach fmask dirlist buf,fmask(cnt),3 notesel buf : gosub *pathlong flistnote += buf loop return *pathlong ;絶対パスに加工 sdim linebuf,LINE_MAX repeat notemax noteget linebuf,cnt linebuf = workdir+"\\"+linebuf linebuf = sub(linebuf,"\\\\","\\") noteadd linebuf,cnt,1 loop return ;*************************************************************************************** //////// "↑リスト初期化" ボタンのイベント ///////////////////////////////////////// *flistclear objprm flistbox,"" goto *main //////////////////////////////////////////////////////////////////////////////////////// *GUI_build ;;GUIビルド ;ウインドウ、フォント設定 screen 0,640,480 color 255,130,250 : boxf : color 0,0,0 font "MS ゴシック",16 objmode 2,1 objcnt = 0 dir = DEFAULT_DIR ;置換対象文字列 aimbox = objcnt objcnt++ aim = "" pos 20,20 : mes "置換する対象の文字列" : input aim,250,24 ;置換後文字列 altbox = objcnt objcnt++ alt = "" pos 320,20 : mes "その代わりに置き換える文字列" : input alt,250,24 ;ファイルリスト展示 --flistbox flistbox = objcnt objcnt++ sdim flistnote,LIST_MAX pos 20,60 mes "選択ファイル" mesbox flistnote,550,300,5 ;制御ボタン objsize 200,24 pos 20,390 button "ディレクトリ選択",*seldir pos 300,390 button "↑リスト初期化",*flistclear pos 160,430 button "処理スタート!",*processing return



naznyark

リンク

2006/5/17(Wed) 02:29:24|NO.754

htmlファイルを主な対象と考えているようですから
おそらくファイルの文字コードの関係でしょう。

基本的に HSP の文字列操作命令ではシフトJIS(SJIS)の文字列しか扱えません。
(unicode(UTF-16)の文字列なら cnvwtos関数で SJIS に変換できます。)



ありくい

リンク

2006/5/17(Wed) 17:41:56|NO.765

>文字コードの関係
 テスト用のHTML、調べてみたらEUCでした orz
 モジュール探してきます…



ありくい

リンク

2006/5/19(Fri) 00:33:16|NO.773

 hspjcodeを使おうとしたのですが、このプラグインが用意している
命令を使うところで文法エラーを出されます。
 jcode.asはcommonフォルダに、DLL本体はHSPランタイムと同じフォルダに
きちんと入っているのですが。謎です。
 ひょっとしてHSP3だと動かない…ですか?



naznyark

リンク

2006/5/19(Fri) 03:05:13|NO.774

> ひょっとしてHSP3だと動かない…ですか?
私の環境では HSP3.0(a)、3.1b3 で動いています。

> HSPランタイムと同じフォルダ
runtime フォルダではなくて
hsed3.exe と同じフォルダのことですよね?
私の場合は hspjcode.dll を hsed3.exe と同じフォルダに、
jcode.as を common フォルダに、で動いています。



ありくい

リンク

2006/5/19(Fri) 08:25:42|NO.775

 自分の環境は3.0正式版です。
 …ひょっとしてモジュール中だからでしょうか?
 ↓ソースです。


#include "jcode.as" #module charCordAutoDefineAndConvert #defcfunc charConv str e getcode r,e if r = SJIS : return e if r = NOCONV : return cnvwtos(e) convert buf,e,SJIS,r if stat = -1 : return return buf #global test = "こんにちは。" mes charConv(test)



kz3

リンク

2006/5/19(Fri) 09:04:11|NO.776

ヘッダのソースで #func の後ろに global をつけてみてください。



ありくい

リンク

2006/5/19(Fri) 15:39:38|NO.777

>kz3さん
 助言ありがとうございます。文法エラーは消えました。
 …が、今度は何故かフェータル・エラーが orz


#HSP script preprocessor ver3.0a / onion software 1997-2005(c) #Source file not found.[userdef.as] #HSP code generator ver3.0a / onion software 1997-2005(c) #ラベルが存在しません [_charcordautodefineandconvert_exit] hsptmp(18) : error 19 : 致命的なエラーです (18行目)

 モジュール内で別のモジュールを呼ぶような真似は、そもそも
しないべきなのでしょうか…?
 あ、あとヘッダファイルって改変しちゃって大丈夫ですか? 配布する
時とか。



Irisawa

リンク

2006/5/19(Fri) 16:16:18|NO.778

モジュールの順番にご注意ください。

ユーザー定義命令/定義関数は呼び出すより前の位置で定義されていないといけません。
モジュールの定義順番は非常に重要です。
そのため、2つ以上のモジュールから相互に呼び出すようなことは仕様上できません。
片方からなら順番を注意すれば大丈夫です。

ラベルジャンプやサブルーチンジャンプの場合はモジュール空間が異なるのでモジュール名を
ラベルに指定してください。


#module "test1" ; エラー対策? #deffunc b return *test mes "test@test1" return #global #module "test2" #deffunc a gosub *test@test1 return #global a b ; なぜか呼び出さないとエラーになる stop



naznyark

リンク

2006/5/20(Sat) 02:16:41|NO.780

> #module charCordAutoDefineAndConvert
モジュール名が長すぎですね。
以下ヘルプより。
> モジュール名は、18文字以内の長さで他の変数名などの
> キーワードと重複することはできません。

> あ、あとヘッダファイルって改変しちゃって大丈夫ですか?
> 配布する時とか
readme に書いてあるとおり jcode.pl のライセンスを調べてください。
でもモジュール内部でインクルードすれば
改変しなくても動くと思います。
(モジュールの外で jcode の命令を直接呼び出すこともあるなら
モジュールの外でもインクルードしてください。)

;#include "jcode.as" #module cDefAndConv #include "jcode.as" #defcfunc charConv str e ;中略 #global



ありくい

リンク

2006/5/21(Sun) 21:59:23|NO.814

 何とか解決の目処が立ちました。
 皆さんたくさんの助言ありがとうございます。



ルル

リンク

2006/7/6(Thu) 06:31:19|NO.1268

最近はじめたばかりで、よくわからないので、質問させてください。
何を作りたいか?の以前のレベルですが、

#include "hspext.as"

というのを使ってみようと、思っています。
それで何を作るのか?とか、何をしたいのか?とかいうことは先のこととして、
一体、hspext.asって、どこにあるのですか?

もう、HDD内、ウェブ上、さんざんさがして、くたびれました。

デフォールトで、Ver.3.0 のホットスープをダウンロードしたら、
hspext.dllというライブラリ(?)があるのは、確認できました。
それがあるから、名前は、hspext.as とhspext.dllで多少ちがうけど、
かまわないのかも?と思って、#include "hspext.as"とやって、あとに、
aplact , aplstr "文字など"、としましたが、aplact や aplstr などが、
命令として認識されない(青文字にならない)みたいです。

ほんとに素人な質問なのかもしれませんが、どなたか、教えてください。



kz3

リンク

2006/7/6(Thu) 08:36:20|NO.1269

>ルルさん

新しくスレッドを作ってください。



Irisawa

リンク

2006/7/6(Thu) 15:01:01|NO.1272

>>ルルさん
> 一体、hspext.asって、どこにあるのですか?

マニュアルに書いてあるように{HSPインストールフォルダ}/commonフォルダ内は
標準インクルードパスになっています。
hspextプラグインは本体同梱です。
正常にインストールに成功していればcommonフォルダ内にあるはずです。

> hspext.dllというライブラリ(?)があるのは、確認できました。
> それがあるから、名前は、hspext.as とhspext.dllで多少ちがうけど

DLLファイルは実行モジュールです。
HSPの拡張プラグインもDLLファイルです。
ASファイルはHSPソースファイル及びインクルード用のファイルです。
モジュール命令や拡張プラグインを使用する際に共通化している部分の再利用を簡単に
するために別ファイルで提供されます。

> aplact , aplstr "文字など"、としましたが、aplact や aplstr などが、
> 命令として認識されない(青文字にならない)みたいです。

カラーリングされるのはHSPの標準キーワードのみです。
モジュール命令やプラグインによる拡張命令には対応していません。

というより、実行してエラーになったのでしょうか。
正常に実行できていればどこにあるかは気にしなくていいはずですが。



ルル

リンク

2006/7/9(Sun) 08:00:10|NO.1299

>Irisawa 、Kz3

Common のなかに、hspext.as がありました。
あと、青くならないことも理解しました。
もう少し 説明書読んだりしながら、勉強したいです。
お二人とも、ありがとうございました。



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