Plusieurs versions d'un bout de code
Bonjour :mrgreen:,
Je me demandais comment on pouvait copié/ collé un bout de code :mrgreen:
Précision: quel compilateur? Je dirais C++03
Un exemple: Prenons l'exemple de l'algo de Morris, Joseph H. pour traverser un arbre de façon itérative
Et je voudrais:
- Une version brute/ optimale -> la version originale
- À partir de la version originale, rajouté des logs
- À partir de la version originale, rajouté des traces pour le débogage
Code:
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
| iterativeInorder(node)
s <- empty stack
while (not s.isEmpty() or node != null)
if (node != null)
s.push(node) // action
node <- node.left
else
node <- s.pop()
visit(node)
node <- node.right
iterativeInorder_log(node)
s <- empty stack
while (not s.isEmpty() or node != null)
if (node != null)
s.push(node) // action
display(node) // log
node <- node.left
else
node <- s.pop()
visit(node)
node <- node.right
iterativeInorder_debug(node)
s <- empty stack
while (not s.isEmpty() or node != null)
if (node != null)
s.push(node) // action
display("Here node " + node) // debug
node <- node.left
display("Go left, node " + node) // debug
else
node <- s.pop()
display("Pop node " + node) // debug
visit(node)
node <- node.right
display("Go right, node " + node) // debug |
Une solution "template" existe, mais cela nécessite
- De tout mettre dans les entêtes. Et pour un algo de XXX lignes avec XXX entêtes, c'est moche :aie: :aie:
- D'avoir des alertes parce que le compilateur détecte du "code mort" (*). Et en espérant que le compilateur/ linker le supprime (avec les tests), sinon on perd un peu d'optimal avec tout un tas de tests inutiles :aie: :aie:
*, édit: plus exactement, des alertes "expression constante". Et donc, un if (false) { ... } produit du "code mort"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| tempate<bool with_debug, bool with_log>
iterativeInorder(node)
s <- empty stack
while (not s.isEmpty() or node != null)
if (node != null)
s.push(node) // action
if (with_log) { display(node) }
if (with_debug) { display("Here node " + node) }
node <- node.left
if (with_debug) { display("Go left, node " + node) }
else
node <- s.pop()
if (with_debug) { display("Pop node " + node) }
visit(node)
node <- node.right
if (with_debug) { display("Go right, node " + node) }
version originale: iterativeInorder<false, false> (...)
version log: iterativeInorder<false, true> (...)
version debug: iterativeInorder<true, false> (...) |