HSP3에서 유파를 구현해 봅니다.

3450 단어 재료HSP유파

소개



원작자 : 자바로 유파를 구현해 보자 ​​- Qiita

각 언어판의 구현이 유행하고 있습니다만, 이제 열거할 수 없을 정도로 퍼져 버렸으므로 이쪽을 부디.
【매일 자동 갱신】유파파 LGTM 랭킹! - Qiita

이제 자신이 사용한 적이 있는 언어는 다 써버렸다… 라고 생각했습니다만 .
그래서 HSP3로 써 보았습니다. 이 자료를 원하기 때문에 HSP3.51을 설치했습니다.

15년 정도 만지지 않았던 적도 있어(당시는 HSP2.55라든지 2.6라든지…), 언어 사양이 바뀌거나 단순히 잊고 있거나 했기 때문에, 의외로 고생했습니다.

코드



Qiita는 HSP의 신택스 하이라이트를 지원하지 않는 것 같습니다. . .

yubaba.hsp
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var ; Windows API

    randomize                  ; 乱数シードの初期化
    screen 0, 1000, 400        ; ウィンドウサイズの指定
    font "", 24                ; フォントの指定
    objmode 2                  ; コントロールのフォントも変更する
    mes "契約書だよ。そこに名前を書きな。"
    name = ""
    input name, 500, 30, 30    ; テキストボックス作成
    objsize 100, 30
    button "送信", *clicked    ; ボタン作成
    stop
*clicked
    sdim nameUnicode, 64       ; 文字列バッファを初期化
    cnvstow nameUnicode, name  ; マルチバイト文字列操作のためUnicodeに変換
    mes "フン。" + name + "というのかい。贅沢な名だねぇ。"
    newNameIndex = rnd(lstrlenW(nameUnicode))
    sdim newNameUnicode        ; Unicodeベースで1文字取り出す
    memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
    newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
    mes "今からお前の名前は" + newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!"

실행 예



텍스트 상자에 이름을 넣고 "보내기"버튼을 누르면 유파가 대답합니다.

HSP (Hot Soup Processor)

코드주의(특히 멀티바이트 관련)



령화가 되면 HSP에서도 유니코드(UTF-16)는 당연히 사용할 수 있게 되어 있다고 생각했습니다만, 비교적 귀찮았습니다.
멀티바이트 문자를 고려하여 문자열을 잘라내려면 먼저 원하는 문자열을 유니코드로 변환합니다.
    cnvstow nameUnicode, name  ; 文字数操作のためUnicodeに変換

그런 다음 입력된 이름의 문자 수를 계산하여 가져올 문자의 인덱스를 선택합니다. 문자 수 카운트 부분에서 Windows API를 사용하고 있습니다.
    newNameIndex = rnd(lstrlenW(nameUnicode))

관련 :
lstrlenW 를 사용하기 위해서, 스크립트의 선두에서 이하와 같이 선언하고 있습니다.
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var

관련 : lstrlenW function (winbase.h) - Win32 apps | Microsoft Docs

그리고 선택한 색인으로 한 문자를 가져옵니다. 유니코드는 문자 당 2바이트이므로 문자 수와 원본 인덱스를 두 배로 합니다.
    memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2

여기서 strmid 를 사용하고 싶습니다만, 유니코드 문자열에서는 종단 이외에 NULL 문자(C언어로 말하는 \0 )가 나타나는 경우가 있기 때문에, 올바르게 동작하지 않습니다.

마지막으로, 가져온 문자를 일반 문자열로 되돌립니다.
    newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換

약속



이름을 넣지 않고 제출하면 떨어집니다. 원작 리스펙트
HSP3 프로그래밍 매뉴얼 「4.9. API 호출」

좋은 웹페이지 즐겨찾기