Page 1 sur 1

[R] Windows 7 lit-il différament les scipts .au3 ?

Posté : mer. 30 déc. 2009 23:35
par Kikoolol
Bonjour à tous.
Voici mon problème, j'ai crée un script assez banale sous Windows XP.
J'installe alors Windows Seven et lance mon script, et à ma grande surprise, une erreur surgit très rapidement.
La fameuse erreur "Subscript used without non-array variable".

Voici la ligne en question

Code : Tout sélectionner

    $Non = PixelSearch( $FirstPixel[0] + (492 * $CoefX), $FirstPixel[1] + (445 * $CoefY), $FirstPixel[0] + (498 * $CoefX), $FirstPixel[1] + (452 * $CoefY), 15891243)
    If $Non <> 1 Then
        MouseClick("Left", $Non[0], $Non[1], 1, 0)
    EndIf
J'ai remplacer $Non <> 1 par "Not @Error", et cela fonctionne parfaitement !
Seulement mon code est assez longs et tous remplacer serait très fastidieux... des idées pour gagner du temps et ne pas refaire la même erreur ?

Merci d'avance

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : mer. 30 déc. 2009 23:46
par periaz
Si il te met un message ce type, c'est que tu as oublié de déclarer une des variables suivantes : $FirstPixel, $CoefX et $CoefY

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : mer. 30 déc. 2009 23:49
par Kikoolol
L'erreur survient lors du MouseClick, donc les variables $FirstPixel et autre sont bien déclarer (plus haut dans le script). Désolé j'ai oublier de le préciser ^^'.

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : mer. 30 déc. 2009 23:55
par periaz
Je pense qu'il y a un problème au niveau du "If $Non <> 1" car normalement un pixel search renvoie une position en utilisant [0] et [1].
La tu lui demande si il est égale à 1. Je ne comprends pas ^^
Et moi je ferais à ta place :

Code : Tout sélectionner

    $Non = PixelSearch( $FirstPixel[0] + (492 * $CoefX), $FirstPixel[1] + (445 * $CoefY), $FirstPixel[0] + (498 * $CoefX), $FirstPixel[1] + (452 * $CoefY), 15891243)
    If not @error Then
        MouseClick("Left", $Non[0], $Non[1], 1, 0)
    EndIf

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 00:00
par Kikoolol
Oui ton écriture fonctionne, mais chez moi sous xp le "<> 1" également !
Dans l'aide j'ai pu trouver ceci :" Failure: Sets @error to 1 if color is not found. "
J'ai du mal a comprendre pourquoi 2 lectures différentes...

Edit : J'ajoute aussi qu'une fois le script avec les "<> 1" compiler, il fonctionne parfaitement sous seven et XP !

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 00:09
par periaz
Je ne sais pas t'expliquer cela par contre désolé.
Garde le If not @error Then, ce sera mieux je pense ^^

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 00:12
par Kikoolol
C'est ce que je vais faire si je ne trouve pas d'autre solution.
En tout cas merci beaucoup pour ton aide. :)

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 00:52
par Tlem
En fait, l'explication est relativement simple.
PixelSearch() renvoi deux types d'informations :
- Si le pixel est trouvé, alors la valeur de retour est un tableau.
- Si le pixel n'est pas trouvé, alors la valeur de retour est 0 et @error est mis à 1.

Dans votre code, vous dite : If $Non <> 1 Then
Le problème, c'est que $Non sera toujours différent de 1 et donc si le pixel n'est pas trouvé, alors $Non = 0 et $Non[0] ainsi que $Non[0] n'existe pas, d'où l'erreur de variable.

Vous n'avez d'autres solutions que de tester $Non pour savoir si c'est un tableau (IsArray()), ou plus simplement de vérifier @error.
Sachez qu'il existe dans Scite une fonction de remplacement de code.
Donc si vous avez cette ligne à de nombreuses reprises, utilisez la fonction remplacer. ;)

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 01:09
par Kikoolol
Pourtant j'utilise cette méthode depuis toujours et je n'ai jamais eu de problème... je vérifirais demain mais je suis presque sûr.
Mais dans ce cas la pourquoi une erreur sous Seven et pas sous XP ?

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 01:37
par Tlem
Difficile de répondre comme ça.
Il faudrait analyser les résultats de $Non sur les deux OS dans les mêmes conditions. ;)

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 13:42
par Kikoolol
J'ai regarder sur les deux OS,
Sous XP, lorsque la valeur n'est pas trouvé, $Non = 1. Quand elle est trouvé $Non = "Rien"
Sous Seven, lorsque la valeur n'est pas trouvé $Non = 0. Quand elle est trouvé $Non = "Rien"

