|
|
|
2019/10/15(Tue) 19:28:42|NO.88634
ひらがなカタカナ変換機を作ったのですがパラメーターが異常というエラーが出てしまいます。
どこを修正すればいいのか教えてください。
#include "hsp3utf.as"
#module
#defcfunc strlen_utf16w array utfstr
word = 0
count_words = 0
repeat
word = wpeek(utfstr, cnt*2)
if( word == 0 ) {
break
}
else {
count_words++
}
loop
return count_words
#defcfunc hiraganatokatakana str p1
old_kana=p1
mojitimes=strlen(old_kana)
cnvstow old_kana,old_kana;UTF-8からUTF-16に変換
sdim b,mojitimes;これがないとバッファオーバーフローになる。
repeat strlen_utf16w(old_kana)
checkold_kana=wpeek(old_kana,cnt*2)
;ifで文字がひらがなかどうか判別 0x60を足すことでカタカナになる。
if(checkold_kana>=0x3041)&(checkold_kana<=0x3096):wpoke b,cnt*2,checkold_kana+0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
#defcfunc katakanatohiragana str p1,int mojicnt
old_kana=p1
mojitimes=strlen(old_kana)
cnvstow old_kana,old_kana;UTF-8からUTF-16に変換
sdim b,mojitimes;これがないとバッファオーバーフローにになる。
repeat strlen_utf16w(old_kana)
checkold_kana=wpeek(old_kana,cnt*2)
;ifで文字がカタカナかどうか判別 0x60を引くことでひらがなになる。
if(checkold_kana>=0x30A1)&(checkold_kana<=0x30F6):wpoke b,cnt*2,checkold_kana-0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
#global
#uselib "user32.dll"
#func SetWindowText "SetWindowTextW" int,wstr
title "ひらがな↔カタカナ 変換機"
font "メイリオ",16
objmode 2
buf="abcdefghijklmnopqrstuvwxyz\nあいうえお"
mesbox buf,640,450,,500
obj_hwnd=objinfo_hwnd(stat)
objsize 150,30
button gosub "カタカナへ",*katakana
pos 150,450
button gosub "ひらがなへ",*hiragana
stop
;objprm命令では反映されないため、代わりにWin32APIのSetWindowText関数を使用
*katakana
SetWindowText obj_hwnd,hiraganatokatakana(buf)
return
*hiragana
SetWindowText obj_hwnd,katakanatohiragana(buf)
return
| |
|
2019/10/15(Tue) 20:08:04|NO.88635
32APIのLCMapStringWを使うと簡単かと思います。
LCMapString と定数 LCMAP_KATAKANA LCMAP_HIRAGANA
#define LCMAP_KATAKANA 0x00200000
#define LCMAP_HIRAGANA 0x00100000
辺りで検索すると参考になるものが出てくるかと思います。
バッファの確保はお忘れなきよう。
|
|
2019/10/15(Tue) 20:28:26|NO.88636
> ひらがなカタカナ変換機を作ったのですがパラメーターが異常というエラーが出てしまいます。
腕試しで「変換機」を作ってるのでしょうか?
それとも必要だから作ったのでしょうか?
↑
単純に必要なだけであれば「X」氏のアドバイスをお勧めします。
|
|
2019/10/16(Wed) 17:32:45|NO.88637
これでどうでしょうか?cnvstowの特殊?な挙動が原因かと。
あとsdim b,mojitimesの確保サイズも間違ってたので修正しました。
(最後の+2は必要ないかも)
#defcfunc hiraganatokatakana str p1
old_kana=p1
mojitimes=strlen(old_kana)
sdim old_kana_,(mojitimes*2)+2;cnvstowのp1とp2に同じ変数を指定するとバグるので変数を別にする。
cnvstow old_kana_,old_kana;UTF-8からUTF-16に変換
sdim b,mojitimes*2;これがないとバッファオーバーフローになる。;UTF-8から16に変換してるなら2倍のサイズを確保しないといけない。あと終了コード分も追加で。
repeat strlen_utf16w(old_kana_)
checkold_kana=wpeek(old_kana_,cnt*2)
;ifで文字がひらがなかどうか判別 0x60を足すことでカタカナになる。
if(checkold_kana>=0x3041)&(checkold_kana<=0x3096):wpoke b,cnt*2,checkold_kana+0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
#defcfunc katakanatohiragana str p1,int mojicnt
old_kana=p1
mojitimes=strlen(old_kana)
sdim old_kana_,(mojitimes*2)+2;cnvstowのp1とp2に同じ変数を指定するとバグるので変数を別にする。
cnvstow old_kana_,old_kana;UTF-8からUTF-16に変換
sdim b,(mojitimes*2)+2;これがないとバッファオーバーフローになる。;UTF-8から16に変換してるなら2倍のサイズを確保しないといけない。あと終了コード分も追加で。
repeat strlen_utf16w(old_kana_)
checkold_kana=wpeek(old_kana_,cnt*2)
;ifで文字がカタカナかどうか判別 0x60を引くことでひらがなになる。
if(checkold_kana>=0x30A1)&(checkold_kana<=0x30F6):wpoke b,cnt*2,checkold_kana-0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
| |
|
2019/10/16(Wed) 18:10:30|NO.88640
>ソラさん
ありがとうございます。
バイト数が原因だったようです。
ソラさんの通り、試してみたところ、反映されました。
#include "hsp3utf.as"
#module
#defcfunc strlen_utf16w array utfstr
word = 0
count_words = 0
repeat
word = wpeek(utfstr, cnt*2)
if( word == 0 ) {
break
}
else {
count_words++
}
loop
return count_words
#defcfunc hiraganatokatakana str p1
old_kana=p1
mojitimes=strlen(old_kana)
sdim old_kana_,(mojitimes*2)+2;cnvstowのp1とp2に同じ変数を指定するとバグるので変数を別にする。
cnvstow old_kana_,old_kana;UTF-8からUTF-16に変換
sdim b,mojitimes*2;これがないとバッファオーバーフローになる。;UTF-8から16に変換してるなら2倍のサイズを確保しないといけない。あと終了コード分も追加で。
repeat strlen_utf16w(old_kana_)
checkold_kana=wpeek(old_kana_,cnt*2)
;ifで文字がひらがなかどうか判別 0x60を足すことでカタカナになる。
if(checkold_kana>=0x3041)&(checkold_kana<=0x3096):wpoke b,cnt*2,checkold_kana+0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
#defcfunc katakanatohiragana str p1
old_kana=p1
mojitimes=strlen(old_kana)
sdim old_kana_,(mojitimes*2)+2;cnvstowのp1とp2に同じ変数を指定するとバグるので変数を別にする。
cnvstow old_kana_,old_kana;UTF-8からUTF-16に変換
sdim b,(mojitimes*2)+2;これがないとバッファオーバーフローになる。;UTF-8から16に変換してるなら2倍のサイズを確保しないといけない。あと終了コード分も追加で。
repeat strlen_utf16w(old_kana_)
checkold_kana=wpeek(old_kana_,cnt*2)
;ifで文字がカタカナかどうか判別 0x60を引くことでひらがなになる。
if(checkold_kana>=0x30A1)&(checkold_kana<=0x30F6):wpoke b,cnt*2,checkold_kana-0x60:else:wpoke b,cnt*2,checkold_kana
loop
new_kana=cnvwtos(b);UTF-16からUTF-8に変換
return new_kana
#global
#uselib "user32.dll"
#func SetWindowText "SetWindowTextW" int,wstr
title "ひらがな↔カタカナ 変換機"
font "メイリオ",16
objmode 2
buf="abcdefghijklmnopqrstuvwxyz\nあいうえお"
mesbox buf,640,450,,500
obj_hwnd=objinfo_hwnd(stat)
objsize 150,30
button gosub "カタカナへ",*katakana
pos 150,450
button gosub "ひらがなへ",*hiragana
stop
;objprm命令では反映されないため、代わりにWin32APIのSetWindowText関数を使用
*katakana
SetWindowText obj_hwnd,hiraganatokatakana(buf)
return
*hiragana
SetWindowText obj_hwnd,katakanatohiragana(buf)
return
スクリプトに誤りがあったので修正しておきます。
誤
#defcfunc katakanatohiragana str p1,int mojicnt
正
#defcfunc katakanatohiragana str p1
| |
|