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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0316
cmoritoshi別の命令で変数を返す?6解決


cmoritoshi

リンク

2015/3/16(Mon) 23:15:36|NO.67942

こんにちは。毎度お世話になっております。
いろいろ調べたり考えたりしたんですが、
頭が足りないので知恵をお借りできたらと思い質問します。

#deffuncで命令A,Bを作るとして、
命令Aで使用する変数を指定し、
命令Bでは処理をして命令Aで指定した変数に返す(あるいは書き換える)
ということをしたいのです。
noteselとnoteloadの関係が近いと思います。

どのようにしたら実現できるでしょうか。
よろしくお願いします。



この記事に返信する


Flat

リンク

2015/3/16(Mon) 23:22:11|NO.67943

dup命令を使うと変数のクローンが作成できます。
変数のクローンは互いに同期しており、クローンによって作成した変数を変更すると
クローン元の変数も同じように変更されるという特徴があります。
これで実現できるかと。

以下、テキトーなサンプルスクリプト。

#module #deffunc A var org dup alias, org // aliasとorgを同期させる return #deffunc B int p alias = p return #global var = 10 A var mes var B 20 mes var



cmoritoshi

リンク

2015/3/17(Tue) 12:50:12|NO.67952

Flatさん回答ありがとうございます

これでできるのはできるんですが、
命令Bで変数の拡張をする場合があります。
命令Aの時点でサイズが不明なのですが、
この場合はどうしたらよいでしょうか。



Flat

リンク

2015/3/17(Tue) 19:19:16|NO.67953

以下のようにすれば一応はできます。
が、安全性やメンテナンス性はあまり(ほとんど?)ありません。
ですので、別の方法に切り替えた方が良いかと思われます。
少し扱い方が特殊ですが、個人的にはモジュール変数を使用する方法がおすすめです。


// 変数の情報の取得、書き換えを行うモジュール // あまり安全な方法ではないかも #module #define SIZE_OF_PVAL 32 // 32Bit版ランタイムの場合は32、64Bit版ランタイムの場合は40(のはず) // 変数の管理情報のポインタを取得 #defcfunc get_pval var var, \ local pval_var mref pval_var, 0 return pval_var // 変数の管理情報を書き換えてクローンを作成する #deffunc clone_var var var, int pval, \ local pval_var, local val, local val_var mref pval_var, 0 dupptr val, pval, SIZE_OF_PVAL, 2 dupptr val_var, pval_var, SIZE_OF_PVAL, 2 memcpy val, val_var, SIZE_OF_PVAL return #global #module #deffunc A var org // 元の変数の情報を_aliasに入れておく // こうすることによっていつでも元の変数を変更できる様になる _alias = get_pval(org) // 元の変数のクローンを作成しておく // 元の変数を参照する際に必要となるため dup alias, org return #deffunc B int p // 拡張とかしてみる t = alias // 一度バックアップを取ってから dim alias, 4 // 変数を拡張して alias = p, p*3, t, t*3 // 代入する // オリジナルの変数に変更を反映させる clone_var alias, _alias return #global var = 10 A var mes var mes B 20 mes var(0) mes var(1) mes var(2) mes var(3)



レノス

リンク

2015/3/18(Wed) 15:59:50|NO.67960

note系命令はプラグイン(hpi)の方法で実装されています。
弱点はC++などのDLLを作成できる言語で書かなければいけないこと。(hsp hpi あたりでググるとでてくる)


特殊展開マクロを使うという手もあります。
弱点は noteunselに相当する命令が必須になることと、
notesel〜noteunsel の間でしか関連する命令を書けないこと、です。

#define global my_notesel(%1) %tmy_notepad %s1 \ if (vartype(%p) != 2) { sdim %p} #define global my_noteadd(%1) %tmy_notepad \ %p += "\n" + (%1) #define global my_noteunsel(%1) %tmy_notepad %o0 // サンプル my_notesel buf buf = "hello" my_noteadd "world" mes buf // hello\nworld my_noteunsel // 必須



KOMARI

リンク

2015/3/18(Wed) 21:39:45|NO.67971

どんな意図があって質問しているのかはわかりませんが、こんなのはどうでしょうか。

・モジュール内に1個データ格納用変数を用意し、命令Bはこの変数に対して操作を行う
・後でAを呼び、Aの引数に指定した"使用する変数"に上記の変数の内容をコピー(部分的に?)

これではだめですか?(・ω・)



cmoritoshi

リンク

2015/3/18(Wed) 23:13:55|NO.67975

みなさん回答ありがとうございます。
やはり難しいみたいなので、別の方法を考えることにします。
また、特殊展開マクロはまだ理解できていないので、勉強していくことにします。
みなさまありがとうございました。



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