Bonjour,
Je me demandais comment on pouvait copié/ collé un bout de code
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 : 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 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
![]()
- 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
![]()
*, édit: plus exactement, des alertes "expression constante". Et donc, un if (false) { ... } produit du "code mort"
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 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> (...)
Partager