重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

私が書いたスクリプトを実行して、「○行目にIFENDがない」みたいなことをuwscに何回か言われまして治していくと「SyntaxError 15行目:RETURN」が出てきました。調べてみると文の書き方に問題があるみたいなんですが、なにが問題なんかわかりません。よかったら修正していただけないでしょうか?
現在のスクリプトはこれです。

ACW(GETID("Genymotion for personal use - Google Nexus 7 - 4.3 (800x1280, 213dpi) - 192.168.56.101","QWidget"),522,121,438,676,0)
IFB CHKIMG("A.bmp") // 認識させたい画像ファイルを指定する
ENDIF
Function CheckColorScope(PosX, PosY, Element, BaseValue, Scope)
// 指定された色要素の値を取得
Select Element
Case "R"
ElementValue = PeekColor(PosX, PosY) And $FF;
Case "G"
ElementValue = (PeekColor(PosX, PosY) And $FF00) / $100;
Case "B"
ElementValue = (PeekColor(PosX, PosY) And $FF0000) / $10000;
Default
Result = False; Return ;
SelEnd
FEND
// 色要素の値が、指定範囲内であれば True を返す
Ifb (ElementValue >= BaseValue - Scope) And (ElementValue <= BaseValue + Scope) Then
Result = True;
Else
Result = False;
// 画像認識に成功した場合の処理をここに書く
MMV(G_IMG_X, G_IMG_Y)
BTN(LEFT,CLICK)
ELSE
// 画像認識に失敗した場合の処理をここに書く
MSGBOX("画像認識に失敗しました。")
ENDIF

「uwscでスクリプトを修正していただけな」の質問画像

A 回答 (12件中1~10件)

>もうさすがに諦めるしか手はないのでしょうか?


此方では問題なく動きますし
そちらの実機での動き(環境)が直接確認できない以上は
これ以上は文書だけでやり取りしても進展は見込めないと考えます
    • good
    • 0
この回答へのお礼

大変お世話になりました。
私の質問を何回も繰り返して回答していただいて本当に感謝しています。
本当にありがとうございました。

お礼日時:2015/07/21 21:47

まず一点 書き忘れましたが


もし仮想環境を起動しなおしていない状態のままテストを続けているのであれば
正常な処理ができなくなっていますので(先に実行してたACWの影響)仮想環境を再起動しなおしてください

>上のSAVEIMGスクリプトで保存した画像はメールアイコンが表示されていません。
>なぜでしょうか?
設定してる座標位置が間違っているから の一言に尽きるでしょう

私が確認した限りでは (言語も英語のままで Nexus7 の4.3(API18)で作っただけのデバイス)
No10に書いたように 仮想環境の表示サイズを 434×676にした時には
メールアイコン自体のサイズは30×30程度となります
(クリックなどのがあるので多少小さめに保存していますが)
言語を日本語にしてもアイコンのサイズは英語時と変わりありません

300×300なんてデカい値ではありません(この値をどこから持ってきたのですか? と逆に聞きたい)

アイコンの配置は英語。日本語で変わりますしあなたが既に何かアプリインストールしてれば
それによっても変わるでしょうから一概に言えませんがあくまでデフォルトで話をすれば
英語 日本語環境とも 保存のX座標を250にしてる段階でメールアイコンはその領域に入っていません



以降は実際の画像が分からないので想像で一般的なことしか言えませんが
これまでの経緯を考えるとあなたの操作手順や確認手順の方に原因があるのではないか
と疑っちゃいます(やったと書かれてても失礼ながら既に鵜呑みにできない)

>200×200に小さくしようとすると、検出座標が SAVEIMG関数の250、300 の値と同じではなく、
>[true 388,182]と表示されました

可能性として思いつくことを書けば書けば
最初に書き忘れたと書いたように既に内部情報が狂ったままになっているのかもしれません
仮想環境を再起動して再度確認してください

