Mode d'emploi et manuel de référence

Previous Up Next

2.9  Bases de C++

Un fichier source ePiX est un programme C++. Si vous avec modifié et compilé avec succès l'un des fichiers d'exemple, vous connaissez assez de C++ pour utiliser ePiX. D'après l'expérience de l'auteur, la grammaire C suffit pour la plupart des applications. Une excellente introduction à la définition de fonctions et de variables, aux instructions de controle et à la structure générale des programmes est le le livre de Kernighan et Ritchie Le langage C [2] (édition anglaise [1]).

Le mode emacs pour ePiX de Jay Belanger insère un fichier de gabarit (template) lorsque l'on ouvre un tampon vide d'extension xp. Cette section explique à quoi sert ce gabarit. Quelques remarques supplémentaires devraient vous permettre d'éviter des chausse-trapes de la syntaxe élémentaire.

Format de fichier

Un fichier C++ est constitué « d'instructions» analogue aux phrases ordinaires. Les types communs comprennent des déclarations – qui «enregistrent» une fonction, une variable ou le nom d'un type auprès du compilateur –, des définitions – qui assigne un sens à un nom déclaré – et des appels de fonction – qui font qu'une fonction nommée est exécutée. La plupart des instructions d'un fichier d'entrée d'ePiX sont des appels de fonction – des « commandes ePiX ». Les déclarations explicites sont assez rares puisque une définition sert à déclarer tout nom nouveau qu'elle contient.

Toute instruction est terminée par un point-virgule et, par convention, un fichier ne contient qu'une instruction par ligne (si possible). Le compilateur ignore presque tous les blancs – espaces, tabulations et sauts de ligne – qu'on peut donc utiliser à loisir pour rendre le fichier lisible. D'autres marques de ponctuation – points, virgules, deux-points, point-virgules, parenthèses, accolades et quotes – dirigent l'analyse lexicale du fichier et doivent respecter très strictement la grammaire.

Un fichier ePiX commence toujours avec les lignes

#include "epix.h" 
// N.B. directive pour le pre-processor, pas de point-virgule
using namespace ePiX;

La première ligne est analogue à une commande usepackage pour LATEX: elle inclut le contenu du fichier, ce faisant importe les noms des commandes fournies par ePiX. Pour éviter des conflits de noms, les commandes d'ePiX sont enfermées dans un « espace de noms». Par exemple, la commande label est en fait connue par le compilateur comme ePiX::label. La deuxième ligne de l'extrait ci-dessus dit au compilateur d'ajouter tacitement ce préfixe.

Variables et fonctions

Les définitions de variables et de fonctions jouent le même rôle dans une figure que les définitions de macro dans un document LATEXien : grouper et organiser l'information dont la figure dépend. Une variable est définie par la donnée de son type, de son nom et de sa valeur initiale. Les types de données de loin les plus communs dans ePiX sont double (décimal en double précision), P et int. Le nom d'une variable ne doit contenir que des lettres (y compris le souligné _) et des chiffres et doit commencer avec une lettre :

my_var, my_var2,  _MY_var, __, aLongVariableName;  // valide
my-var,    2var, v@riable, $x, ${MY_VARIABLE}; // non valide

Les noms de variables sont sensibles à la casse (distinction des minuscules et des majuscules). Il existe de nombreuses conventions quant à la signification de l'usage des majuscules. En général, choisissez des noms descriptifs mais maniables et évitez les noms commençant par un souligné – à moins que vous ne sachiez ce que vous faites.

Une fonction accepte des « arguments» et « retourne une valeur». Pour définir une fonction en C++ vous devez préciser le type de retour, le nom de la fonction, le type de chaque argument puis l'algorithme par lequel la fonction calcule la valeur de retour à partir des données. Le bloc de code

double f(double x) 
{ 
  return sqrt(1-x*x); 
}

définit la fonction f, renvoyant une valeur double et acceptant un argument double, telle que f(x) = √1−x2 . De nombreux fichiers d'exemples et fichiers sources (particulièrement functions.cc) présentent de nombreux autres exemples. On devrait présenter comme ci-dessus la définition d'une fonction pour des raisons de lisibilité.

