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 :

Message d'erreur : no properties


Sujet :

JavaScript

  1. #1
    Membre actif
    Inscrit en
    Décembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 29
    Par défaut Message d'erreur : no properties
    J'ai eu le message "TypeError: genome[a] has no properties, line 18" avec le code suivant (je me lance dans un algorithme génétique, d'où les noms). La ligne 18 est celle de la première instruction dans la boucle for.

    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
     
    var population = 10;
    var numGenes = 55;
    // déclaration du génome et remplissage par valeurs à zéro
    var genome = [[1,2], [1, 2]];
    genome.length = population;
    for (var a = 0 ; a < population; a++) {
        genome[a].length = numGenes;
        for (var b = 0 ; b < numGenes; b++) {
            genome[a][b] = 0.;
        };
    };
    post ("Taille du génome : "+genome.length);
    post();
    post ("Génome : "+genome);
    post();
    La définition du tableau avec [[1,2], [1, 2]] plutôt qu'avec new Array et l'utilisation de la propriété length sont déjà des tentatives d'échapper au fatidique message d'erreur, mais cela ne marche pas.

    Où est le problème?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    a priori, problème de multi-déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (var a = 0 ; a < population; a++) {
        genome[a].length = numGenes;
        for (var b = 0 ; b < numGenes; b++) {
            genome[a][b] = 0.;
        };
    };
    var b est redéclaré à chaque itération de la boucle supérieure.
    => enlève le var.

    Et n'essaye pas de modifier le length de cette façon. Alimente ton tableau, et le length suivra

    A+

  3. #3
    Membre Expert 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
    Par défaut
    Salut,

    C'est simple tu définis un tableau genome avec deux éléments. Ensuite tu affectes une taille de 10 à ce même tableau. On boucle donc 10 fois sur genome dans lequel 8 éléments undefined sont déclarés pour remplir le tableau jusqu'à 10. Or, undefined n'a pas de propriété length.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par franculo_caoulene Voir le message
    Salut,

    C'est simple tu définis un tableau genome avec deux éléments. Ensuite tu affectes une taille de 10 à ce même tableau. On boucle donc 10 fois sur genome dans lequel 8 éléments undefined sont déclaré pour remplir le tableau jus'à 10. Or, undefined n'a pas de propriété length.
    +1, tu te trompes dans l'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genome.length = population;
    Là tu dis que la taille de ton tableau est 10, il faut plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    population = genome.length;
    Là tu indiques que population vaut la taille de ton tableau.
    Idem pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genome[a].length = numGenes;
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre actif
    Inscrit en
    Décembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 29
    Par défaut ¿No comprendo?
    Bon, là je ne comprends plus.

    1. Je me trompe ou ce qu'à écrit E.Bzz n'est pas juste ? Même en faisant une déclaration implicite de b comme suggéré, cela ne résoud rien.

    2. Le but de mes variables population et numGenes est de définir les dimensions du tableau et pas le contraire. Donc, si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    population = genome.length;
    je modifie population en fonction de la taille du tableau, non?

    Bon, j'ai modifié le code comme suit et j'ai toujours la même erreur mais cette fois-ci liée à la ligne "for (b = 0 ; ...".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var population = 10;
    var numGenes = 55;
    // déclaration du génome et remplissage par valeurs à zéro
    var genome = new Array();
    for (var a = 0; a < population; a++) {
        for (b = 0 ; b < numGenes; b++) {
            genome[a][b] = 0.;
        };
    };

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par amundsen Voir le message
    Le but de mes variables population et numGenes est de définir les dimensions du tableau
    Je vois mal l'intérêt de fixer les dimensions d'un tableau déjà défini (donc qui a des dimensions adaptées) mais si c'est une contrainte, il faut que tu testes à chaque itération si l'élément sur lequel tu pointes existe réellement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (var a = 0; a < population; a++) {
      if(genome[a]) {
        for (b = 0 ; b < numGenes; b++) {
          if(genome[a][b]){
            genome[a][b] = 0.;
          }
      }
        };
    };

    EDIT :
    Si ton but est de remplir ton tableau de valeurs par défaut, tu peux faire le contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (var a = 0; a < population; a++) {
      if(!genome[a]) {
        genome[a] = [];
        for (b = 0 ; b < numGenes; b++) {
          if(!genome[a][b]){
            genome[a][b] = 0.;
          }
      }
        };
    };
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre actif
    Inscrit en
    Décembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 29
    Par défaut Ça marche, mais je ne suis pas sûr d'avoir tout compris...
    Citation Envoyé par Bovino Voir le message
    Je vois mal l'intérêt de fixer les dimensions d'un tableau déjà défini (donc qui a des dimensions adaptées) mais si c'est une contrainte, il faut que tu testes à chaque itération si l'élément sur lequel tu pointes existe réellement.
    EDIT :
    Si ton but est de remplir ton tableau de valeurs par défaut, tu peux faire le contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (var a = 0; a < population; a++) {
      if(!genome[a]) {
        genome[a] = [];
        for (b = 0 ; b < numGenes; b++) {
          if(!genome[a][b]){
            genome[a][b] = 0.;
          }
      }
        };
    };
    Mon but est en effet de remplir le tableau, mais est-ce que j'ai bien compris :
    1. Les tests visent à vérifier que les cases du tableau existent réellement ? Ou bien existent-elles mais sont vides ?
    2. Les cases n'existent pas parce que je n'ai pas dimensionné mon tableau préalablement ?

    Donc, la question est : est-ce que j'aurais pu procéder autrement pour dimensionner mon tableau, sachant que je travaille avec un tableau multidimensionnel ? Entretemps j'ai trouvé un script pour définir une fonction de création de tableaux multidimensionnels et cela semble fonctionner, mais y avait-il un autre système, avec lequel remplir le tableau au moment de sa création?

    J'espère ne pas être trop insistant, mais j'ai vraiment envie de comprendre, afin que le problème ne se répète plus. Cela me semble important.

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par amundsen Voir le message
    Mon but est en effet de remplir le tableau, mais est-ce que j'ai bien compris :
    1. Les tests visent à vérifier que les cases du tableau existent réellement ? Ou bien existent-elles mais sont vides ?
    Dans mon 2e exemple (le bon) les tests servent au contraire à vérifier que l'entrée n'existe pas.
    Dans la première boucle, si genome[a] n'existe pas, je le définis en tableau vide, dans la seconde boucle, si genome[a][b] n'existe pas, je lui affecte la valeur par défaut.
    2. Les cases n'existent pas parce que je n'ai pas dimensionné mon tableau préalablement ?
    Elles n'existent pas car elles n'ont jamais eu de valeur, en affectant une dimension à un tableau existant, soit tu le tronques si la taille affectée est inférieure à la taille initiale, soit effectivement tu l'étends, mais avec des valeurs 'undefined'.

    Donc, la question est : est-ce que j'aurais pu procéder autrement pour dimensionner mon tableau, sachant que je travaille avec un tableau multidimensionnel ? Entretemps j'ai trouvé un script pour définir une fonction de création de tableaux multidimensionnels et cela semble fonctionner, mais y avait-il un autre système, avec lequel remplir le tableau au moment de sa création?
    Cela dépend de comment est construit ton tableau à la base...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par amundsen Voir le message
    1. Je me trompe ou ce qu'à écrit E.Bzz n'est pas juste ? Même en faisant une déclaration implicite de b comme suggéré, cela ne résoud rien.
    C'est une erreur, mais je n'ai pas dit que c'était la seule ...

    A+

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2015, 12h08
  2. [MySQL] Message d'erreur Undefined property: stdClass::
    Par Rony Rauzduel dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/10/2012, 11h03
  3. Message d'erreur à propos de log4j.properties
    Par zouuc dans le forum Logging
    Réponses: 8
    Dernier message: 03/06/2009, 10h44
  4. Réponses: 3
    Dernier message: 29/05/2008, 17h31
  5. Réponses: 3
    Dernier message: 08/02/2008, 20h02

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