Le "If not @error Then" fonctionne très bizarrement sur les deux OS, je ne sais plus quoi écrire...
Si vous pouvez essayer chez vous cela me rendrais un grand service.

Merci d'avance.

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 14:32
par Tlem
Quoi qu'il en soit, vous ne devez pas utiliser la valeur de retour pour tester si la fonction c'est bien déroulé.

Vous devez impérativement contrôler la variable @error.
Certaines fonctions sont ainsi faite.
Si vous lisez la documentation de certaines fonctions, il n'est pas fait état d'un retour de 0 ou de 1 en cas de succès ou d'échec et dans ces cas là il faut vérifier @error.

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 15:45
par Kikoolol
Très bien je vais donc utiliser "If not @error"
Mais comment faire lorsque je vérifie 2 pixelsearch ?

$Search1 = PixelSearch(blabla)
$Search2 = PixelSearch(blabla)

If [Le $Search2 est bon mais pas le $search1] then

Comment écrire ceci avec des @error ?

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 15:55
par Tlem
Une solution comme une autre :
► Afficher le texte

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 16:04
par Kikoolol
Merci beaucoup, mais apparemment je ne sais pas pourquoi mais sous Seven parfois les @error fonctionne et des fois non...

Exemple, ce code ne fonctionne pas :

Code : Tout sélectionner

    $CheckFight = PixelSearch( Blabla)
    If $CheckFight <> @error Then
        MouseMove($CheckFight[0], $CheckFight[1], 5)
        $Fight = True
    EndIf
L'erreur m'indique que le MouseMove est impossible normal puisque le pixel n'as pas été trouvé !

Tandis qu'un peu plus tôt dans mon code, ceci fonctionne :

Code : Tout sélectionner

    $EchangeNon = PixelSearch(Blabla)
    If not @error Then
        MouseClick("Left", $EchangeNon[0], $EchangeNon[1], 1, 0)
    EndIf
Pas de pixel trouvé, pas d'erreur...

Je ne comprend pas, les 2 scripts sont pourtant tout les deux des includes.

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : jeu. 31 déc. 2009 16:46
par Tlem
:shock: :shock: :shock:

Vous confondez plusieurs choses.
Dans votre exemple :

Code : Tout sélectionner

    $CheckFight = PixelSearch( Blabla)
    If $CheckFight <> @error Then
        MouseMove($CheckFight[0], $CheckFight[1], 5)
        $Fight = True
    EndIf
Vous utilisez la valeur de retour du PixelSearch() qui est ici $CheckFight.
Or je vous ai dit de ne pas utiliser cette valeur pour tester une erreur.
$CheckFight ne sera jamais égal à @error.
@error est une variable à part.

Dans $CheckFight = PixelSearch( Blabla) la variable $CheckFight peut être égale à un tableau (si le pixel est trouvé) ou à une valeur bidon (1 ou 0 selon l'OS).
Donc c'est pour ça que vous ne devez pas compter sur cette valeur de retour pour effectuer un test de validité de la fonction (pour l'instant).

On récapitule :

Code : Tout sélectionner

$CheckFight = PixelSearch( Blabla)
Msgbox(0, '', '@error = ' & @error)
- Si le pixel est trouvé alors $CheckFight est un tableau à deux dimentions des coordonnées de ce pixel et @error = 0

- Si le pixel n'est pas trouvé alors $CheckFight est égal à une valeur non fixe selon l'OS (0, 1, ou '"") et @error = 1

Re: [..] Windows 7 lit-il différament les scipts .au3 ?

Posté : ven. 01 janv. 2010 20:23
par Kikoolol
Ah d'accord j'ai compris !
Ca fonctionne parfaitement sur les deux OS :D
Merci beaucoup à vous deux !