Commentaires

C++ connait deux sortes de commentaires. Les commentaires à la C qui peuvent s'étendre sur plusieurs lignes sont délimités par les chaines /* et */. Les commentaires d'une seule ligne commencent par // qui joue un rôle semblable à celui de % en LATEX. Un commentaire d'une seule ligne peut apparaitre au milieu d'un commentaire multiligne mais pas un commentaire à la C ; le compilateur confondrait le premier */ rencontré avec la fin du commentaire multiligne courant.

Exécution du programme

Dans un programme C++, toutes les « actions» ont lieu dans la fonction spéciale main. L'exécution d'un programme C++ compilé est vue par le système d'exploitation comme l'appel de la fonction main du programme. La valeur de retour (un int c.-à-d. un entier) est le statut de sortie du programme. Dans un fichier ePiX, l'action de main consiste d'habitude à fixer la taille logique de la figure et sa taille imprimée puis de construire et dessiner la figure en changeant les attributs au moment voulu. La sortie proprement dite d'ePiX commence avec begin() et se finit avec end(). Les instructions entre ces deux commandes constituent le corps de la figure.

En C++, on ne peut pas définir une fonction à l'intérieur de la définition d'une autre. Aussi on peut définir des variables à l'intérieur de main mais pas des fonctions.

Sortie brute

On peut faire écrire du texte plus ou moins verbatim dans le fichier de sortie. Une barre oblique inverse est produite par deux barres obliques inverses dans le fichier d'entrée. Certaines lettres ont une signification spéciales quand elles sont échappées (protégées) par une barre oblique inverse y compris “\n” (newline saut de ligne) and “\t” (TAB : tabulation). Contrairement à LATEX, C++ n'exige pas un espace pour séparer une séquence échappée du texte suivant, la chaine « \textwidth» est lue « TABextwidth» par le compilateur.

En guise d'application, on peut produire un environnement figure LATEXien, avec titre (caption) et référence (label) avec un fichier ePiX. Les sauts de ligne doivent être ajoutés explicitement et toutes les instructions d'impression doivent apparaitre à l'intérieur de l'appel à la fonction main(), voir la figure 2.4.


#include "epix.h"
using namespace ePiX;

int main() 
{
  using std::cout;      // fonction de sortie de C++
  cout << "\\begin{figure}[hbt]\n";
  unitlength(...);    // picture, bounding_box, etc.
  begin();
  < ... commandes ePiX ... >
  end();
  cout << "\\caption{A \\LaTeX\\ figure.}\n" // N.B. pas de ";"
       << "\\label{fig:example}\n"           // la ligne continue.
       << "\\end{figure}\n%%%%\n";           // formatage LaTeXien 
} // End of main()
Figure 2.4: Créer une figure autonome avec ePiX.

Sauts conditionnels et boucles

Le comportement d'un algorithme dépend d'habitude d'un certain état interne. Une instruction conditionnelle fait que des blocs de code sont exécutés ou non suivant un certain critère. Une boucle répète un bloc de code, généralement en changeant les valeurs de quelques variables d'une manière prévisible de sorte que le programme sort de la boucle après un nombre fini de répétition. La figure 2.5 illustre tant les instructions conditionnelles que les boucles avec l'algorithme d'Euclide de détermination du plus grand commun diviseur. Trois notations demandent un éclaircissement : j%i signifie j(mod i ), || est le « ou» logique, == est le « test d'égalité» – un seul = est l'opérateur d'affectation.


int gcd (unsigned int i, unsigned int j)
{
    int temp=i;
    if (i==0 || j==0)
        return i+j;    // définit gcd(k,0) = k

    else {
        if (j < i)     // les échange
            {
                temp = j;
                j=i;
                i=temp;
            }
        // le travail se fait ici
        while (0 != (temp = j%i)) // affecte temp, teste la nullité
            {
                j=i;
                i=temp;
            }
        return i;
    }
}
Figure 2.5: Algorithme d'Euclide de la division en C++.

Pour des détails sur les intructions conditionnelles et pour des techniques plus avancées de programmation C++ voyez un manuel ou un cours en ligne.


Previous Up Next