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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0104
ヘビーHSPerどうしてHSPには構造体がないのですか?6解決


ヘビーHSPer

リンク

2015/1/4(Sun) 22:07:18|NO.66874

どうしてHSPには構造体がないのですか?
他の言語では、構造体や連想配列といった、
データをまとめる何らかの機能があるのが当たり前だと思います。
いくらスクリプト言語とはいえ、そういった機能が全くないのは時代遅れすぎませんか?

もしもそういった機能を実装するなら、
HSPはその性質上、他のスクリプト言語と違って、
Win32APIを呼び出す機会が多いので、C言語とコンパチな構造体を定義できる機能がほしいですね。
できればC言語用のヘッダを読み込んで、自動で構造体と定数が定義されるといいですね。



この記事に返信する


cats

リンク

2015/1/4(Sun) 22:32:35|NO.66877

どちらについても同じように思います。
構造体 -> 配列変数でとりあえずは可能
連想配列 -> なくても大丈夫
みたいな感じじゃないでしょうか。

連想配列の方についてはいつサポートしてもおかしくない状況だと思います。
実際、HSP付属のマニュアルには

変数の型が連想配列をサポートしている場合には、要素として整数値以外を指定することができます。 ; 例 a("test")=10 ; 変数aの要素"test"に10を代入 a(5.5)=20 ; 変数aの要素5.5に20を代入
と書いています。
コンパイラのコード内でも、少し変えれば連想配列を使えるようにはなっているようです。
http://trdrgod.blog.shinobi.jp/hsp/%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%82%92%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AE%9F%E8%A3%85-clhsp-



tds12

リンク

2015/1/4(Sun) 23:55:49|NO.66880

>どうしてHSPには構造体がないのですか?
正確なところはおにたまさんにしかわからないと思いますが、
私の解釈としては、
「HSP3概要」の
「思った順番に書いてもいい気軽さ」
と、C言語の構造体のような、宣言して定義して初期化するという
順番が限られることが、両立しにくいからだと思います。

>データをまとめる何らかの機能があるのが当たり前だと思います。
確かに、実行ファイルができるような言語では、その機能がないものが思いつきません。
無い言語を上げるとしたら、
Brainf*ck、Ook!、Pxem、Grass、ほむほむ、天使ちゃんマジ天使、KQ
などでしょうか。
「モジュール変数の定義」の部分に書かれている
「複数の変数やデータをまとめて管理することができる」
というのは、その機能には含まれませんか?

>そういった機能が全くないのは時代遅れすぎませんか?
HSPの目指すものが、「オールドスタイルなパソコンのシステム」
なので、事実でも問題ではないと思います。

>もしもそういった機能を実装するなら
気軽に作れるのがHSPなので、ヘビーHSPerなら
自ら作ってしまってもよいと思います。
私もちょうど、クラスをHSPで扱うためのモジュールを作っているため、
ついでに構造体も作ろうとしています。
期待していてください。

>Win32APIを呼び出す機会が多いので
たしかに多いですね。
ほかの言語で何かするよりも、ずっと低レベルなウィンドウズの知識が、嫌でも付きます。

>C言語とコンパチな構造体を定義できる機能
HSPと(宣言を伴った)定義は、なかなか合わない気がします。
多言語を気にせず、独自の実装方法ならあり得なくもない気がします。

>できればC言語用のヘッダを読み込んで、自動で構造体と定数が定義されるといいですね。
便利そうな機能だと思います。
そんなツールがなかったら作ってみるチャンスですね。

>コンパイラのコード内でも
コンパイラとしてはもとから対応していると思います。
(COMなど)
そのページで示されているのは、
プラグインのコードだと思います。



ヘビーHSPer

リンク

2015/1/5(Mon) 04:54:59|NO.66881

tds12さんへ

>「モジュール変数の定義」の部分に書かれている
>「複数の変数やデータをまとめて管理することができる」

モジュール機能はマルチプルインスタンスに対応しているのでしょうか。



tds12

リンク

2015/1/5(Mon) 22:44:41|NO.66889


#module mod a,b,c #modinit a = 3 b = "三" c = 3.14 return #modfunc show mes "" + a + "\n" + b + "\n" + c return #modfunc seta int _in a = _in return #modfunc setb str _in b = _in return #modfunc setc double _in c = _in return #modcfunc geta return a #modcfunc getb return b #modcfunc getc return c #global //インスタンス1生成 newmod inst1,mod //インスタンス2生成 newmod inst2,mod //インスタンス1を表示 show inst1 mes "" //インスタンス2のbを変更 setb inst2,"π" //インスタンス2を表示 show inst2 mes "" //インスタンス1の内容は変わっていない show inst1
このように、複数のインスタンスを作ることができます。



ウ二トゲ

リンク

2015/1/6(Tue) 03:45:03|NO.66894

自分はint 型配列変数を使って。

