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 :

Fonction en paramètre d'une fonction, comment ça fonctionne ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 310
    Billets dans le blog
    8
    Par défaut Fonction en paramètre d'une fonction, comment ça fonctionne ?
    Bonsoir tout le monde

    J'aimerais adapter un code JavaScript au langage PureBasic, dont le tutoriel se trouve ici :
    http://rembound.com/articles/how-to-...h-html5-canvas

    Et le code complet ici:
    https://github.com/rembound/Match-3-...ch3-example.js

    L'adaptation se passe plutôt bien, mais je bloque sur un truc bizarre pour le néophyte que je suis.
    J'ai du mal à comprendre ce qu'il se passe dans cette portion de 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // Loop over the cluster tiles and execute a function
        function loopClusters(func) {
            for (var i=0; i<clusters.length; i++) {
                //  { column, row, length, horizontal }
                var cluster = clusters[i];
                var coffset = 0;
                var roffset = 0;
                for (var j=0; j<cluster.length; j++) {
                    func(i, cluster.column+coffset, cluster.row+roffset, cluster);
     
                    if (cluster.horizontal) {
                        coffset++;
                    } else {
                        roffset++;
                    }
                }
            }
        }
     
        // Remove the clusters
        function removeClusters() {
            // Change the type of the tiles to -1, indicating a removed tile
            loopClusters(function(index, column, row, cluster) { level.tiles[column][row].type = -1; });
     
            // Calculate how much a tile should be shifted downwards
            for (var i=0; i<level.columns; i++) {
                var shift = 0;
                for (var j=level.rows-1; j>=0; j--) {
                    // Loop from bottom to top
                    if (level.tiles[i][j].type == -1) {
                        // Tile is removed, increase shift
                        shift++;
                        level.tiles[i][j].shift = 0;
                    } else {
                        // Set the shift
                        level.tiles[i][j].shift = shift;
                    }
                }
            }
    }
    dans function loopClusters(func), apparemment il y a une fonction en paramètre ?
    qu'on retrouve un peu plus loin
    func(i, cluster.column+coffset, cluster.row+roffset, cluster);

    Qu'est-ce que cette ligne fait exactement ?


    dans function removeClusters(), il y a cet appel qui m'intrigue
    loopClusters(function(index, column, row, cluster) { level.tiles[column][row].type = -1; });

    Qu'est-ce que ça veut dire exactement ??

    Quelqu'un pourrait m"expliquer ? me mettre sur une piste ?
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    La fonction loopClusters(func) doit recevoir une fonction dans le paramètre func. Cette fonction est appelée par l'instruction func(i, cluster.column+coffset, cluster.row+roffset, cluster);.

    Dans le corps de la fonction removeClusters on appelle la fonction loopClusters et on lui passe en paramètre la fonction anonyme function(index, column, row, cluster) { level.tiles[column][row].type = -1; }. Cette fonction anonyme attend 4 paramètres (index, column, row, cluster), le corps de la fonction anonyme manipule l'objet level : level.tiles[column][row].type = -1;.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 310
    Billets dans le blog
    8
    Par défaut
    J'étais en train de me répondre, je viens seulement de lire ta réponse. Je vais la relire plusieurs fois pour être sûr de bien comprendre, mais en première lecture il me semble que je n'étais pas trop déconnant dans mon explication. MErci à toi ça me conforte dans mon analyse.

    Reste à comprendre pourquoi 4 paramètres alors que la fonction anonyme n'en utilise que 2 ? Et aussi pourquoi faire un truc aussi tordu alors que ça pourrait s'écrire comme ça (en supprimant le paramètre de loopClusters ?

    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
    // Loop over the cluster tiles And execute a function
        function loopClusters() {
            For (var i=0; i<clusters.length; i++) {
                //  { column, row, length, horizontal }
                var cluster = clusters[i];
                var coffset = 0;
                var roffset = 0;
                For (var j=0; j<cluster.length; j++) {
                    level.tiles[cluster.column+coffset][cluster.row+roffset].type = -1
     
                    If (cluster.horizontal) {
                        coffset++;
                    } Else {
                        roffset++;
                    }
                }
            }
         }
     
      // Remove the clusters
        function removeClusters() {
            // Change the type of the tiles To -1, indicating a removed tile
            loopClusters();
    ...
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  4. #4
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 310
    Billets dans le blog
    8
    Par défaut
    Je me lance, je tente une explication (merci de me corriger, c'est sûrement truffé d"erreurs)

    Dans la fonction removeClusters(), on commence par appeler la fonction loopClusters(), avec en paramètre la fonction
    function(index, column, row, cluster) {
    level.tiles[column][row].type = -1;
    }

    Déjà je ne comprends pas pourquoi il y a 4 paramètres à cette fonction, si elle n'en utilise que 2 (column et row) ?

    Ensuite dans la fonction loopClusters(), on appelle la fonction function(index, column, row, cluster) en précisant les paramètres à utiliser --> func(i, cluster.column+coffset, cluster.row+roffset, cluster);

    Y'a de ça , ou je suis dans les choux ?
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  2. Passage de fonction en paramètre d'une fonction.
    Par Berzerk_ dans le forum C++
    Réponses: 9
    Dernier message: 04/06/2007, 13h31
  3. fonction en paramètre d'une fonction ?
    Par tuxout dans le forum Général Python
    Réponses: 1
    Dernier message: 02/06/2007, 15h54
  4. fonction comme paramètre d'une fonction
    Par velociraptor5679 dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2006, 18h19
  5. Réponses: 4
    Dernier message: 01/12/2005, 12h33

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