A Tour of C++ – Le code source de l’exemple page 17

Il s’agit d’un des codes d’exemple du livre écrit par Bjarne Stroustrup et qui est disponible ici. Le contenu de ce livre correspond au début du livre The C++ Programming Language qu’on trouve ici.

Pour chaque exemple, j’ai essayé de faire en sorte que le code se compile, soit complètement autonome et tienne dans un seul source.
J’ai aussi tenté d’avoir des sorties à l’écran afin qu’on se rende compte un peu mieux de se qui se passe vraiment.
Oui, oui bien sûr, y a des cas où il faut aller vérifier avec un débogueur.
En tout cas l’objectif est de pouvoir avoir un code fonctionnel qu’on puisse compiler et dans lequel on puisse naviguer.
J’ai tenté de coller au maximum à l’exemple du bouquin. A part peut être un ou deux cas, j’ai dû renommer certains variables.

J’ai surtout travaillé avec Visual Studio Community 2013.
Ceci dit les exemples tournent dans Ideone.com ou la version en ligne du compilateur C++ de Microsoft.
Dans certains, j’ai été amené à aller y faire des tests.
Dans certains cas j’ai aussi fait aussi des tests avec le compilateur clang de mon Mac.
Pour utiliser le code, il suffit de faire un copier coller et zou c’est parti.
Pour les explications, bien sûr vaut mieux se référer aux livres de l’auteur.

Notes spécifiques à cet exemple

J’ai rajouté du code car en fait il y a des fuites mémoire dans le code. Afin de les faire ressortir j’utilise crtdbg.h et les fonctions qui vont bien (_CrtDumpMemoryLeaks par exemple). Ceci dit, comme je souhaite que le code soit portable (sous ideone.com par exemple) il faut que j’encadre tout ça par des #ifdef _MSC_VER. Rien de très complexe mais bon, à la lecture, c’est moins cool.

Ceci dit, à la fin de l’exécution, dans Visual Studio, voilà ce que je vois dans la fenêtre Output :

1
2
3
4
5
6
7
8
9
10
11
Detected memory leaks!
Dumping objects ->
{169} normal block at 0x0067C538, 24 bytes long.
 Data: <       ?       @> 00 00 00 00 00 00 F0 3F 00 00 00 00 00 00 14 40
Object dump complete.
Detected memory leaks!
Dumping objects ->
{169} normal block at 0x0067C538, 24 bytes long.
 Data: <       ?       @> 00 00 00 00 00 00 F0 3F 00 00 00 00 00 00 14 40
Object dump complete.
The program '[10516] p017.exe' has exited with code 0 (0x0).

Si jamais vous copiez/collez le code ci-dessous dans Ideone.com pensez bien à faire la saisie des entiers dans l’onglet « stdin » AVANT de lancer le code.
Par exemple si vous saisissez « 1 5 9 » voilà ce que cela donne de mon côté :

p017

A l’exécution, Ideone ne détecte pas la fuite mémoire mais bon c’est pas très grave.

Le code source

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#ifdef _MSC_VER
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#endif // _MSC_VER
#include <iostream>
#include <limits>
#include <vector>
using namespace std;
class Vector {
private:
  double  *elem;                                                                // pointer to the elements
  int     sz;                                                                   // the number of elements
public:
  Vector(int s) : elem {new double[s]}, sz {s} {}                               // construct a Vector
  double& operator[](int i) { return elem[i]; }                                 // element access: subscripting
  int size() { return sz; }
};
// ----------------------------------------------------------------------------
double read_and_sum(int s) {
  Vector v(s);                                                                  // make a vector of s elements
  cout << "Enter " << s << " integers separated with spaces : ";
  for (int i = 0; i!=v.size(); ++i)
    cin>>v[i];                                                                  // read into elements
  double sum = 0;
  for (int i = 0; i!=v.size(); ++i)
    sum += v[i];                                                                // take the sum of the elements
  return sum;
}
// ----------------------------------------------------------------------------
int main() {
#ifdef _MSC_VER
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
#endif // _MSC_VER
  cout<<"Sum of 3 is : "<<read_and_sum(3)<<endl;
  cin.sync();
#ifdef _MSC_VER
  //_CrtMemDumpAllObjectsSince(NULL);                                             // Begins the dump from the start of program execution
  _CrtDumpMemoryLeaks();
#endif // _MSC_VER
  cout<<"Press ENTER to quit : ";
  cin.ignore((numeric_limits<streamsize>::max)(), '\n');
}
Share this...

Comments are closed.