|
下記のスクリプトですが、callで4つのファイルを呼び出さないと「ArrCopy」関数が使えない状態です。 クラスファイルは、各カテゴリごとに作成しています、配列関係の関数は、「Array.uws」に格納みたいに。 クラスファイルの管理の仕方や呼び出しについて、先輩方はどのようにされていますでしょうか?
1. カテゴリーごとに分けずに、1つのクラスファイルを作成してそれを呼び出す、この場合に関数呼び出し時に何の関数かは関数名だけで判断しないといけない。 ex) COMMON.KANSUU1
2. カテゴリーごとクラスファイルを分けて、クラスファイルに関数作成するときは他のクラスファイルの呼び出しをなるだけせずに関数の中身のコードを直に書く。
[abc.uws] 配列コピーする関数:ARRAYクラスファイルの「ArrCopy」関数利用
call GET_UWSC_DIR + "\Test_UwscClassParts\Array.uws" call GET_UWSC_DIR + "\Test_UwscClassParts\FileControl.uws" call GET_UWSC_DIR + "\Test_UwscClassParts\RegularExpress.uws" call GET_UWSC_DIR + "\Test_UwscClassParts\StringControl.uws"
dim arr[] = "a", "b", "c" dim arr1[-1]
ARRAY.ArrCopy(arr,arr1)
for aa in arr1 print aa next --------------------- [Array.uws] 試したことーエラーになった、関数の中に関数を使うことは多重エラー Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1] str = ReadAlltext(r_fp) dim i = 0 d = GetRowNum_File(r_fp) fid = fopen(r_fp,F_READ) resize(arr1, d - 1) resize(arr2, d - 1) for y = 1 to d str = fget(fid,y) arr1[i] = token(Delimiter,str) arr2[i] = token(Delimiter,str) i = i + 1 next fclose(fid)
Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5 Dim fid = FOpen(r_fp) Result = FGet(fid, F_ALLTEXT) FClose(fid) FEnd
Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6 fid = fopen(r_fp,F_READ) row_total_number = fget(fid,-1) Result = row_total_number fclose(fid) Fend
fend
↓↓↓↓ 解決案? クラスファイルの関数作成時、他のクラスファイルの関数呼び出しはなるだけ避けて直にコードを書く
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1] Dim fid = FOpen(r_fp) str = FGet(fid, F_ALLTEXT) FClose(fid)
dim i = 0
fid = fopen(r_fp,F_READ) row_total_number = fget(fid,-1) d = row_total_number fclose(fid)
fid = fopen(r_fp,F_READ) resize(arr1, d - 1) resize(arr2, d - 1) for y = 1 to d str = fget(fid,y) arr1[i] = token(Delimiter,str) arr2[i] = token(Delimiter,str) i = i + 1 next fclose(fid) fend
--------------------- [Array.uws] 現在の状態 Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17 str = FILECONTROL.ReadAlltext(r_fp) dim i = 0 d = FILECONTROL.GetRowNum_File(r_fp) fid = fopen(r_fp,F_READ) resize(arr1, d - 1) resize(arr2, d - 1) for y = 1 to d str = fget(fid,y) arr1[i] = token(Delimiter,str) arr2[i] = token(Delimiter,str) i = i + 1 next fclose(fid) fend --------------------- [FileControl.uws] 現在の状態 Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5 Dim fid = FOpen(r_fp) Result = FGet(fid, F_ALLTEXT) FClose(fid) FEnd
Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4 Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$" Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1") FEnd
Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6 fid = fopen(r_fp,F_READ) row_total_number = fget(fid,-1) Result = row_total_number fclose(fid) Fend --------------------- [RegularExpress.uws] 現在の状態 Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15 Dim o_Reg = CreateOLEObj("VBScript.Regexp") o_Reg.Global = TRUE o_Reg.Multiline = TRUE o_Reg.pattern = pat Ifb replacestr = null If o_Reg.Test(str) = 0 Then result = FALSE Else result = TRUE endif Else result = o_Reg.Replace(str,replacestr) EndIf FEnd
Function RowsPassOpenMatchSubMatch1(r_fp,Pattern) // ファイル内の各行フルパスを開き、パターン一致でsubmatchvalue取得_RegularExpress_11 Dim arr = ARRAY.ArrayCreate(r_fp) dim utuwa for i = 0 to Length(arr) - 1 str = FILECONTROL.ReadAllText(arr[i]) utuwa = utuwa + THIS.RegSubmatch(str,Pattern) + "<#CR>" next utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa) //重複削除 utuwa1 = STRINGCONTROL.BlankRowDelete_Str(utuwa1) //空行削除 result = utuwa1 fend ---------------------
|
No.1643 2023/10/19(Thu) 13:54:08
|
☆ Re: クラスファイルの管理、呼び出しについて / nanai |
|
|
|
各クラスファイルの先頭に、そのクラスファイルの関数で使う別クラスのファイルパスを相対パスでしたのですが、エラーが出ました。これの原因とは、abc.uwsから FILECONTROLクラスを呼び出して、FILECONTROLクラスにある、関数からREGULAREXPRESSクラスファイルの関数を呼び出していることが原因でしょうか?
つまり、2階層の呼び出しはできないということでしょうか? すみません、先輩方ご教授願いませんでしょうか?
[エラー内容] 23/10/20 11:33 型が合っていない or オーバーフロー C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS: 0行目: PROCEDURE C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS()
[abc.uws] 呼び出す側 OPTION LOGFILE = 4
call ..\Test_UwscClassParts\Array.uws
dim arr1[-1],arr2[-1] r_fp = "C:\Users\mac\Desktop\uwsc\UwscClassParts\Test\Array\RowDelimiterArr2Create.txt" Delimiter = ":" ARRAY.RowDelimiterArr2Create(r_fp,Delimiter,arr1,arr2)
for a in arr1 print a next
[Array.uws] call .\FileControl.uws
CLASS ARRAY
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17 str = FILECONTROL.ReadAlltext(r_fp) dim i = 0 d = FILECONTROL.GetRowNum_File(r_fp) fid = fopen(r_fp,F_READ) resize(arr1, d - 1) resize(arr2, d - 1)
for y = 1 to d str = fget(fid,y) arr1[i] = token(Delimiter,str) arr2[i] = token(Delimiter,str) i = i + 1 next
fclose(fid)
fend
Procedure ArrCopy(arr[], var copyarr[]) // 配列をコピーする_Array_8 ifb length(arr) > length(copyarr) resize(copyarr, length(arr) - 1) endif for i = 0 to length(arr) - 1 copyarr[i] = arr[i] next fend
Function ArrayCreate(r_fp) // ファイル内テキストを各行をCRで区切り新配列作成fp_Array_6 fid = FOpen(r_fp) str = FGet(fid, F_ALLTEXT) Result = split(str, "<#CR>") fclose(fid) fend
endclass
[FileControl.uws] call .\Array.uws call .\RegularExpress.uws
CLASS FILECONTROL
Function FilesAlltextReplaceSeparate(fpFileList,replacePreviousNext,dp) // ファイル内の各行にあるフルパスを開き、置き換えファイルで指定した文字列で一括置き換え_FileControl_28 OPTION SPECIALCHAR
Dim arr = ARRAY.ArrayCreate(fpFileList) //フルパスの配列
Delimiter = "#" //「#」で区切る
dim arr1[-1], arr2[-1] //arr1:置き換えされる文字列,arr2:置き換え後文字列
ARRAY.RowDelimiterArr2Create(replacePreviousNext,Delimiter,arr1,arr2)
for i = 0 to LENGTH(arr) - 1 //全行数分 str = THIS.ReadAllText(arr[i]) for y = 0 to Length(arr1) - 1 //置き換え一覧 str = chgmoj(str, arr1[y], arr2[y]) next
fn = THIS.Getdpfn(arr[i]) fn = replace(fn, "origin", "replace") print "fn:" + fn //test1_replace.txt w_fp = dp + fn //別ファイルとして新規作成 THIS.WriteAllText(w_fp,str) //COMMON.WriteAllText(arr[i],str) //既存ファイルに書換 next
result = true fend
Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4 Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$" Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1") FEnd
Procedure WriteAlltext(w_fp,str) // テキストを全て書込(上書き)_FileControl_5 fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR) FPut(fid, str, F_ALLTEXT) FClose(fid) FEnd
Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5 Dim fid = FOpen(r_fp) Result = FGet(fid, F_ALLTEXT) FClose(fid) FEnd
Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6 fid = fopen(r_fp,F_READ) row_total_number = fget(fid,-1) Result = row_total_number fclose(fid) Fend
endclass
[RegularExpress.uws] CLASS REGULAREXPRESS
Function RegExe(str, Pattern, IgnoreCase=TRUE, Global=TRUE) // Matches基本_RegularExpress_9 Public o_Reg = CREATEOLEOBJ("VBScript.RegExp") o_Reg.IgnoreCase = IgnoreCase o_Reg.Global = Global o_Reg.Pattern = Pattern Matches = o_Reg.Execute(str) Result = Matches Fend
Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15 Dim o_Reg = CreateOLEObj("VBScript.Regexp") o_Reg.Global = TRUE o_Reg.Multiline = TRUE o_Reg.pattern = pat Ifb replacestr = null If o_Reg.Test(str) = 0 Then result = FALSE Else result = TRUE endif Else result = o_Reg.Replace(str,replacestr) EndIf FEnd
endclass
[StringControl.uws] call .\RegularExpress.uws
CLASS STRINGCONTROL
Function BlankRowDelete_Str(str) // 空白行削除:str_StringControl_4 pattern = "^(\s| )*(\r\n|\r|\n)" RESULT = REGULAREXPRESS.RegReplace(str,pattern,"") fend
endclass
|
No.1647 2023/10/20(Fri) 11:43:03
|
|
☆ Re: クラスファイルの管理、呼び出しについて / stuncloud |
|
|
|
callするときに相対パスを記述する場合注意しなければならないのは、起点となるのはあくまで呼び出したメインスクリプトのパスであるということです 以下のような構成にした場合、lib.uws内でlib.uwsからの相対パスを記述した場合、main.uwsを呼び出すとエラーになる
- main.uws ``` call libs\libs.uws
Foo.p() Bar.p() Baz.p() ``` - libs - lib.uws ``` // main.uwsからlib.uwsを呼ぶ場合は、main.uwsからの相対パスを指定する必要がある call libs\foo.uws call libs\bar.uws call libs\baz.uws // 以下のように書いた場合、main.uwsから見ると自分と同じフォルダを探してしまう // call foo.uws // call bar.uws // call baz.uws ``` - foo.uws ``` module Foo procedure p fend endmodule ``` - bar.uws ``` module Bar procedure p fend endmodule ``` - baz.uws ``` module Baz procedure p fend endmodule ```
循環参照による多重定義エラーに関してですが、相互に呼び合う必要があるのなら上記のlib.uwsのように他のすべてのファイルをcallするファイルをメインで呼ぶくらいしかないです その方法であれば上記例ではlib.uwsさえcallすればすべての機能が使えることが保証されます でなければメインから愚直に全部callするしかないです
もっと言うと、互いに互いのモジュール関数を呼び合ってるのが良くないので引数を工夫するとかですね 例えばARRAY.RowDelimiterArr2Createであれば、r_fpを受けてその中でFILECONTROL.ReadAlltext(r_fp)を呼んでいますが、FILECONTROL.ReadAlltext(r_fp)の戻り値を受けるようにします > Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) > str = FILECONTROL.ReadAlltext(r_fp) > dim i = 0 > d = FILECONTROL.GetRowNum_File(r_fp) これを > Procedure RowDelimiterArr2Create(all_text, rows, ,Delimiter,var arr1[],var arr2[]) > str = all_text > dim i = 0 > d = rows のように書き換えて、呼び出すときは > all_text = FILECONTROL.ReadAlltext(r_fp) > rows = FILECONTROL.GetRowNum_File(r_fp) > ARRAY.RowDelimiterArr2Create(all_text, rows, delimiter, arr1, arr2) とする みたいな話です、こうやって他のモジュールへの依存をなくす方が筋がいいです
|
No.1650 2023/10/20(Fri) 14:55:23
|
|