1 名前:名無しさん@お腹いっぱい。 [2015/11/11(水) 13:45:28.80 ID:+oPzgSay0.net] Windowsの作業を自動化するツール フリーソフト版とシェアウェア版の2種類がある ttp://www.uwsc.info/download.html ●UWSC 掲示板(※作成依頼掲示版ではありません) 質問の際には自力で作ったスクリプトを晒すか、具体的な解らない場所を提示すること 上級者が常駐、たまに作者も現れるため過去ログには有益情報の宝庫 www3.rocketbbs.com/13/bbs.cgi?id=umiumi www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=past ●UWSC - Wikipedia ja.wikipedia.org/wiki/UWSC ●使い方・基礎解説学習サイト uwsc.g.hatena.ne.jp/cx20/20100131/1264938584 www.confrage.com/uwsc/ necro.jp/dev/uwsc/ park14.wakwak.com/~simizu/uwsc/fruwsc.html canal22.org/ big.tm.land.to/handbook/uwsc.htm www.game-rev.com/review/gameut/uwsc.html ●スクリプトテンプレサイト izagne.com/uwsc/ scripts.web.fc2.com/ www.nagomi-jp.net/~liners/ nem.symphonic-net.com/uwsct/0610uwsct.html siromasa.digi2.jp/uwsc/ iriyak.adam.ne.jp/uwsc.html 前スレ 自動化ツールUWSC使いよ集まれ15 anago.2ch.net/test/read.cgi/software/1436671958/
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 01:03:00.84 ID:VsiPttLF0.net] 単純にスコープの管理が甘いと思う 広いスコープの変数なら「何を保持しているのか」が中心にした方が良い UWSCはクラスのインスタンスを作れないから オブジェクト指向的に変数を管理し難いのが難点だよね それでも自分はある程度の規模のスクリプトならクラスを造って変数を管理するけれどね
467 名前:429 mailto:sage [2016/02/01(月) 01:45:10.84 ID:+rnmEAjm0.net] >>438 そういうものがあるのか 関数まとめて別ファイルに入れてこっちで呼び出して……みたいなことやってるからちょうど良さそう オブジェクト指向と言う名前は聞いたことある、程度の初心者だけど、いい機会だから勉強してみるよ ありがとう
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 02:55:35.27 ID:BoGYQ2nB0.net] 名前が決まらないのはその目的(責務)が明確になってないのが原因でもある
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 08:25:33.84 ID:8RvGbPw20.net] 未熟な自分では考えてもできなかったのでご教授ください t=
470 名前:GETTIME() While True ifb CHKIMG("A.bmp") sleep(1.0) BTN(LEFT, CLICK, G_IMG_X, G_IMG_Y) t=GETTIME() else (中略) ifb CHKIMG("H.bmp") sleep(1.0) BTN(LEFT, CLICK, G_IMG_X, G_IMG_Y) t=GETTIME() else ifb ((GETTIME()-t)>3) Then BTN(LEFT,CLICK,100,100,0.5) t=GETTIME() endif (中略) endif sleep(0.1) WEND これらを実行する時 ifb CHKIMG("A.bmp") BTN(LEFT, CLICK, G_IMG_X, G_IMG_Y) t=GETTIME() に限り「画像Xがある時のみ行う」としたいのです 全てに対してとするならできたのですが1つ目文に対してのみというのができなくて詰まってしまいました [] [ここ壊れてます]
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 09:04:45.92 ID:g7iI5XSU0.net] if X and A elseif !A endif
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 09:33:11.94 ID:pZZgy3PS0.net] ifb CHKIMG("X.bmp") AND CHKIMG("A.bmp") こんだけのことやんけ
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 15:18:36.89 ID:hzvm75kL0.net] option shortcircuit付けてな
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 16:00:59.79 ID:Th0k4/oZ0.net] 本体のホットキーを使わずに一時停止をやりたいんですけど こんな感じの関数を随所随所で呼び出すしかないんでしょうか? PROCEDURE ESC_PAUSE IF !GETKEYSTATE(VK_ESC) then exit SLEEP(0.1) REPEAT SLEEP(0.1) UNTIL GETKEYSTATE(VK_ESC) SLEEP(0.1) FEND
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 16:12:58.29 ID:hzvm75kL0.net] 使わずにっていうのは、本体の一時停止をやりたくないのか それとも本体に設定されたホットキー以外のキーで一時停止したいのか どっち?
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 17:12:39.88 ID:Th0k4/oZ0.net] 本体の一時停止ホットキーは、2つ以上のキーで面倒なのと スクリプト内でやれば、好みの条件に出来るかなと思いまして たとえば、マウスカーソルの位置とか PROCEDURE MOUSE_PAUSE IF G_MOUSE_X<1000 then exit Repeat SLEEP(0.1) Until G_MOUSE_X<1000 FEND
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 17:20:38.17 ID:Th0k4/oZ0.net] あと、本体の一時停止ホットキーは 本体から動かしてるスクリプトには有効ですが ランチャー等から起動した別のスクリプトには無効みたいです
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 17:38:04.47 ID:PbXPJngC0.net] >>447 停止処理はSETHOTKEYで呼び出し 停止処理からの復帰は停止処理内でGETKEYSTATE dim i sethotkey(VK_A,,"proc_Pause") while true i= i+1 fukidasi(i) sleep(0.5) wend procedure proc_Pause() repeat sleep(0.5) until GETKEYSTATE(VK_ESC) fend aで処理中断 escで中断からの復帰 中断復帰後は中断時の処理から続いてる事も確認できる sethotkeyでコードの頭に登録すればそれ以降の処理内で一々中断用のコード書かなくてもいいから保守性も高いよ
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 17:41:43.95 ID:hzvm75kL0.net] UIが無い別プロセスのスクリプトにも有効なのは有効だよ。 ただ、2つ以上のスクリプトが動作してると、キーが消費されちゃうので 連打するとか押しっぱなしにするとかしないと効かない。 あーでも一時停止は連打はダメか。 停止のホットキーは押しっぱなしで全プロセス停止に効く。 本体を一時停止してもいいなら、SETHOTKEYで任意のキーを押した時に UWSC本体に一時停止のホットキーを送るってのもありかと。 あと停止はループさせるよりMSGBOXとか出す方が便利とは思うが。
480 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/01(月) 21:11:01.64 ID:Th0k4/oZ0.net] レス、ありがとうございます >>449 おぉー、ホットキーを設定するやり方ですか 仮想キー限定のようですが、これはいい方法ですね >>450 MSGBOXを使うと、解除がちょっと面倒なんで・・・ あと、UWSC本体を起動せず 下記スクリプトをショートカットから実行した場合 一時停止ホットキーは機能しませんでした for j=1 to 10000 fukidasi(j) SLEEP(0.5) next
481 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/02(火) 07:05:55.13 ID:Mf47p9PS0.net] >>451 ttp://uproda.2ch-library.com/916238SO2/lib916238.uws 俺はこんな感じでやってる 実際に使うときはウィンドウ指定してアクティブ時にキーチェック
482 名前:オてる [] [ここ壊れてます]
483 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 13:22:20.05 ID:bYNIn2Du0.net] Google Speech API と組み合わせて音声入力させるものって作れるかなあ?
484 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 14:03:46.64 ID:fyQC3oxA0.net] すみません、UWSCってこのスレで初めて知ったんですが、業務で利用されてる方いらっしゃいますか?
485 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 15:21:36.98 ID:ja3vwQ+v0.net] いますよー
486 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 17:34:50.27 ID:cVw67MCx0.net] 詰まったので質問させて下さい。 現在BluestacksとUWSCを使用して自動マクロを運用しています。 また、離籍時にteamviewerを使用してリモートで操作もしています。 相対座標を使用し、通常は問題なく使えるのですが teamviewer使用時が問題で、セッション終わり毎にダイアログが発生し、そのせいでループが抜けなくなり手間が増えている状態です。 質問なのですが id=GETID("Bluestacks App Player","WindowsForms10.Window.") MOUSEORG(id, MORG_DIRECT) 上記のように指定しても画像検索はできますが座標がおかしくなってまともに動きません。 座標を直接指定しても、画像の場所に直接クリックにしても常に左上の端のみをクリックする状態となっています。 どのように指定をすればいいでしょうか?
487 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 18:42:53.73 ID:Ml8C21Ff0.net] mouseorgは通用するアプリとしないものがあると何度いわれたらry
488 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 19:06:31.07 ID:zrOVrXZR0.net] >>456 teamviewer昨日導入したわ。タイムリーな。ツムツムかな? 俺はダイアログ消す方で解消したわ。 UWSCのスケジュールの指定ウィンドウが現れた時で、ダイアログを消すスクリプト登録したらいい感じ。
489 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 19:21:35.52 ID:cVw67MCx0.net] >>457 ありがとうございます。 自分では通用するのかどうかがわからなかったのと、画像検索はできたので方法があるのかと思い聞いてみました。 申し訳ありませんでした。 >>458 そうだったんですね。 俺は別のゲームです。 プログラミング初心者の為勉強しながらになりますが頑張って組んでみます。 ありがとうございます。
490 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 19:25:47.32 ID:I350w/WA0.net] >>456 MORG_DIRECTをMORG_CLIENT変える
491 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 21:48:42.30 ID:DIbZWkUk0.net] BTN(LEFT,CLICK,1200,150,150) と BTN(LEFT,CLICK,1000,150,150) どちらかランダムで一つクリックさせたい場合ってどうやればいいですか?
492 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 21:57:51.63 ID:EqtNr8zt0.net] ランダムで分岐させたら良い
493 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 22:23:24.65 ID:4BmdWrRw0.net] >>461 BTN(LEFT,CLICK,1000+RANDOM(2)*200,150,150)
494 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 23:36:39.04 ID:bosOw8Gy0.net] 整数化しないとひどいことになりそう
495 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/04(木) 23:42:01.07 ID:EqtNr8zt0.net] 個人的には速度や短さを競うコードコンテスト以外では 結果的にやりたいことになるコードではなく やりたいことをそのままコードにした方が良いと考えるかな メンテで正しく動作しなくなる種になるからね
496 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 00:29:23.88 ID:Gg6PibGB0.net] >>460 今ってbluestacksをバックグラウンドで動かせるようになったの?
497 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 02:27:59.12 ID:AORidpJX0.net] >>463 ありがとうございます
498 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 02:37:46.36 ID:/HWKBYw70.net] プログラミングのプの字も知らないけどUWSCで初挑戦中 画像認識でAの画像が出るまでBの操作を繰り返す Aが出たらその画像をクリックしてCの操作へ これはrepeat-untilでいいですか?
499 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 04:19:16.20 ID:i6SfBH8K0.net] いいよ(´・ω・`) とにかく自分で書いて試してみるのが上達の近道
500 名前:だよ あとUWSCの本があるからブックオフで見かけたら買うといいよ [] [ここ壊れてます]
501 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 06:07:19.13 ID:/HWKBYw70.net] ありがとうございます 色々調べ回って393のような形で処理に成功しました これを順不同にするにはどうしたらいいでしょうか a,b,cの画像を出てきた順にクリックしたいとして repeat sleep(0.2) until chkimg("a.bmp")=true or chking("b.bmp")=true or chking("c.bmp") btn(left,click,g_img_x,g_img_y) これを3つ羅列するとできると思うんですが 長ったらしくなるのでこれをスマートに収めるにはfor〜nextで挟めば大丈夫でしょうか
502 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 09:15:41.63 ID:YVt32lCs0.net] ツムツムはMORG_DIRECT使えますか?
503 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 09:18:42.14 ID:AKW1xg3y0.net] >>460 ありがとうございます。 試してみましたが、バックグラウンドで動くわけではないのですね。 リモートする際はchromeのリモートデスクトップ使用でダイアログに邪魔される事もなくなりましたのでこのまま使用していきます。
504 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 12:28:03.94 ID:/waBKm5O0.net] >>470 それ一つで動作するが OPTION SHORTCIRCUITを設定しない標準状態だと g_img_x,g_img_yの中にchking("c.bmp")の結果しか入らないので これを設定する
505 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/05(金) 18:09:16.28 ID:YVt32lCs0.net] 使えませんでした
506 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 13:49:52.63 ID:E2a0obR10.net] >>470 散々既出だけど、画像があればクリックしてTRUEを返すCLKIMG関数を自作する。 while true clkimg(
507 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 13:57:39.57 ID:E2a0obR10.net] なんかカキコが壊れた。 clickImage uwsc でググると過去スレに自作例が出てくるな。 while true ifb clickImage("1.bmp") then //1のクリックに成功した時の処理 endif ifb clickImage("2.bmp") then //2のクリックに成功した時の処理 endif ifb clickImage("3.bmp") then //3のクリックに成功した時の処理 endif wend ごく基本的な構造化なのでまだ早いとかやめてね…
508 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 14:00:17.77 ID:E2a0obR10.net] クリック後に個別の処理が不要なら clickImage("1.bmp"); clickImage("2.bmp"); clickImage("3.bmp") で済んじゃう
509 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 21:35:39.00 ID:4Jvgc2PX0.net] かなり初歩的な質問なのですが調べてもあまり分からなかったので質問させて頂きます。 UWSCでログファイルが更新され続ける拡張子がtxtなどのファイルを監視し、目的のログが現れた場合 キーを送信 ってできますでしょうか? やり方を教えて頂きたいです。
510 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 22:15:37.28 ID:k3CjFpd40.net] ・日本語をきちんと使えるようにする ・UWSCを勉強する たったこれだけで実現できるようになるよ あとは君の努力次第だから頑張ってね
511 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 22:35:58.37 ID:0QAMOn/70.net] シェアウェア版って結構高いねそれでも業務に使える?一台に一ライセンス必要みたいだけど
512 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 22:47:44.53 ID:sPS5RQrH0.net] >>480 何度もバカなの?
513 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/06(土) 22:57:49.59 ID:2YduAXx90.net] >>478 質問がごちゃごちゃし過ぎで、丸投げしたいようにしか見えない どのように監視できないのか どのようにログの検索ができないのか どのようにキー送信ができないのか
514 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 00:40:38.55 ID:puxzTe8g0.net] >>456 これに便乗なんだけど MORG_DIRECTで動作するAndroidのエミュレータってありますか?
515 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 06:08:59.16 ID:I92VPPhw0.net] uwscって自由すぎて逆に戸惑うことが多くね? TOTAL = MYCALC(300,400) //計算結果を出力 PRINT TOTAL FUNCTION MYCALC(VAL1, VAL2) ADD = VAL1 + VAL2 RESULT = ADD FEND ------------------------------------------------- PRINT MYCALC(300,400) FUNCTION MYCALC(VAL1, VAL2) ADD = VAL1 + VAL2 RESULT = ADD FEND PRINT文にFUNCUTION関数直接書いても出力されるんだな
516 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 06:13:42.80 ID:mZHgAHcI0.net] 関数の引数に関数を入れるのは普通 出来ない言語の方が珍しい
517 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 06:14:43.21 ID:oQyphb55
] [ここ壊れてます]
518 名前:0.net mailto: >>481 そう、パかなの。一台に六千円てことは百台で六十万てことでしょ? exe化したらライセンスフリーってことはexe化したもなのなら配布自由ってことか、配布したPC全部にライセンスいるのかの思ったよ。やっぱり馬鹿だったんだな俺 [] [ここ壊れてます]
519 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 07:45:41.55 ID:JTReqb1J0.net] 気づけてよかったね
520 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 07:48:35.49 ID:TPGZWfB40.net] 今までで割引キャンペーンとかってやったことある? やってくれれば買うんだけどな
521 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 12:25:34.39 ID:DbLS0yGv0.net] 関数の引数に関数を入れる、が関数ポインタとかラムダ式、リスナクラスの話に聞こえてちょっとビックリしたw
522 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 12:30:27.93 ID:UmG8NUOx0.net] あっしには何を言ってるのかさっぱり
523 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 15:28:50.99 ID:cJXx45gX0.net] >>487 気付かせてくれてありがとう
524 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 19:18:51.61 ID:I92VPPhw0.net] >>485 そうなんだ、知らなかった 教本みたいなサイトって丁寧に関数書くから 他人のコード見た時に「なんだこれ!」ってなってびっくりしたわ ついでに聞きたいんだけどさ --------------------------------------------------------------- クリック("ボタン")// FUNCTION クリック(name) IFB CHKIMG(name + ".bmp",0) BTN(LEFT,CLICK,G_IMG_X,G_IMG_Y) KBD(VK_a,CLICK) ENDIF RESULT FEND ------------------------------------------------------------- こうやってCHKIMGの画像ファイル名を関数の引数?を使って好きに変えれるようにしたんだけど 同じようにKBD(VK_a,CLICK) のVK_aの部分も変えられるように出来ないかね?
525 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 19:28:24.73 ID:mZHgAHcI0.net] VK_Aとかは定数だから変数に入れたり計算させても大丈夫だよ 例えば VK_A + 1 と VK_B は同じだったりとかね
526 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 19:34:53.46 ID:I92VPPhw0.net] へー、面白いな 今やってみたら出来たよ ありがとう
527 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 19:48:58.52 ID:C1KScm550.net] コードが難読化するからコーディング規約で禁止してるところも多いけどまぁ便利だよね
528 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/07(日) 20:25:57.04 ID:Op3LiiL10.net] そもそも関数という形はそういう書き方をするためのものだろう。 受け取るだけの変数を毎回経由するなら戻り値なんて機能は不要だし。
529 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 17:06:48.25 ID:T9ZC/Zyz0.net] 質問したい A処理 └B処理 └C処理 という感じの処理があって、これをFUNCTION ABC()にまとめた ABC(Aへの引数) と書くとCまで行くようになっている だけどA処理を飛ばしてB処理の部分を利用したいこともある AB飛ばしてC処理をしたい時もある そういう場合にABC(0,Bへの引数,0)やABC(0,0,Cへの引数)と書けば処理ができるように作ってみたんだけど これ以外に簡便なやり方って無いかな? i.imgur.com/TdIP4wY.jpg ------------------------------ FUNCTION ABC(Aへの引数,Bへの引数,Cへの引数,戻り値) RESULT = False |IFB !Aへの引数=0 | (A) 処理 |ELSE | |IFB !Aへの引数=0 | | (B) Aの値を継承して処理 | |ELSE | | (B') Bへの引数を使って処理 | | |IFB !Aへの引数=0 | | | (C) Bの値を継承して処理 | | |RESULT = True | | |ELSEIF Aへの引数=0 and !Bへの引数=0 | | | (C') B'の値を継承して処理 | | |RESULT = True | | |ELSEIF Aへの引数=0 and Bへの引数=0 | | | (C'') Cへの引数を使って処理 | | |RESULT = True | | |ELSE | | |RESULT = False | | |ENDIF | |ENDIF |ENDIF FEND ------------------------------
530 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 17:56:33.03 ID:uvOD7Pon0.net] 引数以外の継承したい変数をPUBLICにするとか参照渡しにして ABC各処理を別関数に 関数A 関数B 関数C ABC全部処理する関数ABC BとCだけ呼ぶ関数BC みたいに呼べばいいんでないの
531 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 17:58:10.02 ID:657cwzrg0.net] ・継承という用語はプログラミングにおいて特別な意味を持つので別の表現を使うべし。 ・サンプルプログラムの条件分岐に既に無意味な部分がありどうしたいのかが読み取れない。 今の状態だと
532 名前:7,11-12行目は絶対に実行されない。 ・引数第4項が戻り値であるにもかかわらずvar宣言がない、関数内でも使われていない。 実行され得ない部分を削って最適化するとこんな感じ。やっぱり意図がわからない。 FUNCTION doABC(Aへの引数, Bへの引数, Cへの引数) RESULT = False IFB !Aへの引数=0 doA(Aへの引数) ELSE doB(Bへの引数) IFB !Bへの引数=0 doC(Bへの引数) ELSE doC(Cへの引数) ENDIF RESULT = True ENDIF FEND [] [ここ壊れてます]
533 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 17:58:53.91 ID:657cwzrg0.net] 要件ベースでまとめると、 (1) Aへの引数のみ指定すると、doA(Aへの引数), doB(Aへの引数), doC(Aへの引数) の順で実行 (2) Bへの引数のみ指定すると、doB(Bへの引数) のみ実行 (3) Cへの引数のみ指定すると、doC(Cへの引数) のみ実行 解1 関数 doA(paramA), doB(paramB), doC(paramC) を定義し、 関数 doABC(paramABC) 内で上記関数を使用する。 (1)はdoABC(Aへの引数) , (2)はdoB(Bへの引数) , (3)はdoC(Cへの引数) を実行する。 解2 各ケースをあくまで一つの関数にまとめ、引数の指定の仕方のみで制御したい場合。 PROCEDURE doABC(Aへの引数, Bへの引数, Cへの引数) RESULT = False IFB !Aへの引数=0 doA(Aへの引数); doB(Aへの引数); doC(Aへの引数) ELSE IFB !Bへの引数=0 doB(Bへの引数) ELSEIF !Cへの引数=0 doC(Cへの引数) ENDIF ENDIF FEND メリットは特に無い。
534 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 18:43:19.51 ID:T9ZC/Zyz0.net] >>498-500 ありがとう >>500 ごめんなさい、勘違いしてた 関数の中に関数入れて呼び出すとエラーになる気がしてたけど違ったみたい 素直に解1の方法でやります
535 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 19:45:49.25 ID:y9zJENvU0.net] hashtbl lists lists["あ"] = "a10 a20 a30" lists["い"] = "b100 b200" lists["う"] = "c1 c2 c3 c4" //上記の場合3*2*4=24通りの全組み合わせを出力するprintCombination //あ=a10, い=b100, う=c1 //・・・ //あ=a30, い=b200, う=c4 printCombination(lists) procedure printCombination(lists[]) product = 1 for key in lists product = product * length(split(lists[key])) next for i = 0 to product - 1 q = i hashtbl outHash for key in lists values = split(lists[key]) r = q mod length(values) q = int(q / length(values)) outHash[key] = key + "=" + values[r] next print join(outHash, ", ") next fend
536 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 19:54:28.61 ID:y9zJENvU0.net] 質問です printCombinationという関数を書いてみたんですが、 もっとスマートな方法ないでしょうか? やりたいことはコメントに書いてあるとおりです すべての組み合わせを出力したい(もちろん別の組み合わせでも動くような感じで)
537 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 20:28:28.46 ID:KECwy5hV0.net] これじゃいかんのか? DIM ary1[2] = "a10","a20","a30" DIM ary2[1] = "b100","b200" DIM ary3[3] = "c1","c2","c3","c4" for a1 in ary1 for a2 in ary2 for a3 in ary3 print a1 + a2 + a3 next next next どうしてもハッシュ使いたいなら上の三行で配列宣言したあとにハッシュリストからsplit使って配列にぶっこめばええんちゃうん
538 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 22:06:55.05 ID:7q7uQHpo0.net] 帰宅中に松屋で飯食いながら考えた。 hashtbl lists lists[
539 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 22:09:05.76 ID:7q7uQHpo0.net] 帰宅中に松屋で飯食いながら考えた。 hashtbl lists lists["あ"] = "a10 a20 a30"; lists["い"] = "b100 b200"; lists["う"] = "c1 c2 c3 c4" const SPLT_V = " "; const SPLT_R = "<#CR>"; const SPLT_C = ", " print structCombinationCSV(lists, 1) function structCombinationCSV(lists[], cu
540 名前:rLv) key = lists[curLv-1, HASH_KEY] curRows = split(lists[curLv-1, HASH_VAL], SPLT_V) combinationCSV = "" ifb curLv >= length(lists) then for curIdx=0 to length(curRows)-1 combinationCSV = combinationCSV + key + "=" + curRows[curIdx] + SPLT_R next else childRows = split(structCombinationCSV(lists, curLv+1), SPLT_R) for curIdx=0 to length(curRows)-1 for childIdx=0 to length(childRows)-1 combinationCSV = combinationCSV + key + "=" + curRows[curIdx] + SPLT_C + childRows[childIdx] + SPLT_R next next endif result = combinationCSV fend っしゃぁ! [] [ここ壊れてます]
541 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/08(月) 22:29:31.74 ID:kO8wU/DR0.net] 500 Internal Server Error
542 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 00:41:55.44 ID:l/ELWwG70.net] 複雑すぎワロタ
543 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 10:19:05.55 ID:dxLnf7NN0.net] 松屋で飯食いながら仕事ができるタイプか
544 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 12:33:29.38 ID:qpHYw0y/0.net] すげえレベル高いな
545 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 12:40:47.60 ID:kzjhglVU0.net] えっ!?あのお客さん…ウチで飯食いながらコーディングしてる!?
546 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 12:47:42.64 ID:XfpXz+/C0.net] >>504 それだと関数化するとき困るんじゃね? ary2までしかないときは動かないし ary4まであってもちゃんと動かない
547 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 17:31:23.26 ID:FV1/KP6n0.net] >>506 は入れ子になってるくり返しで使われる再帰処理だね。 再帰を終わらす終了条件が最初あって、次にやりたい事ってふうに見ると分かる。
548 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 18:04:46.21 ID:+8zDwgB90.net] そっか項目数だけじゃなく要素数も変わるのか なら関数化するならこんな感じかな //配列組み合わせ生成関数 戻り値は配列を返す FUNCTION fnc_ArryComb(strarry[]) DIM tmpstr[0],tmp //文字列 DIM i,j,k,l,m=0,tmpcount = 1,maxcount = 1,preCount = 1 //整数 CONST cnt_SPLSTR = "," for i = 0 to LENGTH(strarry) - 1 maxcount =maxcount * LENGTH(SPLIT(strarry[i],cnt_SPLSTR)) next resize(tmpstr,maxcount-1) //結果格納用の変数を引数に合わせてリサイズ m=0;i=0 //未使用再利用変数の初期化 repeat //順列組み合わせの作成 tmpcount = 1 for l = m to LENGTH(strarry) - 1 tmpcount = tmpcount * LENGTH(SPLIT(strarry[l],cnt_SPLSTR)) next for l = 1 to maxcount / tmpcount for tmp in SPLIT(strarry[i],",") for j = 0 to tmpcount / LENGTH(SPLIT(strarry[i],cnt_SPLSTR)) - 1 tmpstr[k] = tmpstr[k] + " " + tmp k=k+1 next next next m=m+1;k=0;i=i+1 //カウンターの整理 until i >= LENGTH(strarry) result = slice(tmpstr,0,maxcount-1) fend //関数ここまで
549 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 18:06:08.69 ID:+8zDwgB90.net] 関数Callのサンプルはこんなかんじ //関数の呼び出し部 hashtbl lists DIM strarry[0] DIM i //ここで入力する項目数を増やしたりlistsの要素数を増やしたり減らしたりする lists["あ"] = "a10,a20,a30"; lists["い"] = "b100,b200"; lists["う"] = "c1,c2,c3";lists["ぼんば"] = "d1,d2,d3" resize(strarry,length(lists)-1) //ハッシュの要素数で配列をリサイズ for i= 0 to length(lists) - 1 strarry[i]=lists[i,HASH_VAL] next fukidasi(join(fnc_ArryComb(strarry),"<#CR>")) msgbox("終わり") //呼び出し部ここまで
550 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 19:17:28.30 ID:GXdSKXvs0.net] 自作関数って引数を設定した場合、引数の数を合わせないと「引数の数が合いません」ってエラー出るけれど ""を使えば引数を省略できるのか chkimgみたいなデフォルト関数は引数省略できるからどうやるのかなーってずっと悩んでたわ UWSC: 引数を省略できる関数をつくる blogs.yahoo.co.jp/nullpage_vwxyz/52255157.html
551 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 19:24:17.43 ID:4bdWm2Pw0.net] 引数の省略はデフォルト値を関数宣言時に代入しているか否かだ
552 名前:関数の呼び出し時に変数を使用しているが場合によってはデフォルト値にしたい時はEMPTY(定数)を代入する [] [ここ壊れてます]
553 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 19:29:44.25 ID:+8zDwgB90.net] ""てかデフォルト値であればtrueでも1でもなんか指定してあげればいいだけね ただまぁプロ版使ってるけどこんな関数用意して procedure procsmp(t=true,m=1,n="オイヨイヨ") t=false fend こんな感じで呼ぶと procsmp(,,"へい") デバッガでは通るのにスクリプトファイルをUWSCで実行するとsyntaxエラー出たりと 環境で動作変わるからあんま使わない方が良いと思ってる
554 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 19:34:33.12 ID:GXdSKXvs0.net] なんでもいいのか
555 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 19:59:33.20 ID:p4ai4XIh0.net] >>514-515 この方法もいいね。予め全体サイズを把握してからトップダウンで計画的に構築する感じだね。
556 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/09(火) 20:25:23.95 ID:+8zDwgB90.net] 2chは改行制限のおかげでどうやって可読性上げつつコンパクト化するか必死で考えるから質問に答えるだけで色々勉強になるのよね 今回はslice関数をうまいこと使えたので良かった カウンター使い過ぎだけど
557 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 07:52:47.08 ID:Z7PL/WtA0.net] 例示された処理方法よりも長いし遅くなってないか?
558 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 08:45:28.77 ID:+W75uBK+0.net] つか質問者のコードが素手にかなりスマートなのに もっとスマートって要求だから釣りなんだろうなw
559 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 09:04:15.50 ID:MxWBE2100.net] 2進数表記で 111 なら処理三つ 011なら処理二つ みたいなの
560 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 10:37:39.26 ID:R/okCavp0.net] www.nminoru.jp/~nminoru/programming/bitcount.html
561 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 11:26:49.90 ID:wTSkFc930.net] phpならarray_shift使ってかなり短くできたがUWSCで組めない
562 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 12:19:18.86 ID:mXr4GQ/h0.net] 悩みようがないだろ コード書いてみろ 添削してやんよ
563 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 12:25:07.38 ID:wTSkFc930.net] 添削というか、移植してくれ。sliceとか使うのかな $lists["あ"] = "a10 a20 a30"; $lists["い"] = "b100 b200"; $lists["う"] = "c1 c2 c3 c4"; print implode("<br>\n",(combi($lists))); function combi($lists){ $l_cur = array_shift($lists); $l_cur_arr = explode(" ",$l_cur); if(count($lists)>0){ while($l_cur_1 = array_shift($l_cur_arr)){ foreach(combi($lists) as $extra){ $res[] = $l_cur_1." ".$extra; } } }else{ return explode(" ",$l_cur); } return $res; }
564 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 12:45:52.49 ID:R/okCavp0.net] そっちかよw
565 名前:名無しさん@お腹いっぱい。 mailto:sage [2016/02/10(水) 12:54:34.10 ID:wTSkFc930.net] すまぬ499をベースにやろうとしてみたけど 5行目で「listsが定義されていません」エラーになる理由がもうわからない UWSCの配列もよく分からない hashtbl lists lists["あ"] = "a10 a20 a30"; lists["い"] = "b100 b200"; lists["う"] = "c1 c2 c3 c4" print combi(lists) function combi(lists) res = "" l_cur = lists[0] SHIFTARRAY(lists,-1); l_cur_arr = split(l_cur," "); if length(lists)>0 then while length(l_cur_arr)>0 l_cur_1 = l_cur_arr[0] SHIFTARRAY(l_cur_arr,-1) for extra in combi(lists) res = res + l_cur_1+" "+extra+"<#CR>" next wend else result = l_cur_arr endif result = res fend
566 名前:名無しさん@お腹いっぱい。 [2016/02/10(水) 14:26:42.18 ID:Lx2sic3p0.net] >>530 関数定義の方の変数が配列として定義されてないから