Page 1 sur 1

[..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 03:43
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 ??

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 07:23
par Ks10
Tu a essayer :

Code : Tout sélectionner

#include <LIB.au3>
Au lieu de :

Code : Tout sélectionner

#include <LIB>
?

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 08:26
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...

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 08:48
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.

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

Posté : mar. 05 août 2014 09:01
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.

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 15:07
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

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 15:30
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

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 15:31
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 :(

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 15:37
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

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 15:39
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 :)

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

Posté : mar. 05 août 2014 15:43
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 :)

Re: [..] Appeler une variable du MAIN

Posté : mar. 05 août 2014 16:09
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.

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

Posté : mar. 05 août 2014 23:07
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) !

Re: [..] Appeler une variable du MAIN

Posté : dim. 10 août 2014 15:13
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.

Re: [..] Appeler une variable du MAIN

Posté : dim. 10 août 2014 18:35
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:

Re: [..] Appeler une variable du MAIN

Posté : dim. 10 août 2014 22:30
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 ?

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

Posté : dim. 10 août 2014 22:56
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.

Re: [..] Appeler une variable du MAIN

Posté : dim. 10 août 2014 23:54
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.

Re: [..] Appeler une variable du MAIN

Posté : lun. 11 août 2014 01:19
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

Re: [..] Appeler une variable du MAIN

Posté : lun. 11 août 2014 09:43
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"