120

typedef int* int_p; int_p a,b;

sick
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

121

122

Bof moi ça ne me gêne pas tellement...
squalyl (./118) :
Sasume (./103) :
Iterator it; Iterator_init(&it, &(this->enemies));

rah, mais si tu veux des itérateurs et plein de trucs comme ça, fais du C++
que c'est moche de faire ça en C sick

Moi je veux bien mais c'était du code extrait d'un prog sur TI, pas de C++ là-bas sad
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

123

justement, ça n'a rien à faire en C embarqué, un itérateur!

124

Zephyr (./119) :
squalyl (./118) :
toutafé. C'est une perte de temps d'appuyer 8 fois sur espace quand on veut naviguer vite au clavier dans son code  redface.gif 

Certains pourraient te répondre qu'avec un vrai éditeur le fait d'appuyer sur "home" place le curseur au début de la ligne, après les éventuels espaces et tabulations, mais je reste d'accord  hehe.gif 


J'irais plus loin, un bon editeur qui gere les softtabs ce doit de faire des saut equivalent au soft tabs quand on appuie sur gauche/droite, tout en respectant les emplacement des tabulations

exemple soit des softtabs de 3, soit "-" réprésentant l'espace et "|" le curseur:

|1:----hello
Apres appuis sur droite :

1|:----hello

Apres appuis sur droite :

1:|----hello

Apres appuis sur droite :

1:-|---hello

Apres appuis sur droite :

1:----|hello

etc...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

125

Moi aussi je veux jouer cheeky
i; if (sauvegarde) return 2; return 1; }
je pense que c'est ma fonction la plus pourrie :#define MAX_CAR_NOM_FIC 19 /* \0 + 8 car. nom du répertoire + \ + 8 car. nom fichier + \0 */

[...]