#ifndef MENUINFO_STRUCTSIZE #enum global minfo_cbSize = 0 ; 構造体のサイズ #enum global minfo_fMask ; どの値が有効かを示すフラグ。 #const global MIM_MAXHEIGHT $00000001 // cyMax #const global MIM_BACKGROUND $00000002 // hbrBack #const global MIM_HELPID $00000004 // dwContextHelpID #const global MIM_MENUDATA $00000008 // dwMenuData #const global MIM_STYLE $00000010 // dwStyle #const global MIM_APPLYTOSUBMENUS $80000000 // 設定は全てのSubメニュー メニューに適用されます #const global MIM_OPEN $000003C1 #const global MIM_CLOSE $000003C2 #const global MIM_DATA $000003C3 #const global MIM_LONGDATA $000003C4 #const global MIM_ERROR $000003C5 #const global MIM_LONGERROR $000003C6 #const global MIM_MOREDATA $000003CC #enum global minfo_dwStyle ; メニューのスタイル。 #const global MNS_CHECKORBMP $04000000 // 同じ空間には、チェック マークとビットマップの予約されています。 ; チェック マークが描かれている場合は、ビットマップではありません。 ; すべてのチェック マークとビットマップが配置されます。 ; チェック マークのいくつかの項目を使用し、いくつかのビットマップを使用してメニューを使用します。 #const global MNS_NOTIFYBYPOS $08000000 // ユーザーが選択すると ; WM_COMMAND メッセージの代わりに WM_MENUCOMMAND メッセージを受信します。 ; MNS_NOTIFYBYPOS は ; メニューの ヘッダーのスタイルであり、個々 のサブ メニューに適用した場合の影響を与えません。 #const global MNS_AUTODISMISS $10000000 // メニューは、マウスが 約10 秒、メニュー以外の場所にあるときに自動的に閉じます。 #const global MNS_DRAGDROP $20000000 // メニュー項目を、ドラッグ&ドロップ出来るようになります。。 ; メニューのオーナー WM_MENUDRAG と WM_MENUGETOBJECT のメッセージを受信します。 #const global MNS_MODELESS $40000000 // メニューがモードレスです ; は、ないメニュー モーダル メッセージ ループ メニューがアクティブな間。 #const global MNS_NOCHECK $80000000 // チェック マークを項目の左側の領域が予約されていません。 ; まだ、項目を選択できるがアイテムの横にチェック マークは表示されません。 #enum global minfo_cyMax ; 最大の高さ (ピクセル単位) メニュー。 メニュー項目が使用可能な領域を超えると、スクロール バーが自動的に使用されます。 ; デフォルト (0) は、画面の高さです。 #enum global minfo_hbrBack ; メニューの背景に使用するブラシへのハンドル。 #enum global minfo_dwContextHelpID ; ヘルプのコンテキスト ID。 これは、GetMenuContextHelpId と SetMenuContextHelpId 関数で使用される同じ値です。 #enum global minfo_dwMenuData ; アプリケーション定義の値。 #enum global MENUINFO_ELETOTAL #const global MENUINFO_STRUCTSIZE MENUINFO_ELETOTAL*4 #endif #if 0 typedef struct tagMENUINFO { DWORD cbSize; DWORD fMask; DWORD dwStyle; UINT cyMax; HBRUSH hbrBack; DWORD dwContextHelpID; ULONG_PTR dwMenuData; } MENUINFO, *LPMENUINFO, const *LPCMENUINFO; dim mi , MENUINFO_ELETOTAL mi.minfo_cbSize = MENUINFO_STRUCTSIZE mi.minfo_fMask = 0 mi.minfo_dwStyle = 0 mi.minfo_cyMax = 0 mi.minfo_hbrBack = 0 mi.minfo_dwContextHelpID = 0 mi.minfo_dwMenuData = 0 #endif #if 1 /////////////////////////////////////////////////////////////////////////////////// #include "user32.as" #include "gdi32.as" onexit *exit #const global HS_BDIAGONAL $00000003 #const global HS_CROSS $00000004 #const global HS_DIAGCROSS $00000005 #const global HS_FDIAGONAL $00000002 #const global HS_HORIZONTAL $00000000 #const global HS_VERTICAL $00000001 CreateHatchBrush HS_FDIAGONAL , 0xffcccc hCrossBrush = stat #enum global mid_test = 1 #enum global mid_testB #enum global mid_testC CreatePopUpMenu : hMenu(1) = stat repeat 5 AppendMenu hMenu(1) , 0 , mid_test , "テスト"+cnt loop CreateMenu : hMenu = stat AppendMenu hMenu , 0x10 , hMenu(1) , "menu" #const mask MIM_STYLE | MIM_APPLYTOSUBMENUS | MIM_BACKGROUND dim mi , MENUINFO_ELETOTAL mi.minfo_cbSize = MENUINFO_STRUCTSIZE , mask , MNS_NOCHECK //mi.minfo_fMask = mask //mi.minfo_dwStyle = MNS_NOCHECK //mi.minfo_cyMax = 0 mi.minfo_hbrBack = hCrossBrush //mi.minfo_dwContextHelpID = 0 //mi.minfo_dwMenuData = 0 SetMenuInfo hMenu , varptr(mi) SetMenu hwnd , hMenu DrawMenuBar hwnd // gsel 0,2 stop *exit DeleteObject hCrossBrush DeleteObject hBrush end #endif
の様にしています。



科学太郎

リンク

2015/1/11(Sun) 01:31:47|NO.66934

> どうしてHSPには構造体がないのですか?
初心者向けだからでしょう。

> いくらスクリプト言語とはいえ、そういった機能が全くないのは時代遅れすぎませんか?
わざと時代遅れのBASIC風から作成してるからでしょうね。
でもユーザ定義命令(関数)を用意して機能UPを図ってますね。

> Win32APIを呼び出す機会が多いので、C言語とコンパチな構造体を定義できる機能がほしいですね。
C/C++言語を知ってるのならば、そちらを使えばよいことでしょうね。
ただし、配列の参照でドット演算が使えるので「構造体ぽい」表現は可能です。
ウ二トゲさんのような感じです。

しかし、この方法では一部バグがあるらしいです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=58681

> できればC言語用のヘッダを読み込んで、自動で構造体と定数が定義されるといいですね。
とりあえずasファイルを作れば解決します。(面倒ですが)



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