Parlons Arduino > Modélisation, Architectures logicielles et matérielles

Modélisation logicielle d'un réseau - le système de Jean-Luc

<< < (2/18) > >>

DDEFF:
J'ai bien conscience que ça va "polluer" ton exposé, mais je me pose quelques questions :

--- Code: ---#ifdef __AVR__
#include <avr/pgmspace.h>
#endif

#ifndef __AVR__
#include <iostream>
#define F(string) string
#define PROGMEM
--- Fin du code ---
Je ne connais pas ___AVR__ ?

Le simple fait de mettre #define DEBUG au début suffit pour pouvoir afficher les essais ?
Tu mets les sorties Serial.print() entre #ifdef DEBUG .... #endif et elles sont affichées et si tu dévalides le #define DEBUG pour ne plus les afficher.
C'est sympa, ça.

J'ai adoré le :

--- Code: ---void afficheLigne(byte nb)
{
  while(nb--) {
    Serial.print('-');
  }
  Serial.println();
}
--- Fin du code ---
C'est tout bête, mais marrant.

Et, dans mes efforts pour comprendre les pointeurs, je choisis "venantDe". Exemple :

--- Code: ---bool Aiguillage::creeCheminVers(byte identifiant, byte dir, Voie *venantDe)
{
  if (idVoie() == identifiant) return true;
  else {
    if (direction() == dir) {
      if (mVoieSortantDroit != NULL) {
        if (mVoieSortantDroit->creeCheminVers(identifiant, dir, this)) {
          afficheNomVoie(idVoie());
          Serial.println(F(": droit"));
          return true;
        }
        else if (mVoieSortantDevie != NULL) {
          if (mVoieSortantDevie->creeCheminVers(identifiant, dir, this)) {
            afficheNomVoie(idVoie());
            Serial.println(F(": devie"));
            return true;
          }
          else return false;
        }
        else return false;
      }
      else return false;
    }
    else {
      if (mVoieEntrant != NULL) {
        if (mVoieEntrant->creeCheminVers(identifiant, dir, this)) {
          afficheNomVoie(idVoie());
          if (venantDe == mVoieSortantDroit) {
            Serial.println(F(": droit"));
          }
          else {
            Serial.println(F(": devie"));
          }
          return true;
        }
        else return false;
      }
      else return false;
    }
  }
}
--- Fin du code ---

Au début, il y a une étoile : Voie *venantDe
J'en déduis que c'est un pointeur ?

Puis, un peu plus loin dans un test, tu as : if (venantDe == mVoieSortantDroit)
Et là, c'est le contenu de la variable ?

Peux-tu m'expliquer la nuance ? C'est là que je bute.
Dommage, c'est une notion fondamentale.
Pour moi, si *venantDe est un pointeur, pour avoir le contenu, tu mets &venantDe...

D'avance, merci  :D

Thierry:
Si je peux me permettre, je m'insinue...

Le test vérifie que l'argument venantDe et la donnée membre de la classe mVoieSortantDroit pointent vers la même voie. Si les pointeurs sont égaux, alors évidemment les contenus aussi ! Mais là on veut absolument s'assurer qu'on ne parle pas de choses différentes mais exactement de la même voie, donc on compare les pointeurs.

Et non, si venantDe est un pointeur, alors *venantDe est son contenu, et &venantDe est le pointeur contenant la valeur du pointeur venantDe !

Jean-Luc:
Je complète la réponse de Thierry avec un petit dessin que j'ai fait en parallèle  :)


--- Citation de: DDEFF le mars 08, 2016, 09:20:50 am ---J'ai bien conscience que ça va "polluer" ton exposé, mais je me pose quelques questions :

--- Fin de citation ---

Pas du tout, ça ne pollue rien, un forum c'est fait pour discuter  :)


--- Citer ---
--- Code: ---#ifdef __AVR__
#include <avr/pgmspace.h>
#endif

#ifndef __AVR__
#include <iostream>
#define F(string) string
#define PROGMEM
--- Fin du code ---
Je ne connais pas ___AVR__ ?

--- Fin de citation ---

__AVR__ est un symbole défini par le compilateur quand il compile pour AVR et donc pour Arduino Uno/Nano. Sinon il ne l'est pas. J'utilise ça pour émuler des macros et des classes Arduino sur mon Mac. Ça me permet de compiler et exécuter le programme sur mon Mac, sans Arduino, et de mettre au point dans un environnement plus confortable.


