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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1015
ゆうやんひらがなからカタカナ、カタカナからひらがなに変換したい4解決


ゆうやん

リンク

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



この記事に返信する


X

リンク

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



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