int open_file (const char *filename) {
  char nom_complet[MAX_CAR_NOM_FIC];
  char *basename;
  char *chiffre;
  Bool sauvegarde = FALSE;
  SYM_ENTRY *se;
  int i;  
  nom_complet[0] = 0;

  if ((basename = strchr (filename, '\'))) {
    basename++;
    chiffre = nom_complet + sprintf (nom_complet + 1, "%.17s", filename);
    if ((se = SymFindPtr (chiffre + 1, 0))) {
      byte *ptr = HeapDeref (se -> handle);
      if (!strcmp ("ZSVG", ptr + *(word*)ptr - 4)) {
	strncpy (nom_jeu, ptr + 10, 7);
	chiffre =
	  nom_complet + 1 + sprintf (nom_complet + 1, REPERTOIRE_JEUX "\%.7s", ptr + 10);
	sauvegarde = TRUE;
      }
      else {
	*chiffre = 0;
	strncpy (nom_jeu, basename, 7);
      }
    }
    else goto argh;
  }
  else {
    chiffre =
      nom_complet + 1 + sprintf (nom_complet + 1, REPERTOIRE_JEUX "\%.7s", filename);
    strncpy (nom_jeu, filename, 7);
  }
  
  chiffre[1] = 0;
  for (i = 0, *chiffre = '1'; i < 4; i++, (*chiffre)++) {
    if ((se = SymFindPtr (chiffre + 1, 0)))
      game_file.fichier[i] = se -> handle;
    else break;
#ifndef DOORS
    if (!ttarchive_valid (HeapDeref (game_file.fichier[i]) + 2)) {
#else
    if (({
      void *ptr = HLock (game_file.fichier[i]);
      !ptr || !(game_file.descriptors[i] = shrnklib_OpenArchive (ptr + 2));
    })) {
#endif /* DOORS */
      ST_helpMsg (FRENCH ? "fichier non valide" : "invalid gamefile");
      return 0;
    }
  }
  if (i == 0) {
argh :
    ST_helpMsg (FRENCH ? "jeu non trouvé" : "game not found");
    return 0;
  }
  game_file.nombre =
(vous remarquerez notamment que le code deviendrait invalide si jamais MAX_CAR_NOM_FIC s'amusait à ne plus être égal à 19 cheeky)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

126

Godzil (./124) :
J'irais plus loin, un bon editeur qui gere les softtabs ce doit de faire des saut equivalent au soft tabs quand on appuie sur gauche/droite, tout en respectant les emplacement des tabulations

sick
Une des raisons pour lesquelles j'aime les espaces est que je déteste quand le curseur saute de n cases à la fois. Je garde la touche curseur appuyée et je la relache quand je suis au bon endroit, si le curseur saute, forcément je vais relacher la touche trop tard. neutral
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

127

Un truc que j'aime bien sur l'éditeur que j'utilise en ce moment (visual slick edit) c'est qu'on peut se déplacer partout d'un caractère, même après la fin des lignes, ça fait comme s'il y avait des espaces... Ça évite d'avoir à rajouter n espaces pour placer un commentaire à tel endroit, ou justement de faire sauter le curseur quand on passe d'une fin de ligne plus longue à une plus courte.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

128

Kevin Kofler (./126) :
Godzil (./124) :
J'irais plus loin, un bon editeur qui gere les softtabs ce doit de faire des saut equivalent au soft tabs quand on appuie sur gauche/droite, tout en respectant les emplacement des tabulations

sick
Une des raisons pour lesquelles j'aime les espaces est que je déteste quand le curseur saute de n cases à la fois. Je garde la touche curseur appuyée et je la relache quand je suis au bon endroit, si le curseur saute, forcément je vais relacher la touche trop tard. neutral

Dans ce cas la tu n'(utilise pas de soft tab mais des dumb tabs a savoir que ton editeur ne fait que faire "ajouter X espaces quand on appuis sur la touche tab" bref ça sux
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

129

Même pas, j'appuie X fois sur la touche espace. gni
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

130

sick
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

131

[troll]L'IDE de GTC met des espaces (par paquets de 2) pour faire les tabulations. Tu vois, Kevin, GTC n'est pas si mauvais que ça wink[/troll]
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

132

133

Sally (./114) :
déclarer que « la case mémoire vers où pointe a contient un entier » est un peu bizarre dans la mesure où a ne pointe pas toujours vers la même case mémoire (et au moment de la déclaration ne pointe vers rien du tout).

Mais dans la mesure où le type de ce vers quoi pointe a reste *toujours* le même, tu peux l'interpréter dans le sens "*a sera toujours à interpréter comme un int" et c'est déjà bcp plus raisonnable. Même "int a[10]" qui est un peu bizarre se comprend dans la mesure où a[10] (qui n'est pas complètement valide puisqu'on ne peut pas le déréférencer) est bien de type int et on peut en prendre l'adresse (qui sera alors de type int*, comme toutes les adresses d'int).

Bref si tu prends ça comme une déclaration purement de typage plutôt que comme une déclaration sémantique "je pourrai toujours accéder à *a" (ce qui est faux si a est nul par exemple), ça reste raisonnable.

Cela dit je suis d'accord, c'est ridicule de faire ça avec un opérateur préfixe, ils auraient pu faire :
int strlen(char s!) {
  int n = 0;
  while (s++!)
    n++;
  return n;
}

et ça aurait pas été moins intuitif que les tableaux ^^ (et puis ça éviterait les parenthèses pour des trucs comme int pointeur_vers_tableau![40])

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

134

./123 Pourquoi je ne peux pas itérer ma liste dans du code embarqué ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

135

./134: laisse tomber, il fait un peu comme JS pour le coup
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

136

tu peux, bien sur, mais je pense que ça rend le code un peu lourd, et qu'une simple boucle est suffisante. Après ça dépend comment t'as implémenté ton "itérateur" évidemment.

137

Godzil (./135) :
./134: laisse tomber, il fait un peu comme JS pour le coup

hum pas compris.


Les itérateurs, c'est bien, le pb c'est de les implémenter avec des macros, car t'as pas de symbole etc en debug. Or le inline n'est pas dans la norme C, donc voilou:P

138

mais personne ne sait si on parlait de macros, vu qu'il nous a pas encore dit qu'il a fait comme ça hehe

139

./136 La couche "Iterator" me permet d'itérer à travers différents types de listes et facilite la lecture du code. Elle est réalisée par des fonctions inline (TIGCC permet de faire des fonctions inline, JS tongue) quand cela permet de prendre moins de place.

Enfin, je suis conscient que sur TI le code doit être optimisé parce que la puissance est faible, mais ma stratégie consistait à pondre dans un premier temps un code facile à lire et à modifier afin de me concentrer en priorité sur les algorithmes, sans avoir à me soucier de petits détails qui ajoutent du « bruit » au code. Puis dans un second temps optimiser le code là où le besoin se fait sentir.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

140

j'allais dire "ok,parfait" jusqu'à ce que je lise ça:
Sasume (./140) :
là où le besoin se fait sentir

sad

(mais bon, ok quand même)

141

Allez op soyons fou. cheeky

Header en C:
/**********************************************************************************************************
 * MEMBRES PRIVES
 **********************************************************************************************************/
/** @brief Private container */
typedef struct GFAVector {
  void* pAlloc;              // Pointer at the begin of memory allocation and the low level content of another implementation of a container component
  void* pBitmap;             // Pointer at the begin of the the bitmap table
  void* pData;               // Pointer at the begin of the data block
  int nHostBytes;            // Size in bytes of the implementation of the host component
  int nBitmapBytes;          // Size in bytes of the bitmap table
  int nBlockBytes;           // Size in bytes of one data block
  int nMaxNumberOfData;      // Max number of data block in the vector container
  int iFirstBlockFree;       // Index of the first block free in the vector container
  int nCountData;            // Number of data saved in the vector container
} GFAVector;


/**********************************************************************************************************
 * CONSTRUCTEUR(s), DESTRUCTEUR
 **********************************************************************************************************/
/**
 * @brief Constructor
 * Create a vector container
 *
 * @param[in] nBlockBytes : The size in bytes of one data block
 * @param[in] nMaxNumberOfData : The number of data that the container could have
 *
 * @return a vector container created (use GFA_Vector_isValid to determine if the operation was successful)
 *
 * @pre (nBlockBytes > 0) && (nMaxNumberOfData > 0)
 *
 * @note The constructor returns an invalid vector container if there is no enough memory to allocate the component.
 * The vector container organizes the data on even addresses.
 */
GFAVector GFA_Vector_Construct(int nBlockBytes, int nMaxNumberOfData);

/**
 * @brief Destructor
 * Destroy a vector container
 *
 * @param[in] oVector : A vector container
 *
 * @pre (oVector!=NULL) && GFA_Vector_isValid(oVector)
 */
void GFA_Vector_Destruct(GFAVector* oVector);
...


Code en C:
/**********************************************************************************************************
 * METHODES PUBLIQUES (BAS NIVEAU)
 **********************************************************************************************************/
GFAVector GFA_Vector_Construct_(int nHostBytes, int nBlockBytes, int nMaxNumberOfData) {
  Assert((nHostBytes>=0) && (nBlockBytes > 0) && (nMaxNumberOfData > 0));

  GFAVector oVector;
  oVector.nHostBytes = nHostBytes + (nHostBytes & 1);    // Taille paire (alignement des données)
  oVector.nBlockBytes = nBlockBytes + (nBlockBytes & 1); // Taille paire (alignement des données)
  oVector.nMaxNumberOfData = nMaxNumberOfData;
  oVector.iFirstBlockFree = 0;
  oVector.nCountData = 0;
  oVector.nBitmapBytes = (nMaxNumberOfData >> 3) + ((nMaxNumberOfData & 7)!=0);
  oVector.nBitmapBytes += (oVector.nBitmapBytes & 1);    // Taille paire (alignement des données)

  if (!(oVector.pAlloc = malloc(nHostBytes + oVector.nBitmapBytes + (nBlockBytes * nMaxNumberOfData))))
    GFA_Logger_Debug(LOG_ERR, LOG_LEVEL_ERROR, "Couldn't not allocate buffer for the vector container");
  else {
    oVector.pBitmap = oVector.pAlloc + oVector.nHostBytes;    // Pointeur marquant le début de la table bitmap
    oVector.pData = oVector.pBitmap + oVector.nBitmapBytes;   // Pointeur marquant le début de la zone de données

    memset(oVector.pBitmap, 0, oVector.nBitmapBytes);         // Initialise la zone bitmap
    GFA_Logger_Debug(LOG_DEBUG, LOG_LEVEL_NONE, "A new vector container was created (0x%p)", oVector.pAlloc);
  }

  return oVector;
}

inline void* GFA_Vector_GetHostPointer_(const GFAVector* oVector) {Assert(oVector && GFA_Vector_isValid(oVector)); return oVector->pAlloc;}
inline int GFA_Vector_GetHostSize_(const GFAVector* oVector) {Assert(oVector && GFA_Vector_isValid(oVector)); return oVector->nHostBytes;}
inline int GFA_Vector_GetAllocatedSize_(const GFAVector* oVector) {
  Assert(oVector && GFA_Vector_isValid(oVector));

  return (oVector->nHostBytes + oVector->nBitmapBytes + (oVector->nMaxNumberOfData * oVector->nBlockBytes));
}



Header C++:
/**
 * @class Classe de gestion de paramètres de configuration.
 * Elle dérive de QSettings et supporte le format de fichier XML.
 *
 * @note Il est conseillé d'utiliser la méthode statique CSettings::setPath avant l'instanciation de la classe.
 * Cela affectera la classe mère QSettings.
 */
class CSettings : public QSettings
{
  // ---------------------
  // Eumérations publiques
  // ---------------------
  public:
    enum MethodWriteValue {NotEmptyValues, AllValues};


  // ------------------
  // Membres publics
  // ------------------
  public:
    /** @brief Format de stockage d'un fichier XML */
    static const Format XmlFormat;


  // ------------------
  // Méthodes publiques
  // ------------------
  public:
    /**
     * @brief Constructeur
     *
     * @param[in] p_sFileName : Nom du fichier de configuration (pour QSettings correspoond à ApplicationName).
     * @param[in] p_sFolderName : Nom du dossier accueillant le fichier de configuration (pour QSettings correspond à OrganizationName).
     * @param[in] p_enumScope : Définie si le fichier appartient à un seul et unique utilisateur ou est partagé avec tous les utilisateurs du système.
     * @param[in] p_enumMethodeWrite : Définie si les paramètres vident doivent être écrit ou non.
     * @param[in] parent : Objet parent (chargé de la suppression de this).
     */
    CSettings(
      const QString& p_sFileName, const QString& p_sFolderName = QString("\"),
      Scope p_enumScope = CSettings::UserScope,
      QObject* parent = NULL
    );
...
  // ------------------
  // Méthodes privées
  // ------------------
  private:
    /**
     * @brief Méthode d'écriture XML à partir de la lecture de SettingsMap
     *
     * @param[inout] p_oDevice : Périphérique de lecture (fichier XML).
     * @param[in] p_oMap : SettingsMap contenant les paramètres à lire.
     *
     * @return true.
     */
    static bool writeXmlFile_(QIODevice& p_oDevice, const SettingsMap& p_oMap);
...  

  // ------------------
  // Membres privés
  // ------------------
  private:
    static MethodWriteValue m_enumMethodWriteValue;


Code source C++
...
bool CSettings::writeXmlFile_(QIODevice& p_oDevice, const SettingsMap& p_oMap) {
  QXmlStreamWriter xmlWriter(&p_oDevice);
  xmlWriter.setAutoFormatting(true); // Formatte automatiquement la mise en forme du fichier XML

  xmlWriter.writeStartDocument(); // En-tête XML
  xmlWriter.writeStartElement("SettingsMap"); // Section racine

  QStringList treeGroups;

  // Parcours les paramètres
  for (
    SettingsMap::const_iterator mi = p_oMap.begin();
    mi != p_oMap.end();
    ++mi
  )
  {
    QStringList groups(mi.key().split("/")); // Extrait les groupes

    int i;
    int depth = 0;
    for (; (depth < treeGroups.count()) && (depth < (groups.count() - 1)); ++depth) {
      if (treeGroups[depth]!=groups[depth])
        break;
    }

    // Ferme n sections
    for (i = treeGroups.count() - 1; i>=depth; --i) {
      xmlWriter.writeEndElement();
      treeGroups.pop_back(); // Remonte dans la hiérarchie
    }

    // Ouvre les n sections restant de groups
    for (i = depth; i < (groups.count() - 1); ++i) {
      xmlWriter.writeStartElement(groups[i]);
      treeGroups.push_back(groups[i]); // Descent dans la hiérarchie
    }

    // Ecriture de l'élément
    const QString sValue = mi.value().toString();
    if (
      (CSettings::methodWriteValue()==CSettings::AllValues) ||
      ((CSettings::methodWriteValue()==CSettings::NotEmptyValues) && (!sValue.isEmpty()))
    )
    {
      xmlWriter.writeStartElement(groups.last());
      xmlWriter.writeCharacters(sValue);
      xmlWriter.writeEndElement();
    }
  }

  // Ferme la hiérarchie
  for (int i = 0; i < treeGroups.count(); ++i)
    xmlWriter.writeEndElement();

  xmlWriter.writeEndElement(); // Ferme section racine
  xmlWriter.writeEndDocument(); // "Pied de page" du document

  return true;
}
...


On aime ou on aime pas mais perso je fais en sorte que dans mon code je vois tout de suite qui est un membre, qui est un paramètre, quel est son type...
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

142

Sasume : Ouai, c'est la démarche normale je pense.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

143

./140 Oui bah j'ai pas ma vie entière dédiée au codage, donc je fais ce qui est nécessaire, j'essaie de le faire bien, je ne vois pas l'intérêt de passer des heures devant mon PC pour gagner quelques cycles dans la boucle principale.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

144

JackosKing (./137) :
Or le inline n'est pas dans la norme C, donc voilou:P


Le inline est dans la norme C depuis presque 10 ans.

145

quelques cycles entre un itérateur et une boucle for? grin

menfin je sais que si ça marche on cherche pas à optimiser, je fais parfois pareil, d'ou le "ok quand même" hehe

allez rigolons, moi je code à la Rintintin, menfin bon faut pas déconner non plus je vais pas commenter une fonction Node::getPos() triso

#ifndef NODE_H
#define NODE_H

//std inc
//qt inc
#include <QtCore>
#include <QtGui>
//local inc

class Node
{
public:
	Node() {}
	Node(int _id);
	~Node();
	int getId();
	qreal getX();
	qreal getY();
	QPointF getPos();
	void setX(qreal _x);
	void setY(qreal _x);
	void setPos(QPointF const &p);
	void setSelected(bool newstate);
	QGraphicsItem *getGraphicsItem();
	QString toString();
protected:
private:
	int id;
	bool selected;
	QPointF pos;
	QGraphicsEllipseItem *gitem;
};

Q_DECLARE_METATYPE(Node*); /*pour pouvoir l'ajouter a un variant... merci Qt*/

#endif // NODE_H 

146

./141 : Si tes données sont privées elles doivent pas être visibles en dehors de ton .c
Forward déclare ta structure dans ton .h et déclare ta structure dans ton .c.
Ne fait pas le typedef en un seul coup, cela t'empêchera de forward déclarer ta structure dans d'autres fichiers (typedef redefined...)

Si tu veux faire l'équivalent du C++ en C, tu fais pareil et tu mets ta VTable en static const dans ton .c pour que le symbole soit pas exporté.

Thibaut: Je critique gentillement heinwink. A ne pas oublier que le mot inline n'est pas dans la norme C, et que lorsqu'il est utilisé, c'est facultatif pour le compilateur (tout comme register).

147

./145 Nan mais le surcoût dû à l'utilisation de la couche Iterator doit être à peine de 100 cycle sur la totalité de la boucle principale du jeu...

Sinon, vous écrivez souvent vos commentaires comme si vous vous adressiez à quelqu'un ? (genre le « merci Qt ») grin
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

148

./145 Ta position elle a quoi comme intervalle? en gros c'est quoi sa postcondition? wink

149

t1 mais ces questions que tu poses trisotfl


QPointF ( qreal x, qreal y )

typedef qreal
Typedef for double on all platforms except for those using CPUs with ARM architectures. On ARM-based platforms, qreal is a typedef for float for performance reasons.

hehe

150

Je pense que ton point ne peut pas sortir de la surface occupée par ton Widget, non ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »