[..] Appeler une variable du MAIN

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

[..] Appeler une variable du MAIN

#1

Message par k3nix »

Bonjour, voici mon problème :

Quand j'ai appris a coder on m'a dis que les développeurs pour ne pas s’embrouiller se creer 2 fichiers le premier c'est le MAIN le deuxième c'est la librairie dit LIB

Dans mon cas c'est ce que j'ai fait le programme principale est dans le MAIN et il appelle des fonctions de LIB.

mais dans mes fonctions du LIB les variables qui ont été déclaré dans le MAIN ne sont pas détécté, il m'affiche "xxxx is Possibly used before declaration"

or j'ai bien fait #include <LIB> dans mon main et bien declaré mes variables en GLOBAL $variable

une idée de pourquoi elles ne sont pas vues de mon fichier LIB ??
Avatar du membre
Ks10
Niveau 6
Niveau 6
Messages : 282
Enregistré le : mer. 25 avr. 2012 20:38
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#2

Message par Ks10 »

Tu a essayer :

Code : Tout sélectionner

#include <LIB.au3>
Au lieu de :

Code : Tout sélectionner

#include <LIB>
?
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#3

Message par jguinch »

L'histoire du main et lib, c'est surtout pour les langages de type C.
Avec AutoIt, on parle d'includes, tout comme avec PHP par exemple.

Les noms des fichiers ne sont pas vraiment importants, c'est à toi de les nommer pour t'y retrouver.
Mais il n'y a rien d'obligatoire. D'ailleurs, on voit souvent des codes de plusieurs milliers de lignes dans un seul fichier...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#4

Message par orax »

k3nix a écrit :mais dans mes fonctions du LIB les variables qui ont été déclaré dans le MAIN ne sont pas détécté, il m'affiche "xxxx is Possibly used before declaration"

or j'ai bien fait #include <LIB> dans mon main et bien declaré mes variables en GLOBAL $variable

une idée de pourquoi elles ne sont pas vues de mon fichier LIB ??
Supposons que j'ai 2 fichiers :
► Afficher le texte
Écrire ça dans le fichier "MAIN"…

Code : Tout sélectionner

