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:
  1. Une version brute/ optimale -> la version originale
  2. À partir de la version originale, rajouté des logs
  3. À 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> (...)