50×50等画像が小さい場合には検出している箇所が複数になっている可能性も考えられます
例えば背景全て白 のデスクトップに対して
100×100の白画像を元に検索かけると無数に一致しますよね   それと同じ事です
確認するなら CHKIMGの引数を変更してヒット数も併せて確認してください

ACWとSAVEIMGをコメントアウトしてCHKIMGだけを実行したとしたら
その間で仮想環境の窓を移動させてればそういった現状は当たり前のごとく発生します
(窓リサイズしたら検出できなくもなります)


ちなみに以下の値では相変わらずエミュレータ画面範囲外を対象に画像作ってます)
保存開始位置X 250 横300 なので仮想環境窓幅の 434オーバーしてます

>ACW(GETID("Genymotion"),0,0,434,676,0)
>SAVEIMG("A.bmp",0,250,300,300,300)  

参考として此方で保存した検索元画像と仮想環境(英語・日本語の各表示)のアイコン一覧
が確認できるように3ファイル(BMP)をZIP圧縮で以下においてみました  必要なら確認してみてください
パスワードは付けてませんが1日でなくなります
http://fast-uploader.com/file/6993001145133/

ここに貼り付けずのにWEBに置いたのはそうしないと正確な画像の判断ができないからです
(ダウンロード強要するわけでな葉いので不安があるなら見なくて構いません)
    • good
    • 0
この回答へのお礼

回答ありがとうございます
>設定してる座標位置が間違っているから の一言に尽きるでしょう
メールアイコンの座標はあっていると思います。SAVEIMGで取得した画像はメールアイコンとは別の場所を映し出していますが、その別の場所を保存した画像を使いクリックを命令するスクリプトを実行すると、メールアイコンをクリックしてくれます。
なので私はSAVEIMGの取得する機能、もしくは私のパソコンがバグってるのではないかと思います。

300×300は画像が小さすぎると、メールアイコンより上か下か右か左かわかりにくいので大きめの画像にして設定しやすいよう工夫しました。