#include <LIB.au3>
Global $varMAIN
MsgBox(0, '', 'Ceci se trouve dans le fichier "MAIN")
… revient au même que d'écrire ça :

Code : Tout sélectionner

Global $varLIB
MsgBox(0, '', 'Ceci se trouve dans le fichier "LIB")
Global $varMAIN
MsgBox(0, '', 'Ceci se trouve dans le fichier "MAIN")

Donc $varMAIN est forcément déclaré après puisque le fichier "LIB" est inclus avant.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Re : [..] Appeler une variable du MAIN

#5

Message par Tlem »

Pour éviter le message d'erreur, vous devez déclarer les variables globales avant de déclarer l'include.

Lorsque vous écrivez :

Code : Tout sélectionner

#Include <LIB.au3>
AutoIt lit le code du fichier LIB.au3, donc si les variables sont inconnues il est normal d'avoir un message d'erreur.

Autres solutions :
- Déclarez vos variables globales dans LIB.au3.
Ou
- Déclarez vos variables dans "une LIB" spécifique (un autre fichier Include) que vous pourriez appeler VAR.au3 et que vous devez inclure en premier dans votre Main.au3. Je trouve que ça complique mais peut être préférez vous ce mode de fonctionnement ...

Envoyé depuis mon appareil mobile.
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
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#6

Message par blacksoul305 »

Bonjour,

je suis sur un projet où je fonctionne de la même manière, fractionnée en plusieurs fichiers histoire de regrouper mes fonctions. Où se trouve le fichier LIB.au3 ?

Code : Tout sélectionner

#include <LIB.au3> ; LIB se trouve dans le dossier Includes de AutoIt
#include "LIB.au3" ; LIB se trouve dans le dossier de MAIN.au3
Étudiant en 2ème année de Licence Informatique.
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#7

Message par k3nix »

Ks10 a écrit :Tu a essayer :

Code : Tout sélectionner

#include <LIB.au3>
Au lieu de :

Code : Tout sélectionner

#include <LIB>
?

oui ça je l'ai fait je n'ai pas oublié le .au3 :P
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#8

Message par k3nix »

jguinch a écrit :L'histoire du main et lib, c'est surtout pour les langages de type C.
Avec AutoIt, on parle d'includes, tout comme avec PHP par exemple.

Les noms des fichiers ne sont pas vraiment importants, c'est à toi de les nommer pour t'y retrouver.
Mais il n'y a rien d'obligatoire. D'ailleurs, on voit souvent des codes de plusieurs milliers de lignes dans un seul fichier...
Mais mon but c'est de separer les fonctions du fichier principale :(
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#9

Message par k3nix »

blacksoul305 a écrit :Bonjour,

je suis sur un projet où je fonctionne de la même manière, fractionnée en plusieurs fichiers histoire de regrouper mes fonctions. Où se trouve le fichier LIB.au3 ?

Code : Tout sélectionner

#include <LIB.au3> ; LIB se trouve dans le dossier Includes de AutoIt
#include "LIB.au3" ; LIB se trouve dans le dossier de MAIN.au3
il se trouve dans le même dossier je veux peutt etre penser a tester les guillements :o
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#10

Message par blacksoul305 »

Quelques petites choses :

- ne cite pas chacun des messages auxquels tu réponds, ça encombre le forum. Cite seulement les passages importants si besoin est.

- évite de poster plusieurs messages à la suite, à la place, édite ton dernier message.

Merci :)
Étudiant en 2ème année de Licence Informatique.
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: Re : [..] Appeler une variable du MAIN

#11

Message par k3nix »

Tlem a écrit :Pour éviter le message d'erreur, vous devez déclarer les variables globales avant de déclarer l'include.

Lorsque vous écrivez :

Code : Tout sélectionner

#Include <LIB.au3>
AutoIt lit le code du fichier LIB.au3, donc si les variables sont inconnues il est normal d'avoir un message d'erreur.

Autres solutions :
- Déclarez vos variables globales dans LIB.au3.
Ou
- Déclarez vos variables dans "une LIB" spécifique (un autre fichier Include) que vous pourriez appeler VAR.au3 et que vous devez inclure en premier dans votre Main.au3. Je trouve que ça complique mais peut être préférez vous ce mode de fonctionnement ...

Envoyé depuis mon appareil mobile.
Quand j’exécute mon programme il ne m'arrive jamais d’exécuter le LIB car il ne sert qu'a regrouper mes fonctions !
après c'est plutôt pratique avec 2 écrans les fonctions d'un coté et le code de l'autre c'est juste magique, surtout que ça organise vachement mon travail de les separer, apres ce n'es peut être que mon avis mais me balader dur des kilométres de roulette .... mais pour ça il faudrait que lib lise les variables qui sont globales de MAIN :)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#12

Message par jguinch »

@k3nix : blacksoul t'a expliqué quelques fondamentaux comme éviter de poster plusieurs messages à la suite et éviter d'utiliser les citations à tour de bras.
Merci de faire un effort !

J'ai supprimé ton dernier message, qui ne sert à rien.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Re : [..] Appeler une variable du MAIN

#13

Message par Tlem »

Bonsoir.
k3nix a écrit :dans mes fonctions du LIB les variables qui ont été déclaré dans le MAIN ne sont pas détécté, il m'affiche "xxxx is Possibly used before declaration"
Signifie que la variable est utilisée avant d'être déclarée.
k3nix a écrit :Quand j’exécute mon programme il ne m'arrive jamais d’exécuter le LIB car il ne sert qu'a regrouper mes fonctions !
A partir du moment ou dans Main.au3, la première ligne de code est la commande :

Code : Tout sélectionner

#Include <LIB.au3>
toutes les lignes de code de LIB.au3 sont lue avant les reste du code de Main.au3. Il est donc normal d'avoir cette erreur puisque au moment du parcour de LIB.au3 la variable n'a pas été initialisée. Si vous voulez qu'une variable $x soit globale, vous devez la déclarer avant la/les ligne(s) #Include !!! Ou la déclarer au début du premier include (LIB.au3 dans votre cas) !
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é".
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#14

Message par k3nix »

J'avais fait un message avec tout es petit pour que je puisse supprimer les autres et garder uniquement le gros mais je n'ai pas pu supprimer les autres petit, ce n'est pas du tout que je n'ai pas compris.

je vais vous mettre mon vrai code avec quelques fonctions en moins


Le "MAIN"
► Afficher le texte
Le "LIB"
► Afficher le texte
voilà voilà le script est sensé télécharger la dernière version de Teamspeak et de l'installer dans ces fichier il n'y a pas le reste des fonctions car en développement juste ce problème qui me tracasse des variables, peut etre ai-je mal placé mes déclarations ou min include ??

je sais aussi que en mttant tout dans un seul fichier cela ne marche pas non plus.. merci pour ceux qui jettent un coup d’œil.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#15

Message par Tlem »

Bonjour.
J'ai jeté un œil rapide sur votre code et voici pour commencer le problèmes constatés :

- Problème dans LIB.au3, dans la fonction supprlettres() ! Un EndIf en trop.

- Vous déclarez la LIB.au3 dans Main seulement après avoir construit la GUI. :shock: Vous ne tenez pas compte de mes recommandations quand à la déclaration de LIB.au3 et de vos variables globales ...

- Vous déclarez une variable globale dans une fonction de LIB.au3.


Comme il vous faut un dessin, essayez ceci :[spoiler="Solution N°1]Main.au3

Code : Tout sélectionner

AutoItSetOption("MustDeclareVars", 1)

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#include "Lib_TeamscriptV2.au3"

... Le reste de votre code
 
Lib_TeamscriptV2.au3

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <Inet.au3>
#include <Array.au3>

[color=#FF0000]; Déclarez ici toutes les variables globales qui doivent être utilisée dans Main.au3 et Lib_TeamscriptV2.au3
Global $installDir, $1serveur, $2serveur, $3serveur
Global $ping0, $ping1, $ping2, $ping3
Global $Edit1
; Je vous laisse continuer le reste des déclarations (y compris celle de l'interface de Main et autres variables globales.[/color]

Func InfoPc()
    Local $return
    $installDir = @ProgramFilesDir
    $return = "Vous utilisez : " & @OSVersion & @CRLF & "Architecture : " & @OSArch & @CRLF & "Dossier d'installation : " & @CRLF & $installDir & @CRLF
    Return $return
EndFunc   ;==>InfoPc

; Le reste de votre code
Global
[/spoiler]Ou ceci :
[spoiler="Solution N°2]Main.au3

Code : Tout sélectionner

AutoItSetOption("MustDeclareVars", 1)

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

[color=#FF0000]; Déclarez ici toutes les variables globales qui doivent être utilisée dans Main.au3 et Lib_TeamscriptV2.au3
Global $installDir, $1serveur, $2serveur, $3serveur
Global $ping0, $ping1, $ping2, $ping3
Global $Edit1
; Je vous laisse continuer le reste des déclarations (y compris celle de l'interface de Main et autres variables globales.
[/color]
#include "Lib_TeamscriptV2.au3"

... Le reste de votre code
 
Ou plus simplement :

Code : Tout sélectionner

AutoItSetOption("MustDeclareVars", 1)

[color=#FF0000]; Déclarez ici toutes les variables globales qui doivent être utilisée dans Main.au3 et Lib_TeamscriptV2.au3
Global $installDir, $1serveur, $2serveur, $3serveur
Global $ping0, $ping1, $ping2, $ping3
Global $Edit1
; Je vous laisse continuer le reste des déclarations (y compris celle de l'interface de Main et autres variables globales.[/color]

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#include "Lib_TeamscriptV2.au3"

... Le reste de votre code
 
Lib_TeamscriptV2.au3

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <Inet.au3>
#include <Array.au3>

Func InfoPc()
    Local $return
    $installDir = @ProgramFilesDir
    $return = "Vous utilisez : " & @OSVersion & @CRLF & "Architecture : " & @OSArch & @CRLF & "Dossier d'installation : " & @CRLF & $installDir & @CRLF
    Return $return
EndFunc   ;==>InfoPc

; Le reste de votre code
Global
[/spoiler]

Évidemment, en adoptant ce type de fonctionnement, vous n'avez plus besoin de re-déclarer une variable globale ailleurs. Il vous suffira de lui assigner une valeur est c'est tout. Si pour une raison quelconque vous avez besoin de créer une nouvelle variable, alors rajoutez là à la liste du début de script (dans Main ou dans Lib selon la solution adoptée).

Prenez aussi l'habitude de déclarer vos variables locales en début de fonction. Cela vous évitera des déboires sur des fonctions dont le code est plutôt long car il n'est pas évident de rechercher une déclaration dans 50 lignes de code alors que si c'est en début, on cherche moins. :roll:
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é".
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#16

Message par k3nix »

ok pour la solution de declarer les variables toutes au même endroit, donc ça veut dire que je vais initialiser mes variables apres les includes et avant la GUI en mettent global pour les variables globales et en enlevant les "declarations intégrée" dans ma GUI si j'ai bien compris ?

vous me suivez ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Re : [..] Appeler une variable du MAIN

#17

Message par Tlem »

C'est bien ça.
Le mieux dans votre cas serait la première version de la solution N°2.
Vous déclarez d'abord les includes intégrés à AutoIt puis vos variables globales (de tous vos fichiers includes au3) et enfin vous déclarez vos includes perso. Vous pouvez aussi regrouper les includes AutoIt de votre LIB.au3 dans votre Main.au3 puisque LIB est déclaré après les includes AutoIt et donc l'initialisation de toutes les variables et fonctions dédiées.

L'avantage de déclarer vous variables après les includes AutoIt, c'est que si une variable est déjà utilisée par l'un des includes, SciTE vous préviendra et cela évitera des problèmes futur.


Envoyé depuis mon appareil mobile.
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
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#18

Message par jchd »

Le plus clair pour un projet d'envergure significative est de créer un fichier regroupant toutes les variables globales et de l'inclure avec #include-once en tête (au cas où) comme le suggère Tlem, après les directives de compilation puis les includes standard et avant les includes utilisateur (comportant chacune un #include-once bille en tête, toujours au cas où).

Ne jamais déclarer de globales dans une fonction.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
k3nix
Niveau 2
Niveau 2
Messages : 15
Enregistré le : mar. 03 sept. 2013 23:20
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#19

Message par k3nix »

Bon j'ai appliqué vos conseils, les variables ne sont plus déclarés dans les fonctions le endif en trop est parti mais il y a toujours le $menuitem3 qui ne se croit pas déclaré alors qu'elle est declaré juste avent le #include LIB alors que c'est une variable de la GUI !!!

voici le code actuel
► Afficher le texte
LIB
► Afficher le texte
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Appeler une variable du MAIN

#20

Message par Tlem »

Je vois que vous ne prenez en compte que 30% de nos recommandations !!!

Les variables et les Includes sont à déclarer en début de script.

En ce qui me concerne, même si votre script n'est pas vraiment sous une forme standard, il est fonctionnel. Le message que vous avez provient probablement de la console SciTE lorsque vous testez votre LIB, car si vous le testez tel quel, il ne connait effectivement pas les variables globales déclarées dans Main.au3 ! Lib_TeamscriptV2.au3 ne peux être testé qu'au travers de Main.au3 puisque les variables globales sont déclarées dans ce dernier. La portée d'une variable globale ne va pas plus loin que ce qui est déclaré.

Si vous voulez contourner ce comportement normal, alors déclarez toutes vos variables dans un 3ieme fichier (Var_TeamscriptV2.au3) et rajoutez au tout début de Main.au3 et Lib_TeamscriptV2.au3 la ligne :

Code : Tout sélectionner

#include-once "Var_TeamscriptV2.au3"
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é".
Répondre