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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0216
kaiとにかく見てください(うまく説明できませんので)8解決


kai

リンク

2014/2/16(Sun) 21:19:29|NO.60043

変数を直接実行?するにはどうすればいいでしょうか?(意味わからないかもしれませんが、例を見てください)

例えば、テキストファイル(test.txt)から文字を読み込んでそれを直接実行したいんです!
テキストファイルにはdialog "あああ"と書いてあるとします。

notesel test noteload "test.txt" noteget test,0 test ;ここ!!
これを実行すると、エラーになってしまいます。
ここ!!のところをどう変えればいいのかがわかりません。
どうすればダイアログを表示させることができますか?



この記事に返信する


kai

リンク

2014/2/16(Sun) 21:33:44|NO.60047

あ、普通に実行すればいいじゃんって思うかもしれませんが、どうしても必要なのでおねがいです。



Tetr@pod

リンク

2014/2/16(Sun) 21:50:00|NO.60053

HSPには、そのように文字列の式を実行する機能がありません。
よって、「標準命令のみでは」実現不可能です。

ただし、http://hsp.tv/play/pforum.php?mode=all&num=59875で書いた
拙作のevalっぽいのを使えば、それっぽいのが実現できます。
使用する際はhttp://hsp.tv/play/pforum.php?mode=all&num=59837#59877
NO.59877とNO.59880の注意書きを「必ず」読んでください。

また、EVAL_TEMPSOURCEやEVAL_TEMPOBJFILE、EVAL_TEMPVARFILEを定義すると
一時ファイルの名前や場所を変更できます。


とりあえず、サンプルのソースコードです。


// HSPでevalっぽいの by Tetr@pod // eval "ソースコード" // でソースコードを実行します。 // 戻り値が0なら正常終了で、それ以外ならエラーが発生したことを示します。 // 実行時エラーの際戻り値が0になるのは、仕様です。 #ifndef mod_eval #cmpopt varname 1 #ifndef EVAL_TEMPSOURCE #define EVAL_TEMPSOURCE "eval_tmp.hsp" #endif #ifndef EVAL_TEMPOBJFILE #define EVAL_TEMPOBJFILE "eval_tmp.ax" #endif #ifndef EVAL_TEMPVARFILE #define EVAL_TEMPVARFILE "eval_tmp.var" #endif #module mod_eval #uselib "hspda.dll" #func _eval_vsave vsave $202 #func _eval_vload vload $202 #uselib "hspcmp.dll" #func _eval_hsc_ini hsc_ini 6 #func _eval_hsc_objname hsc_objname 6 #func _eval_hsc_comp "_hsc_comp@16" int, int, int, int #func _eval_hsc_bye hsc_bye $100 #uselib "hsp3imp.dll" #func _eval_hspini hspini 0 #func _eval_hspbye hspbye 0 #func _eval_hspprm hspprm 0 #func _eval_hspexec hspexec 0 #deffunc eval str e, local fname, local temp _eval_vsave EVAL_TEMPVARFILE@ sdim temp notesel temp temp = "#cmpopt varname 1\n#uselib \"hspda.dll\"\n#func _eval_vsave vsave $202\n#func _eval_vload vload $202\n#undef end\n#define end(%1=1) if %1{_eval_vsave\"" + EVAL_TEMPVARFILE@ + "\"}end@hsp\n_eval_vload\"" + EVAL_TEMPVARFILE@ + "\"\n" + e + "\nend" notesave EVAL_TEMPSOURCE@ sdim temp noteunsel _eval_hsc_ini EVAL_TEMPSOURCE@ _eval_hsc_objname EVAL_TEMPOBJFILE@ _eval_hsc_comp 0 if stat { delete EVAL_TEMPSOURCE@ delete EVAL_TEMPVARFILE@ return -1 } _eval_hsc_bye delete EVAL_TEMPSOURCE@ fname = EVAL_TEMPOBJFILE@ _eval_hspprm 0, 0, 0, 0 _eval_hspprm $102, 0, 0, varptr(fname) _eval_hspini $1, 640, 480, 0 if stat { delete EVAL_TEMPOBJFILE@ delete EVAL_TEMPVARFILE@ return -2 } _eval_hspexec _eval_hspbye delete EVAL_TEMPOBJFILE@ _eval_vload EVAL_TEMPVARFILE@ delete EVAL_TEMPVARFILE@ return stat #global #endif notesel test noteload "test.txt" noteget test, 0 eval test// testをeval testに変更する

使用する際は、
test ;ここ!!

eval test
に変更する必要があります。
(上のサンプルソースではすでに変更してあります)



あと、1つだけ重要な事を。
このような任意のソースコードが実行できる状態は、危険です。
ソースコードがネット上の第三者によって変更されるものでないなら
せいぜいプログラムの変数の読み書きがされる程度ですが、
サーバーからダウンロードする等の場合は、悪意ある第三者によって
ユーザーのコンピュータの
  1. 諸々が破壊される
  2. データが盗まれる
  3. 操作権を得られる
といったことが起こりかねないので、よく注意しておいてください。



KA

リンク

2014/2/17(Mon) 07:03:01|NO.60065

if test="dialog" : dialog

みたいな感じで文字列を命令に関連付けます。
いわゆるシナリオファイルと同じ考え方です。



通りすがりという者

リンク

2014/2/17(Mon) 17:17:10|NO.60068

#include "test.txt"
ではだめなのかい?



cats

リンク

2014/2/17(Mon) 21:03:03|NO.60073

hspcmpというプラグインがHSPにはあり、
記述した命令を実行したり、実行ファイルにしたりできます。

#include "hspcmp.as" sdim rtname,256 test = {"mes "text" title "Hello!""} //スクリプト記述 notesel test notesave "test2.hsp" fname="test2.hsp" objname="obj" hsc_ini fname hsc_objname objname hsc_comp 0 hsc3_getruntime rtname, objname if rtname="" : rtname="hsp3.exe" cmdexe = "\""+dir_exe+"\\"+rtname+"\" "+objname hsc3_run cmdexe, 0 delete "test2.hsp" delete "obj"



リンク

2014/2/19(Wed) 21:18:01|NO.60115

>>通りすがりという者さん
>>KAさん

HSPエディターのようなものを作っているのでは?



さくさく

リンク

2014/2/20(Thu) 16:50:06|NO.60142




kai

リンク

2014/2/25(Tue) 14:42:02|NO.60272

ありがとうございました!!

無事、解決しました。



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