ACW(GETID("Genymotion"),0,0,434,676,0
SAVEIMG("A.bmp",0,250,300,200,200)    
PRINT CHKIMG("A.BMP") + " " + G_IMG_X + " " + G_IMG_Y
再起動して前と同じ上のスクリプトで実行してみたら、今度は [true 13 182]また再起動すると[true 13 182]でした。
もうさすがに諦めるしか手はないのでしょうか?

お礼日時:2015/07/21 21:04

突っ込みどころが満載です



>上のスクリプトをランチメニューに登録
書いてること全然理解してませんね
とりあえずそれが現状の問題に直結するわけではないですが
そのコードじゃダメだってNo7で指摘してるでしょ

以下の座標関係であなたが期待した画像が取得できるわけないことが分かりませんか
自分で画像を確認してると思えません

>ACW(GETID("Genymotion"),-1,0,434,676,0)
>SAVEIMG("A.bmp", 0, 440, 530, 50, 50)

貴方が保存してるのは仮想環境窓の範囲外のエリアです
  Genymotion の表示幅を 434に設定してるのに保存開始位置は440になっています
そのためウインドウ位置ずらせば検出できなくなるのは当たり前です
(デスクトップ背景にもよる)

PCが壊れているわけでもなく単純にあなたのスクリプトが間違っているのと
理解力のなさに問題があるだけと考えます

此方で動きを確認したコードは以下のとおり
   デバイスはあなたが設定したものと同じで作成しただけ(すべてデフォルト)

ACW(GETID("Genymotion"), 0, 0, 434, 676, 0)
SAVEIMG("A.BMP", 0, 30, 300, 29, 27)    //100以降のパラメータは実機環境に合わせて設定
                        //あなたが希望き事を確認してるコードはするアイコン画
//一度このコードで画像保存すればSAVEIMGはコメントアウトしてしまって構わない
     //プログラムアイコン一覧表示の状態に持って行った状態で実行しました

IFB CHKIMG("A.bmp") // 認識させたい画像ファイルを指定する
// 画像認識に成功した場合の処理をここに書く
PRINT G_IMG_X + " " + G_IMG_Y
MMV(G_IMG_X, G_IMG_Y)
BTN(LEFT,CLICK)
ELSE
// 画像認識に失敗した場合の処理をここに書く
MSGBOX("画像認識に失敗しました。")
ENDIF
    • good
    • 0
この回答へのお礼

回答ありがとうございます。己の理解力のなさに反省しています。すみません

ACW(GETID("Genymotion"),0,0,434,676,0)
SAVEIMG("A.bmp",0,250,300,300,300)  
PRINT CHKIMG("A.BMP") + " " + G_IMG_X + " " + G_IMG_Y
このスクリプトで画像を保存して、クリックするスクリプトを実行すると無事クリックしてくれました。
しかし、上のSAVEIMGスクリプトで保存した画像はメールアイコンが表示されていません。
なぜでしょうか?

それと上のスクリプトで取得する画像の大きさを300×300から200×200に小さくしようとすると、検出座標が SAVEIMG関数の250、300 の値と同じではなく、[true 388,182]と表示されました。50×50の場合も同じように [true 388,182]と表示されました。
そして200×200で保存した画像を、
ACW(GETID("Genymotion"),0,0,434,676,0)
IFB CHKIMG("A.bmp")
PRINT G_IMG_X + " " + G_IMG_Y
MMV(G_IMG_X, G_IMG_Y)
BTN(LEFT,CLICK)
ELSE
MSGBOX("画像認識に失敗しました。")
ENDIF
このスクリプトで実行すると、
388,182の座標をクリックしました。
これはどういうことかわかりますでしょうか?

お礼日時:2015/07/21 09:45

話が全然進まないので多少うんざりぎみになって自分で環境入れてみました


結論を言ってしまえば動作不良を起こす要因となるコード部分が判明しました
それは  ACW関数  です  (余計なことやりすぎ)

ACW関数内のGETIDを以下のように変更してみてください
GETID("Genymotion")   エミュレータ1つしか起動してないならこれで十分です
基本的にはそれできちんと動作することを此方で確認できています
(正しい画像使ってるなら)色幅持たせる必要もありません

https://oshiete.goo.ne.jp/qa/9026457.html の問題も全てそれが原因です
No7のコード動かせば TRUE 検出された時も座標値が異常であることが分かるかと思います
    • good
    • 0
この回答へのお礼

ACW(GETID("Genymotion"),-1,0,434,676,0)
WHILE true
SAVEIMG("A.bmp", 0, 440, 530, 50, 50)
PRINT CHKIMG("A.BMP") + " " + G_IMG_X + " " + G_IMG_Y
WEND
上のスクリプトをランチメニューに登録

ACW(GETID("Genymotion"),-1,0,434,676,0)
IFB CHKIMG("A.bmp")
PRINT G_IMG_X + " " + G_IMG_Y 
MMV(G_IMG_X, G_IMG_Y)
BTN(LEFT,CLICK)
ELSE
// 画像認識に失敗した場合の処理をここに書く
MSGBOX("画像認識に失敗しました。")
ENDIF
やはりだめでした。検出座標もどちらのスクリプトも(440,530)と表示されていますが、違う場所をクリックする不具合はなおりませんでした。
やはりパソコンが壊れているのかと思います。
長くお付き合いしていただいて本当にありがとうございました。
とても貴重な体験をしました。
本当にありがとうございました。

お礼日時:2015/07/21 08:18

>治していただけないでしょうか?


   PRINT CHKIMG("A.BMP") + " " + G_IMG_X + " " + G_IMG_Y

// "A.BMP" の部分の ”  が全角になってました
//確認の上全角になっていたら半角に直してください
    • good
    • 0
この回答へのお礼

本当にありがとうございました。

お礼日時:2015/07/21 08:18

>これは、私が一番最初に質問したCHKIMG関数のことですよね。


そうです
但しチェックに使う画像は条件1にて保存された画像をそのまま使うという事です


>2つ実行同時にしてみると、SAVEIMGの方は「True」の連続で、CHKIMG関数の方は私が一番新しく質問した
普通に考えたらありえない話です
画像を間違ってるか手順を間違っているかしか考えられません

一点気になってましたが
WHILETRUE
WEND
の中にSAVEIMG入れてませんよね?(そこを直してますか?)
直してなければ相変わらず条件1と条件2で同じ画像使ってるとは言えません



再度コードをアップしておきます繰り返しになりますが確認してください(ちょっとコードを追加してます) 
  ただし動かして確認してないので多少間違いがあるかもしれません
スクリプト1(条件1)
SAVEIMG("A.BMP", 0, 100, 200, 300, 400)    //100以降のパラメータは実機環境に合わせて設定
                        //あなたが希望するアイコン画像が保存されていることを確認
WHILE TRUE
   PRINT CHKIMG(”A.BMP”) + " " + G_IMG_X + " " + G_IMG_Y
                // TRUE の時検出座標が SAVEIMG関数の100、200 の値と同じになっているかを確認
                // FALSEの時は 座標値はまともな数値にはならないのでどうでもいい
WEND

上記をランチメニューに登録して実行   保存画像(A.BMP)が意図しているものであることをきちんと確認する

スクリプト2(条件2 元質問のプログラム  画像ファイルはスクリプト1と同一のものを使用)
//ACW()  //とりあえず不要なのでコメントアウトしておく
IFB CHKIMG("A.bmp") // スクリプト1と同一のものを使用
// 画像認識に成功した場合の処理をここに書く
PRINT G_IMG_X + " " + G_IMG_Y //検出座標を表示 SAVEIMG関数の100、200 の値と同じになるはず
MMV(G_IMG_X, G_IMG_Y)
BTN(LEFT,CLICK)
ELSE
// 画像認識に失敗した場合の処理をここに書く
MSGBOX("画像認識に失敗しました。")
ENDIF

手順としては
ランチメニューからスクリプト1を動かした状態でスクリプト2を動かす    という事です

それで本当に両者の結果が異なるというのであれば
私ならUWSCやプログラムの問題じゃなくて PC壊れてるんじゃないの?って言います
(やってることは両者共に同じ画像を使って同じCHKIMG実行してるのに結果が違うって事があり得ない)

と書いてさらに念を入れるなら
・ファイル名の記載をフルパス名で指定する
・一旦画像を作って確認した後はスクリプト1を編集しなおして
 2度とSAVEIMG関数を実行しないように修正する

上記2点を試して確認してください
それなら両者とも完全に同じことやってると言えます
そこまでしても結果が異なるっていうなら本当にお手上げ状態です
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ACW(GETID("Genymotion for personal use - Google Nexus 7 - 4.3 (800x1280, 213dpi) - 192.168.56.101","QWidget"),-1,0,434,676,0)


SAVEIMG("A.BMP", 0, 440, 530, 50, 50)    //100以降のパラメータは実機環境に合わせて設定
                        //あなたが希望するアイコン画像が保存されていることを確認
WHILE TRUE
   PRINT CHKIMG(”A.BMP”) + " " + G_IMG_X + " " + G_IMG_Y
                // TRUE の時検出座標が SAVEIMG関数の100、200 の値と同じになっているかを確認
                // FALSEの時は 座標値はまともな数値にはならないのでどうでもいい
WEND

上記のスクリプトを実行たのですが、「変数:"Aが定義されていません  7行目:PRINT CHKIMG("A.BMP")+""+G_IMG_X+G_IMG_Y」とでます。uwscのヘルプを見て治そうと思いましたが、自分の力では無理でした。
治していただけないでしょうか?よろしくお願いします

お礼日時:2015/07/20 23:58

No5訂正


>別スレッド というオプション設定があります
確認したら正確には 別プロセスで実行   でした
ランチメニューに登録する際にそこにチェック入れて登録するだけです
    • good
    • 0
この回答へのお礼

詳しく教えていただきありがとうございます。基本を大事にします。
同時にスクリプトを動かすことができました。
>更にそれを動かしているときに同時に 元質問のプログラムを実行しましょう
これは、私が一番最初に質問したCHKIMG関数のことですよね。

2つ実行同時にしてみると、SAVEIMGの方は「True」の連続で、CHKIMG関数の方は私が一番新しく質問した
https://oshiete.goo.ne.jp/qa/9026457.html
この動作をしました。
↑のURLの質問の解決策はわかりますでしょうか?

お礼日時:2015/07/20 22:25

>今別スレッドで実行するやり方を調べているので、


ランチメニューに登録すれば 別スレッド というオプション設定があります
1つをそちらから起動し もう一方を普通の操作で動かせばいいだけです

SAVEIMGでID0意外に設定すると UWSC内部の座標管理が変わって
保存画像が正常なものではなくなるんですよ
(画像見ても一見きちんと保存されているように見えるが実は違うといった状況が発生します)
MOUSEORG 関数も関係してきたりします

色幅持たせる以上に話が複雑になりますので今の段階では
IDは0にしておくことをお勧めします
(何回も書いてるようにいろいろ手を加えるより先に基本的な動作で何が問題なのかを明確に把握するべき)
    • good
    • 0
この回答へのお礼

詳しくありがとうございます。

お礼日時:2015/07/20 22:26

実際に自分でコードをテストしたところ とんでもないことに気が付きました


回答した私がいまさら言うのもなんですが
SAVEIMG に関して 私の書いたコードでは引数が間違っています(不足しています)

書いたサンプリでは
SAVEIMG("a.bmp",100,200,300,400)  と書きましたが  正しいものは
SAVEIMG("a.bmp",0,100,200,300,400) となります

パラメータ間違いによる動作異常というのがあるかもしれません
パラメータ調整する際に引数確認してれば気が付くはずなので
気が付いて修正してるならそういった話ではありませんが確認してみてください

新たに建てられた質問に関しては見ましたが(それ見て実際こちらで試して↑に気が付いた)
貴方がどういった状況で確認したか正確にわからないのであえてそちらには触れません
    • good
    • 0
この回答へのお礼

詳しくありがとうございます

お礼日時:2015/07/20 22:26

>余分なところはペイントでトリミングしました。


これをやってること自体で条件1で作成した画像をそのまま使ってるとは言いません
私が言ってるのⓟは他のソフトでのトリミングなど余計な操作をせずに
同じ画像を使って確認してくださいという事を言っています
  ->そうしないとどこで可で変な操作や変換されていてもわかりません

>SLEEP (3) を入れて実行しても「True」とでてきます。なので画面は変化していないとおもいます。
SLEEP入れても一回だけしかCHLIMGをやっていないのであれば
確実なチェックはできません

ちゃんとチェックするなら
SAVEIMG()
WHILETRUE
  PRINT CHKIMG()
WEND
といったように暫くスクリプトを動かし続けた方が確実です

更にそれを動かしているときに同時に 元質問のプログラムを実行しましょう
(別スレッドで実行させるようにして実行すれば複数同時に動かせます)
    • good
    • 0
この回答へのお礼

ありがとうございます。
あとから付け加えた「0」というのは、デスクトップ全体を表すということだとわかりました。
それならgenymotionのIDを打ったらgenymotionの画面の左上を原点としてくれるのかなと思いましたがそう甘くなかったです。
WHILE true
SAVEIMG("A.bmp",GETID("Genymotion for personal use - Google Nexus 7 - 4.3 (800x1280, 213dpi) - 192.168.56.101","QWidget"),440,530,50,50)
SLEEP(3)
PRINT CHKIMG("A.bmp")
Wend
このスクリプトで実行すると、すべてTrueが表示されました。画像をみてみるとメールアイコンが正しく表示されていました。

今別スレッドで実行するやり方を調べているので、それが確認できましたらまたお礼をさしてもらいます

お礼日時:2015/07/20 20:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!