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 :

Undefined qui est "defined"


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut Undefined qui est "defined"
    Bonjour à tous,

    Je dois réaliser un projet en javascript or j'ai une erreur qui me bloque.
    On me dit que mon tableau nommé global n'est pas défini quand je l'appelle dans une fonction.
    Vous auriez une idée ??

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    var global = new Array();
    var nbCase = window.prompt("Entrez le nombre de cases que vous voulez pour votre tableau");
    var test=nbCase*nbCase;
     
    	function TBL_virtuel() {
    		for (var x=0; x<nbCase; x++) {
    			global[x] = new Array();
    			for (var y=0; y<nbCase; y++) {
     
    					global[x][y]="vide"; 
    			}	
    		}
    		return global;
    	}
     
    		function afficher()
    	{
    		var p=0;
    		var coef=0.80;
    		var nombreAs = nbCase*coef;
    		var cellules = document.getElementsByTagName('td');
    		for (var x=0; x<nbCase; x++) {
    			for (var y=0; y<nbCase; y++) {
    				calcul_place_A(global);
    				calcul_place_B();
    			}
    		}
    	}
     
    	function calcul_place_A () {
    		var p=0;
    		var nombreAs = test/8.1;
    		Math.round(nombreAs);
    			do {
    				var aleatoire = Math.random();
    				var aleatoi = Math.random();
    				var placeX = Math.round(aleatoire * nbCase);
    				var placeY = Math.round(aleatoi * nbCase);
    				if ((placeX>0) && (placeX<=nbCase) && (placeY>0) && (placeY<=nbCase)) {
    				global[placeX][placeY]="As";
    				alert (global[placeX][placeY]);
    				}
     
    				p++;
    			} while (p<nombreAs);
    		//document.write(global);
    		return global;
    	}
     
     
    	function calcul_place_B () {
     
    			if ((x>0)&&(y>0)&&(global[x-1][y-1]!="As"))
    				{
    					global[x-1][y-1]++;
    				}
     
    				if ((x>0)&&(y>0)&&(global[x][y-1]!="As"))
    				{
    					global[x][y-1]++;
    				}
     
    				if ((x<nbCase-1)&&(y>0)&&(global[x+1][y-1]!="As"))
    				{
    					global[x+1][y-1]++;
    				}
     
    				if ((x>0)&&(y>0)&&(global[x-1][y]!="As"))
    				{
    					global[x-1][y]++;
    				}
     
    				if ((x>0)&&(y>0)&&( global[x][y]!="As"))
    				{
    					global[x][y]++;
    				}
     
    				if ((x<nbCase-1)&&(y>0)&&(global[x+1][y]!="As"))
    				{
    					global[x+1][y]++;
    				}
     
    				if ((x>0)&&(y<nbCase-1)&&(global[x-1][y+1]!="As"))
    				{
    					global[x-1][y+1]++;vivant++;
    				}
     
    				if ((x>0)&&(y<nbCase-1)&&(global[x][y+1]!="As"))
    				{
    					global[x][y+1]++;
    				}
     
    				if ((x<nbCase-1)&&(y<nbCase-1)&&(global[x+1][y+1]!="As"))
    				{
    					global[x+1][y+1]++;
    				}
     
     
    	document.write(global);
    	}

  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,
    comme ton Array "global" est déclaré en variable .... globale ( ), il faut enlever les "return global;" à la fin de tes fonctions ...
    De plus ces return ne sont visiblement pas "attendus" par la fonction appelante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul_place_A(global);
    Ne le passe pas en paramètre : c'est une variable globale (donc visible de toutes les fonctions).

    De plus, bien que pas tout à fait compris le but de ton script, tu ne confondrais pas Array et <table> ?

    Et que comptes-tu obtenir avec sachant que global[x-1][y-1] contient du caractère ?

    A+

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour,

    - déjà tu peux supprimer les return global dans la mesure où ton tableau est une variable globale (en plus dans ton code tu ne récupères pas ce que retourne les fonctions).

    - dans ta fonction afficher() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul_place_A(global);
    supprime le paramètre car d'après sa définition, calcul_place_A() n'a pas de paramètres

    - pour faire du débogage, utilise plutôt alert() ou innerHTML sur un élément présent dans ta page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("idElement").innerHTML = global
    banni le document.write() !!


    Ensuite :
    1- A quoi sert ce code ?
    2- comment sont appelées les différentes fonctions (événements qui les appellent, dans quel ordre sont-elles exécutées) ?
    3- Perds l'habitude de déclarer tes variables dans des boucles, le programme perd de sa clarté et ça me donne des boutons ces de déclarations variables qui se baladent à droite et à gauche. Déclare tes variables au début de tes fonctions, tu gagneras en lisibilité et sans doute en performance.


    [edit]

    E.Bzz : nos messages se sont croisés

    [/edit]

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    Merci de ton aide mais j'ai toujours cette erreur dans firefox "global[placeX] is undefined"

    Pour le tableau global[placeX] j'avais oublier que mon tableau avait vide par défaut...

    en ce qui concerne le code, il doit me servir de base pour faire un démineur, sachant que pour le moment rien n'est affiché en html, l'appel au dom se fera en dernier.

  5. #5
    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 Auteur Voir le message
    E.Bzz : nos messages se sont croisés
    J'ai failli crier au plagiat

  6. #6
    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 rollergirl Voir le message
    Merci de ton aide mais j'ai toujours cette erreur dans firefox "global[placeX] is undefined"
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var placeX = Math.round(aleatoire * parseInt(nbCase, 10));
    car nbCase est du string à l'origine (prompt() ).

    En respectant bien sûr les conseils d'Auteur pour les déclarations

    A+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    Je viens de tester en changeant avec parsint mais sa m'affiche toujour la même erreur... :/

    La fonction parsint sert bien à lui dire que le pront saisie est un chiffre mais a quoi sert le 10 ?

    Pour la déclaration des varaibles c'est mieux ainsi ?

    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
    	function calcul_place_A () {
     
    	// Déclaration des variables utiliser pour cette fonction
    		var aleatoire;
    		var aleatoi;
    		var placeX;
    		var placeY;
    		var p=0;
    		var nombreAs = test/8.1;
    		Math.round(nombreAs);
    			do {
    				aleatoire = Math.random();
    				aleatoi = Math.random();
    				placeX = Math.round(aleatoire * parseInt(nbCase, 10));
    				placeY = Math.round(aleatoi * parseInt(nbCase, 10));
    				if ((placeX>0) && (placeX<=nbCase) && (placeY>0) && (placeY<=nbCase)) {
    				global[placeX][placeY]="A";
    				//alert (global[placeX][placeY]);
    				}
     
    				p++;
    			} while (p<nombreAs);
     
    	}

  8. #8
    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 rollergirl Voir le message
    Je viens de tester en changeant avec parsint mais sa m'affiche toujour la même erreur... :/
    Tu as essayé de changé le nom de ton Array (sait-on jamais) ?

    Citation Envoyé par rollergirl Voir le message
    La fonction parsint sert bien à lui dire que le pront saisie est un chiffre mais a quoi sert le 10 ?
    C'est pour indiquer une conversion en base 10. Sans ça un bug de la fonction fait que certaines valeurs sont converties dans une autre base (hexa, octale ...) en fonction du 1° caractère de la valeur à convertir. Il y a un thread sur ce problème je crois ...

    Citation Envoyé par rollergirl Voir le message
    Pour la déclaration des varaibles c'est mieux ainsi ?


    A+

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    Citation Envoyé par E.Bzz Voir le message
    Tu as essayé de changé le nom de ton Array (sait-on jamais) ?
    J'ai déja tester et malheureusement sa ne fonctionne pas... toujours le même message d'erreur

    Tu ne sais pas d'ou sa peut venir ???

  10. #10
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    à ce stade j'essaierai d'isoler l'erreur, commente presque la totalité de ton
    code et essaie de laisser juste des choses dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var global = new Array();
    global[0] = new Array();
    global[0][0] = "A";
    function calcul_place_A() {
    	alert(global[0][0]);		
    }
    calcul_place_A();
    Si ça fonctionne, alors décommente petit à petit par section jusqu'à trouver
    la section qui pose problème et reviens avec ça ici si tu n'as pas trouvé.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    Bon je viens de tout tester et le problème semble vraiement venir de ma fonction calcul_place_Acar même avec ce code sa marche pas

    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
    32
    33
    34
    var global = new Array();
    var nbCase = window.prompt("Entrez le nombre de cases que vous voulez pour votre tableau");
    var test=nbCase*nbCase;
     
    	function init() {
     
    		calcul_place_A();
    	}
     
     
    	function calcul_place_A () {
     
    	// Déclaration des variables utiliser pour cette fonction
    		var aleatoire;
    		var aleatoi;
    		var placeX;
    		var placeY;
    		var p=0;
    		var nombreAs = test/8.1;
    		Math.round(nombreAs);
    			do {
    				aleatoire = Math.random();
    				aleatoi = Math.random();
    				placeX = Math.round(aleatoire * parseInt(nbCase, 10));
    				placeY = Math.round(aleatoi * parseInt(nbCase, 10));
    				if ((placeX>0) && (placeX<=nbCase) && (placeY>0) && (placeY<=nbCase)) {
    				global[placeX][placeY]="A";
    				//alert (global[placeX][placeY]);
    				}
     
    				p++;
    			} while (p<nombreAs);
     
    	}

  12. #12
    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
    ça serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombreAs=Math.round(nombreAs);


    Et pour pas être embêté partout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var nbCase = parseInt(window.prompt("Entrez le nombre de cases que vous voulez pour votre tableau"), 10);
    Comme ça plus besoin de conversion par la suite ...
    Parce que sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var test=nbCase*nbCase;
    n'est pas bon non plus ...

    A+

  13. #13
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    Il te faut savoir que les tableaux multidimensionnels se gèrent
    en javascript un peu différemment que dans d'autres langages.

    Les tableaux à deux dimensions ne sont pas des grilles, se sont
    des tableaux contenant des tableaux

    En écrivant global[placeX][placeY] tu pensait écrire à la position X et Y
    mais global[placeX] n'est pas initialisé et tu essaies d'accéder au tableau
    de niveau 2 sans l'avoir initialisé.

    tu peux essayer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(typeof global[placeX] == undefined) global[placeX] = []; // ou new Array()
    global[placeX][placeY]="A";

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    E.Bzz >> J'ai bien changer le type de la variable attendu en prompt mais sans résultats..



    Citation Envoyé par marcha Voir le message
    Salut,


    En écrivant global[placeX][placeY] tu pensait écrire à la position X et Y
    mais global[placeX] n'est pas initialisé et tu essaies d'accéder au tableau
    de niveau 2 sans l'avoir initialisé.
    En faites on m'avait vaguement parler de ce phènomène (qui est casse pied) mais en faite mon tableau est déclaré dans la fonction TBL_virtuel.

    L'ajout de ton code n'a rien changer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function TBL_virtuel() {
    		for (var x=0; x<nbCase; x++) {
    			global[x] = new Array();
    			for (var y=0; y<nbCase; y++) {
     
    					global[x][y]="vide"; 
    			}	
    		}
     
    	}
    En tout cas merci de tenter de m'aider je suis en train de désespérer...

  15. #15
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par rollergirl Voir le message
    L'ajout de ton code n'a rien changer...
    Oui j'ai fait une petite erreur, undefined doit être entre guillemets.

    voici un code qui marche chez moi, essaye de voir si c'est le cas chez toi aussi:

    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
    32
    33
    34
    35
    36
    37
     
    var global = new Array();
    var nbCase = window.prompt("Entrez le nombre de cases que vous voulez pour votre tableau");
    var test=nbCase*nbCase;
     
    	function init() {
     
    		calcul_place_A();
    	}
     
     
    	function calcul_place_A () {
     
    	// Déclaration des variables utiliser pour cette fonction
    		var aleatoire;
    		var aleatoi;
    		var placeX;
    		var placeY;
    		var p=0;
    		var nombreAs = test/8.1;
    		Math.round(nombreAs);
    			do {
    				aleatoire = Math.random();
    				aleatoi = Math.random();
    				placeX = Math.round(aleatoire * parseInt(nbCase, 10));
    				placeY = Math.round(aleatoi * parseInt(nbCase, 10));
    				if ((placeX>0) && (placeX<=nbCase) && (placeY>0) && (placeY<=nbCase)) {
    				if(typeof global[placeX] == 'undefined') global[placeX] = [];
    				global[placeX][placeY]="A";
    				}
     
    				p++;
    			} while (p<nombreAs);
     
    	}
     
    	init();

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Par défaut
    Merci sa marche enfin...

    Si jamais le problème se repose plus loin dans mon script je peux me débugger avec ce petit if ?

  17. #17
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    Bon je crois avoir trouvé qqch, quand tu initialises le tableau
    tu crée les indices 0, 1, 2, ... nbCase-1, soit pour nbCase = 4
    ce serait les indices 0,1,2,3

    Dans calcul_place_A() tu as ce test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	if ((placeX>0) && (placeX<=nbCase) && (placeY>0) && (placeY<=nbCase))
    Et là tu accepte l'indice 4 avec un placeX<=4, il faudrait peut-être un "<" non ?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par défaut
    Eh, moi aussi j'ai un tableau à plusieurs dimensions, qui est créé et retourné à la fin d'une fonction, IE le retourne sans problèmes, et FF le considère "undefined".

  19. #19
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par briegel Voir le message
    Eh, moi aussi j'ai un tableau à plusieurs dimensions, qui est créé et retourné à la fin d'une fonction, IE le retourne sans problèmes, et FF le considère "undefined".
    Tu as fait une erreur à la ligne 12 de ton script

    Plus sérieusement : si tu ne postes pas ton code, on ne pourra pas t'aider...

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