IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

[WD28] - Avertissements sur les arguments de ma procédure


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut [WD28] - Avertissements sur les arguments de ma procédure
    Bonjour à tous,

    Je déclare deux variables en global dans ma fenêtre principale (FEN_Main) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gFichierXLS						est un xlsDocument
    gsCheminFichierXLS				est une chaîne	= INILit("config", "sCheminFichierXLS", "", gsCheminConfig)
    Ensuite, j'appel une procédure local avec ces 2 variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VérificationValiditeFichierImputationIT(gsCheminFichierXLS, gFichierXLS)
    Enfin, voici le contenu de ma procédure. Mon problème est que je ne comprends pas l'avertissement sur les paramètres/arguments de ma procédure. Surtout que tout marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    PROCÉDURE VérificationValiditeFichierImputationIT(gsCheminFichierXLS est une chaîne, gFichierXLS est un xlsDocument)
    	// Vérification fichier imputation - informatique.xlsx
    	SI fFichierExiste(gsCheminFichierXLS) ALORS
    		gFichierXLS = xlsOpen(gsCheminFichierXLS, xlsEcriture) 
    		SI gFichierXLS <> Null ALORS
    			// Le fichier excel existe et est bien valide donc on le ferme.
    			xlsFerme(gFichierXLS)
    			xlsFerme(gFichierXLS)
    		SINON
    			Error("Attention : Impossible d'initialiser le fichier Excel. Vérifier son emplacement et son nom.", ErreurInfo())
    			FinProgramme()
    		FIN
    	SINON
    		Error("Attention : Impossible d'initialiser le fichier Excel. Vérifier son emplacement et son nom.", ErreurInfo())
    		FinProgramme()
    	FIN
    L'avertissement :
    Nom : warning.png
Affichages : 102
Taille : 10,7 Ko

    Quelqu'un peut-il m'expliquer cet avertissement ?

    Merci pour votre aide,
    Bonne journée,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Comme le paramètre et la variable globale ont le même nom, Windev t'explique que le paramètre masque la variable globale dans le code de la procédure.

    Donc si dans ta procédure tu accèdes à gsCheminFichierXLS, se sera le paramètre et non la variable globale qui sera utilisé.

    Tatayo.

  3. #3
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Bonjour Tatayo,

    Du coup j'ai modifié le nom de mes deux arguments dans ma procédure et je n'ai plus l'avertissement. j'ai simplement enlever les préfix g de global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    PROCÉDURE VérificationValiditeFichierImputationIT(sCheminFichierXLS est une chaîne, FichierXLS est un xlsDocument)
    	// Vérification fichier imputation - informatique.xlsx
    	SI fFichierExiste(sCheminFichierXLS) ALORS
    		FichierXLS = xlsOpen(sCheminFichierXLS, xlsEcriture) 
    		SI FichierXLS <> Null ALORS
    			// Le fichier excel existe et est bien valide donc on le ferme.
    			xlsFerme(FichierXLS)
    			xlsFerme(FichierXLS)
    		SINON
    			Error("Attention : Impossible d'initialiser le fichier Excel. Vérifier son emplacement et son nom.", ErreurInfo())
    			FinProgramme()
    		FIN
    	SINON
    		Error("Attention : Impossible d'initialiser le fichier Excel. Vérifier son emplacement et son nom.", ErreurInfo())
    		FinProgramme()
    	FIN
    En gros si je passe des variables global dans la définition de mes procédures tout fonctionne car on a bien les bonnes valeurs mais les variables global ne seront pas modifié une fois sortie de la procédure ?
    Donc si notre procédure est uniquement une vérification de variables : c'est OK de mettre les mêmes noms dans la définition de la procédure ?
    Et dans le cas où on souhaite modifier la valeur de la variable global alors il faut absolument que dans la définition de la procédure on passe des variables avec des noms inconnu puis on joue à l'intérieur de la procédure avec la variable global ?

    Merci

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Il faudrait que tu déclares ton entête de procédure ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCÉDURE VérificationValiditeFichierImputationIT(chnCheminFichierXLS est une chaîne, xlsFichierXLS est un xlsDocument)
    Et pour les appels, tu ne changes rien.

    Mais come tu as des variables globales, tu pourrais faire un appel comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCÉDURE VérificationValiditeFichierImputationIT()
    Si tu t'aperçois que tes variables globales n'ont pas (plus) lieu d'être, le cas 1 est ce qu'il te faut.

    [EDIT] Tu as répondu entretemps, ce qui fait que pour moi, tu devrais faire l'appel sans argument. Mais j'avoue que ce n'est pas propre du tout.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Ok je crois que je saisie bien mieux la chose avec vos explications et je vous en remercie.

    Ce n'est pas propre de faire des procédure sans arguments ?

    Le but de la procédure VérificationValiditeFichierImputationIT est simplement de vérifier si le fichier Excel s'ouvre.
    Si c'est le cas je le referme.

    Le chemin et l'ID du fichier Excel sont en global car je les utilises hors de ma procédure VérificationValiditeFichierImputationIT() et dans des champs interne à la fenêtre.
    Par exemple, sur la fenêtre où ont été déclaré ces variables global, il y a un bouton "Afficher Excel" où j'utilisent ces variables. C'est pour cela que je les ais mises en variables global.
    Nom : explication.png
Affichages : 80
Taille : 27,0 Ko


    Bonne journée,

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par Aooka Voir le message
    En gros si je passe des variables global dans la définition de mes procédures tout fonctionne car on a bien les bonnes valeurs mais les variables global ne seront pas modifié une fois sortie de la procédure ?
    Non. Tu ne passes pas de variable globale dans la définition de ta procédure, tu ne fait que la définir, et nommer ses paramètres.
    Là comme les paramètres ont le même nom que des variables globales, Windev t'avertit que si te tentes d'accéder aux variables globales dans le code de ta procédure, tu accèderas en fait aux paramètres de celle-ci. La variable globale ne sera pas accessible.

    "Normalement" la procédure ne devrait pas accéder aux variables globales, mais uniquement à ses paramètres.
    Et comme par défaut dans Windev les paramètres sont passés par adresse (dixit l'aide en ligne), si tu modifies la valeur d'une paramètre dans la procédure, tu vas modifier la valeur de la variable qui a été passée en paramètre lors de l'appel de la procédure.

    Tatayo.

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut Passage par valeur vs Passage par adresse
    Bonjour,
    Contrairement à de nombreux autres langages, le WL utilise la passage par adresse.
    Dans un passage par adresse, si la variable passée en paramètre est modifiée à l'intérieur de la fonction/procédure, cette modification se répercutera dans le code appelant.
    Dans un passage par valeur, la valeur ne sera pas modifiée. Le passage par valeur doit être explicitement défini dans la déclaration de la fonction/procédure grâce au mot clé LOCAL.
    En ràgle générale, il est déconseillé d'utiliser les variables globales dans une fonction/procédure alors qu'un passage par adresse fait le même boulot.
    Exemple :
    Soient les fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FONCTION ParAdresse(nParamètre est entier) : entier
    nParamètre=2*nParamètre+1
     
    RENVOYER nParamètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FONCTION ParValeur(LOCAL nParamètre est entier) : entier
    nParamètre=2*nParamètre+1
     
    RENVOYER nParamètre
    Ces deux fonctions semblent similaires, toutefois, à l'utilisation on voit la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nVal1 est un entier
    nVal2 est un entier
     
    nRes1 est un entier
    nRes2 est un entier
     
    nVal1=2
    nVal2=2
     
    nRes1=ParAdresse(nVal1)
    Trace("Paramètre avant appel :2","Résultat :5","Paramètre après appel :5")
    nRes2=ParValeur(nVal2)
    Trace("Paramètre avant appel :2","Résultat :5","Paramètre après appel :2")
    On pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROCÉDURE ParAdresse_2(nParamètre est entier)
    nParamètre=2*nParamètre+1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    nVal1 est un entier
     
    nRes1 est un entier
     
    nVal1=2
     
    ParAdresse_2(nVal1)
    nRes1=nVal1
    Ainsi une fonction déclarée en C
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int MaFonction(int , int* nNoErr, char* saLibErr)
    devrait se déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FONCTION MaFonction(LOCAL nParamètre est entier, nNoErr est entier, saLibErr est chaine) : entier
    Dans les faits LOCAL est la plupart du temps omis et avec la permissivité de WL,on se retrouve le plus souvent avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCEDURE MaFonction(Paramètre,NoErr,LibErr)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  8. #8
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Merci pour tout ceux qui ont pris le temps de me répondre.
    Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Match sur les argument d une fonction.
    Par gomisse dans le forum Langages fonctionnels
    Réponses: 4
    Dernier message: 03/03/2015, 21h55
  2. Réponses: 2
    Dernier message: 28/03/2011, 15h47
  3. [Free Pascal] Exercice sur les fichiers typés et procédures
    Par osabri dans le forum Free Pascal
    Réponses: 2
    Dernier message: 17/01/2010, 11h50
  4. pointeurs sur les arguments des fonctions?
    Par brunoP dans le forum C
    Réponses: 3
    Dernier message: 14/05/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo