[R] Aide pour une boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

[R] Aide pour une boucle

#1

Message par tekserver »

Bonsoir le forum,

Je bosse sur un script pour l'automatisation du paramétrage de plusieurs PC pour ma boite. Je débute fraîchement dans ce domaine du scripting mais grâce à ce forum et aux nombreux exemples et documentations j'ai pu déjà faire deux trois trucs sympa alors qu'il y a quelques jours j'y songeais pas :)

Je suis tombé sur le tuto des boucles j'ai un peu compris le truc mais il va me falloir beaucoup de pratique pour en être sur :)

Je rencontre un problème et je pense que justement il me faut un boucle, mais je n'arrives, je demande donc votre aide :)

Le script à son lancement demande à l'utilisateur, le numero du PC ($Ks), le nombre de PC présent dans la boutique ($Nks) et l'ip du routeur ($Routeur). Grace à l'ip du routeur je peux savoir qu'elle IP aura le premier PC de la boutique ($IpKs1) ou ($Ipdepart).

L'idée de la boucle est de stocker dans des variables l'IP des PC présent dans la boutique, genre si ($Nks) = 5 alors le script stock 5 variables:
$IpKs1 = $Ipdepart
$IpKs2 = $Ipdepart + 1
$IpKs3 = $Ipdepart + 2
$IpKs4 = $Ipdepart + 3
$IpKs5 = $Ipdepart + 4

j'ai construis la boucle comme ceci et évidement ça ne fonctionne pas :) Je pense être à coté de la claque ...

Code : Tout sélectionner

For $i = 1 To $Nks Step 1
    ($IpKs[$i]) = ($Ipdepart + [$i])
    Next
Bon j'avoue je ne sais pas si j'ai été clair dans mon explication de jeune padawan :)

Merci bien à vous,
Cordialement.
Modifié en dernier par tekserver le jeu. 27 févr. 2014 23:07, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Aide pour une boucle

#2

Message par Tlem »

Bonjour.
On pourrait comme vous avez cherché à le faire, utiliser des variables numérotés pour stocker les différentes addresses IP, mais pour ce type d'application, un simple tableau suffit.
Donc voici un exemple avec boucle et tableau :

Code : Tout sélectionner

#include <array.au3> ; Cette ligne ne sert que pour l'affichage du tableau.

$Nks = 5 ; Nombre de machines

Dim $aIpks[$Nks] ; On cree un tableau avec autant d'éléments que $Nks
$Tronc = "192.168.1." ; On defini le tronc commun de l'IP
$IPdepart = 0 ; On defini la derniere valeur IP  - 1

For $i = 1 To $Nks step 1 ; Debut de la boucle.
    $aIpKs[$i] = $Tronc & ($IPdepart + $i) ; Chaque element du tableau ce voit octroyer le tronc IP + une valeur incrémenté de $IPdepart + $i soit 0 + 1 à 5.
Next

_ArrayDisplay($aIpKs) ; Affichage du tableau.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Aide pour une boucle

#3

Message par tekserver »

Bonjour Tlem,

Merci beaucoup pour votre réponse.
Je pense avoir compris votre boucle, cependant en testant le code tel quel, afin d'être sur de bien le comprendre et de l'adapter à mon script (si je peux l'appeler comme ca :) ) j'obtiens une erreur:

Code : Tout sélectionner

 (10) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
J'ai l'impression que c'est le tableau (Array) qui pose problème, j'ai oublié de préciser un détail important dans mon message initial, le but de cette boucle est décrire dans un fichier .txt ( IP + poste qui correspond à l'ip ) mais avant de faire cette partie d'écriture, c'est le principe de la boucle que j'aimerais bien comprendre.

Encore merci,
Cordialement.
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Aide pour une boucle

#4

Message par tekserver »

Re,

J'ai réussi à trouver une petite solution pour la première partie de mon soucis, la boucle :)

Code : Tout sélectionner

#include <array.au3> ; Cette ligne ne sert que pour l'affichage du tableau.

$Nks = 5 ; Nombre de machines

Dim $Ipks[$Nks]
$Tronc = "192.168.1." ; On defini le tronc commun de l'IP
$IPdepart = 0 ; On defini la derniere valeur IP  - 1

For $i = 1 To $Nks step 1 ; Debut de la boucle.
    $IpKs[$i] = $Tronc & ($IPdepart + $i) ; Chaque element du tableau ce voit octroyer le tronc IP + une valeur incrémenté de $IPdepart + $i soit 0 + 1 à 5.
        MsgBox(1,"",$IpKs[$i] & "   " & "PC0" & $i)
Next
Reste à comprendre pourquoi il affiche 4 fois la msgbox alors qu'il y a dans cette exemple 5 machines.
Je vais commencer à regarder comment écrire ce résultat dans un fichier, en fin de fichier.

Cordialement.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Aide pour une boucle

#5

Message par jguinch »

Le MsgBox ne s'affiche que 4 fois car le script s'arrête au moment où il rencontre l'erreur.

Le code de Thierry est bon, mais il a introduit une erreur :(
Ca tombe bien, cette erreur est courante et tu risques d'y être confronté souvent, donc autant que tu comprennes pourquoi. :D

Un tableau commence toujours à l'index 0, et non à 1 : donc pour le tableau $aIpks de 5 lignes, tu auras $aIpks[0] jusqu'à $aIpks[4].

Thierry demande à la boucle for de boucler de 1 à 5, là il n'y a aucun souci.
Mais en alimentant le tableau, Thierry a fait l'erreur. $i va s'incrémenter au fur-et-à-mesure et va arriver à 5, or $aIpks[5] n'existe pas, d'où le message d'erreur.

Donc il suffit de mettre $aIpKs[$i - 1] = $Tronc & ($IPdepart + $i) et tout sera réglé.
Au aurait pu aussi faire aller la boucle de 0 à 5 et ajouter 1 à $IPdepart
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Aide pour une boucle

#6

Message par tekserver »

Re,

Merci pour ta précision jguinch, je capte un petit peu mieux pourquoi il n'indique pas tout, enfin je pense :)

Voici comment j'ai adapté la boucle donné par Tlem dans mon script, pour l'exemple ci-dessous j'ai juste mis les variables obtenu par les inputs

Image

Code : Tout sélectionner

; Pour info l'ip du routeur et la dernière IP et la premier est toujours à - 29 de ce dernier.
$Nks = 5 ; Nombre de machines
$Pdv = 1234 ; Numéro de Point de vente
$Ip1 = 10  ; Valeur de l'input, Rang 1 de l'ip, via un GUICtrlRead
$Ip2 = 1  ; Valeur de l'input, Rang 2 de l'ip, via un GUICtrlRead
$Ip3 = 50  ; Valeur de l'input, Rang 3 de l'ip, via un GUICtrlRead
$Ip4 = 30   ; Valeur de l'input, Rang 4 de l'ip, via un GUICtrlRead

$Ipdepart = ($Ip4 - 29)
$Tronc = $Ip1&(".")&$Ip2&(".")&$Ip3&(".")
Dim $Ipks[$Nks]

For $i = 0 To $Nks step 1 ; Debut de la boucle.
    $IpKs[$i] = $Tronc & ($IPdepart + $i) ; Chaque element du tableau ce voit octroyer le tronc IP + une valeur incrémenté de $IPdepart + $i soit 0 + 1 à 5.
    MsgBox(1,"",$IpKs[$i] & "   " & $Pdv & "PC0" & $i + 1)
Next
Ça fonctionne bien, ça m'affiche désormais correctement les choses, cependant j'ai encore une erreur non bloquante dans AutoIt:

Code : Tout sélectionner

(14) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$IpKs[$i] = $Tronc & ($IPdepart + $i)
^ ERROR
Je verrai après pour l'écriture dans un fichier.

Encore merci à vous,
Cordialement.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Aide pour une boucle

#7

Message par Tlem »

Oui désolé, mais j'ai tapé le code vite fait sur la tablette Android pendand mon petit déjeuner, donc pas pu testé. Au départ j'étais parti sur un Ubound du tableau -1 mais j'ai voulu au dernier moment utiliser la variable du nombre d'IP en pensant que ca serait plus compréhensible ...
D'où l'erreur de débutant. :?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Aide pour une boucle

#8

Message par mikell »

$Nks=5 => Dim $Ipks[$Nks] => le tableau a 5 lignes (d'index 0 à 4 comme l'a brillamment expliqué jguinch)
For $i = 0 To $Nks => boucle de 0 à 5, soit 6 fois
ça va bien marcher les 5 premières (d'où l'impression d'erreur non bloquante) mais à la 6ème ($i=5) => erreur parce que $Ipks[5] n'existe pas

Relis la ligne 4 du post de jguinch : la 1ère ligne du tableau c'est $Ipks[0], la dernière $Ipks[4]
For $i = 0 To $Nks-1 => tu boucles le nombre correct de fois
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Aide pour une boucle

#9

Message par tekserver »

Bonsoir à tous,

Effectivement j'avais mal compris ce que décrivait jguinch, et pourtant j'avais relu plusieurs fois, merci à vous.
Je vous tiens au courant sur l'évolution de cette boucle car j'aimerais profiter de cette dernière pour faire une chose de plus, je cherche des infos avant.

Merci encore à vous.

Cordialement ++

Edit: Résolu.
Répondre