--- Citer ---Le simple fait de mettre #define DEBUG au début suffit pour pouvoir afficher les essais ?
Tu mets les sorties Serial.print() entre #ifdef DEBUG .... #endif et elles sont affichées et si tu dévalides le #define DEBUG pour ne plus les afficher.
C'est sympa, ça.

--- Fin de citation ---

C'est ça



--- Citer ---Et, dans mes efforts pour comprendre les pointeurs, je choisis "venantDe". Exemple :

--- Code: ---bool Aiguillage::creeCheminVers(byte identifiant, byte dir, Voie *venantDe)
{
  if (idVoie() == identifiant) return true;
  else {
    if (direction() == dir) {
      if (mVoieSortantDroit != NULL) {
        if (mVoieSortantDroit->creeCheminVers(identifiant, dir, this)) {
          afficheNomVoie(idVoie());
          Serial.println(F(": droit"));
          return true;
        }
        else if (mVoieSortantDevie != NULL) {
          if (mVoieSortantDevie->creeCheminVers(identifiant, dir, this)) {
            afficheNomVoie(idVoie());
            Serial.println(F(": devie"));
            return true;
          }
          else return false;
        }
        else return false;
      }
      else return false;
    }
    else {
      if (mVoieEntrant != NULL) {
        if (mVoieEntrant->creeCheminVers(identifiant, dir, this)) {
          afficheNomVoie(idVoie());
          if (venantDe == mVoieSortantDroit) {
            Serial.println(F(": droit"));
          }
          else {
            Serial.println(F(": devie"));
          }
          return true;
        }
        else return false;
      }
      else return false;
    }
  }
}
--- Fin du code ---

Au début, il y a une étoile : Voie *venantDe
J'en déduis que c'est un pointeur ?

--- Fin de citation ---

C'est ça.


--- Citer ---Puis, un peu plus loin dans un test, tu as : if (venantDe == mVoieSortantDroit)
Et là, c'est le contenu de la variable ?

--- Fin de citation ---

Non, je compare les pointeurs.

En effet, chaque voie connaît ses voisines via des pointeurs. Par exemple quand on écrit :


--- Code: ---voie8.connecteSortantAVoie(tjd12, ENTRANT);
voie21.connecteSortantAVoie(tjd12, ENTRANT_BIS);

--- Fin du code ---

ça donne ça



Quand creeCheminVers de la TJD est appelée, venantDe sert à savoir de où on vient, voie8 ou voie21 ? En le comparant avec les deux pointeurs arrière, on détermine la position de l'aiguille d'entrée de le TJD. Idem quand on entre dans une aiguille par la branche déviée ou la branche droite

DDEFF:
Donc, pour voir ce que j'ai compris :

Sur ton schéma, Jean-Luc, chaque flèche est un pointeur.

Pour tjd12, pointeur de mVoieEntrant = voie8 et pointeur de mVoieEntrantBis = voie21
De même pour voie8, pointeur de mVoieSortant = tjd12 et pour voie21, pointeur de mVoieSortant = tjd12

Maintenant, il faut l'écrire en code compilable.

Dans le test if (venantDe == mVoieSortantDroit) {..},

mVoieSortantDroit est un élément de la classe Voie et donc ce n'est pas un pointeur.
Il s'ensuit que venantDe n'est pas non plus un pointeur pour qu'on compare des choses de même nature.

Il y a deux mVoieSortantDroit : celui de la voie8 et celui de la voie21 et il faut donc choisir.

Tu es dans bool traverseeJonctionDouble(...), donc tu es sur la tjd12 et tu recherches les antécédents pour pouvoir créer un chemin qui va venir soit de la voie8, soit de la voie21.
Quand tu rentres comme argument de bool(...) Voie *venantDe, tu veux préciser en entrée que tu viens de la voie8 ou que tu viens de la voie21.

Admettons qu'on vienne de la voie8.

Est-ce que je peux dire, dans tjd12, que Voie *venantDe = voie8 ?

Par ailleurs, dans voie8, mSortantDroit, pointe vers tjd12.
Est-ce que je peux dire, dans voie8 cette fois, que *mSortantDroit = tjd12 ?

Et là, je bloque. Que valent venantDe et mSortantDroit  ? ???









Dominique:
Salut Jean-Luc,

Il y a un truc qui m'intéresserait : comment mettre des images dans le dossier www.locoduino.org/pic ?
C'est peut-être réservé à l'admin ?

En tout cas c'est mieux de pouvoir mettre les images au bon endroit dans le texte

Danke !
Dominique

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique