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

JavaScript Discussion :

passage par référence d'un tableau en parametre de fonction


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut passage par référence d'un tableau en parametre de fonction
    Bonjour à tous,

    J'ai un petit soucis technique sur le passage par référence d'un tableau que je passe en paramètre de fonction.

    Ce que je voudrais faire : c'est modifier un tableau grâce à une fonction et garder les modifications dans le reste du script. Mais je n'obtiens pas le résultat du tableau modifié.

    Voici le code :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    var aParamG0=new Array();
    aParamG0[0]=1;
    aParamG0[1]=11;
    aParamG0[2]=12;
    aParamG0[3]=13;
    aParamG0[4]=15;
    aParamG0[5]=16;
     
    function changetableau (montableau)
    {
    	for(i=0; i<montableau.length; i++)
    	{
    		alert(montableau[i]);
    	}
    	montableau=new Array();
    	montableau[0]=0;
    	montableau[1]=1;
    	montableau[2]=2;
    }
    changetableau (aParamG0);
    for(i=0; i<aParamG0.length; i++)
    {
    	alert(aParamG0[i]);
    }
    Dans tous les cas, j'obtiens 1,11,12,13,15,16 alors que j'aimerais obtenir 1,11,12,13,15,16 puis 0,1,2.

    Je remarque que si je mets montableau=new Array(); en commentaire, je récupère bien les modifications, pour les 3 premières lignes.
    Donc ca vient de la réinitialisation du tableau, le pointeur perd la boule.
    Comment puis je vider "proprement" et de manière optimisée mon tableau, sachant que je peux avoir des tableaux qui ont plusieurs milliers de lignes.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montableau=new Array();
    tu instancies une nouvelle variable, tu dois faire référence a ton tableau d'origine car tu l'utilises en variable globale ( variable délcarée en dehors de toute fonction ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var aParamG0=new Array();
    si tu souhaites réinitialiser ton tableau :

    function changetableau ()
    {
    var TableauEmpty =new Array();
    return TableauEmpty;
    }

    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aParamG0 = changetableau ();
    si tu souhaites modifier les valeurs de ton tableau d'origine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function changetableau ()
    {
    	for(i=0; i<aParamG0.length; i++)
    	{
    		alert(aParamG0[i]);
    	}
    	aParamG0=new Array(); //Sans le mot clé VAR /!\
    	aParamG0[0]=0;
    	aParamG0[1]=1;
    	aParamG0[2]=2;
    }

    car une fois a l'intérieur de la méthode tu pointes sur un pointeur et non sur la variable ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    @le_chomeur
    Merci pour la réponse rapide.

    OK, mais même si dans la fonction, je suis avec un pointeur, si je change de variable en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montableau=new Array();
    mon pointeur "devrait" se mettre sur la nouvelle variable non?

    Toujours est il que la solution avec le return ne peut pas me satisfaire car :
    - Premièrement :
    je souhaites modifier les valeurs de ton tableau d'origine : mais la taille du tableau est variable et dans mon exemple, si j'enlève
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montableau=new Array();
    j'obtiens 0,1,2,13,15,16, les premières valeurs sont bien modifiées, mais je me tape encore les dernières comme le tableau est plus petit.

    - Ensuite, l'exemple de code que j'ai donné était là pour simplifier le problème, mais en fait dans changetableau(montableau), j'appelle d'autre fonctions qui utilisent le tableau ainsi modifié par référence.

    autrement dit en codé ca donnerait :
    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
    function changetableau (montableau)
    {
    	for(i=0; i<montableau.length; i++)
    	{
    		alert(montableau[i]);
    	}
    	montableau=new Array();
    	montableau[0]=0;
    	montableau[1]=1;
    	montableau[2]=2;
     
    	fonction2(montableau);
    	fonction3(montableau);
    }
     
    et en dehors de cette fonction d'autre traitement sur le tableau modifié

  4. #4
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Pas sûr d'avoir compris ce que tu cherches :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
    <head>
       <title>byref</title>
    	<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
       <style type="text/css">
     
       </style>
    </head>
    <body>
       <script type="text/javascript">
       var o = {
          aParamG0: [1,11,12,13,15,16],
          changetableau: function() {
             for(var i=0, imax=o.aParamG0.length; i<imax; i++) {
                alert(o.aParamG0[i]);
             }
             o.aParamG0 = [];
             o.aParamG0[0]=0;
             o.aParamG0[1]=1;
             o.aParamG0[2]=2;
          }
       }
       o.changetableau();
       for(var i=0, imax=o.aParamG0.length; i<imax; i++) {
          alert(o.aParamG0[i]);
       }
     
       </script>
    </body>
    </html>
    L'idée est de passer un objet ayant le tableau pour propriété plutôt que directement le tableau.

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    raison de plus pour travailler sur un tableau global ( rien n'empèche le passages de paramètres de remplissage ... )

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    ok pour le tableau global ou l'objet contenant le tableau en paramètre qui sont de bonnes solutions.

    Le soucis, c'est que je ne connais pas à l'avance le nom du tableau que je crée à la volée depuis php, je concatène le nom du tableau avec un id unique car j'ai plusieurs tableaux comme ça.

    Et c'est pour ca qu'après je veux passer le tableau par référence.

    En cherchant un bon moment, j'ai trouvé comment initialiser sans changement de variable :
    j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    montableau.length=0; // permet de réinitialiser le tableau
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    montableau= new Array(); // je perds le pointeur

  7. #7
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    tavariableglobal = new Array() donnait la même chose

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    @le_chomeur

    Oui, mais comme je ne connais pas le nom de la variable global (qui est concaténer de la sorte : montableau+(id que je ne connais uniquement dans mon source php).

    C'est pour ça que je souhaite utiliser un passage par référence car le fonction changetableau doit fonctionner pour TOUS mes tableaux et si j'utilise ta méthode c'est à dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tavariableglobal = new Array();
    Ma fonction changetableau ne sera pas générique, mais ne fonctionnera que pour le tableau : tavariableglobal

    Merci de m'avoir suivit.

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

Discussions similaires

  1. Passage par référence et tableau
    Par lmhaydii dans le forum C++
    Réponses: 7
    Dernier message: 05/09/2012, 21h13
  2. Réponses: 1
    Dernier message: 29/08/2011, 17h31
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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