Interfaces C++ (classes abstraites)

Une interface décrit le comportement ou les capacités d’une classe C++ sans pour autant imposer une implémentation spécifique à cette dernière. 

Les interfaces C++ sont faites à l’aide des classes abstraites.

Nous sommes faces à une classe abstraite dès qu’une des fonctions est déclarée virtuelle pure. Une fonction est virtuelle lorsqu’on ajoute « =0 » après sa déclaration.

Ci-dessou, voici un exemple de déclaration d’une méthode virtuelle pure :

L’objectif d’une classe abstraite est de fournir aux autres classes une classe de base appropriée dont elles pourront hériter. Les classes abstraites ne peuvent être instanciées, ni servir seulement d’interface. Tenter d’instancier un objet à partir d’une classe abstraite cause une erreur de compilation.

L’objet d’une classe abstraite est de fournir une classe de base appropriée à partir de laquelle les autres classes pourront hériter. Les classes abstraites ne peuvent pas être utilisées pour instancier des objets. Si vous essayez d’instancier un objet à partir d’une classe abstraite, vous aurez une erreur de compilation.

Par conséquent, si vous souhaitez instancier la sous classe (d’une classe abstraite) il est nécessaire que vous implémentiez chacune des fonctions virtuelles. Sinon vous aurez une erreur de compilation.

On appelle classes concrètes les classes pouvant être utilisées pour instancier des objets.

Exemple d’une Classe Abstraite

Considérons l’exemple suivant dans lequel une classe mère fournit une interface à la classe de base pour implémenter une fonction appelée getSurface().

 

Lorsque le code ci-dessus est compilé et exécuté il produit le résultat suivant :

Vous pouvez voir dans l’exemple ci-dessus comment une classe abstraite définit une interface avec getSurface() et comment deux autres classes implémentent cette même fonction mais avec un algorithme différent pour calculer la surface spécifique à la forme géométrique.

Stratégie de conception

Une architecture orientée objet doit d’utiliser des classes de base abstraites pour fournir des interfaces standards et communes aux applications utilisatrices. Donc par héritage de classes de base abstraites, les classes dérivés sont construite pour fonctionner toute de la même façon.

Donc, par héritage de ces classe abstraites, les classes dérivées sont construites pour fonctionner toutes de la même façon. 

Les possibilités (e.g. fonctions publiques) offertes aux fonctions externes sont fournies en tant que méthodes virtuelles pures dans la classe de base abstraite. Les implémentations de ces méthodes virtuelles pures sont fournies dans les classes dérivées qui sont conformes au genre spécifique du programme.

De plus cette architecture permet à de nouvelles fonctions d’être ajoutées facilement au système.

 

Librairie C Fonction – strcmp()

Syntax

Description

La fonction strcmp compare deux chaines de caractères str1 et str2. La fonction commence en comparant les deux premiers caractères de chaque chaîne. S’ils sont égaux, la fonction prend la pair de caractères suivante et continue tant que les caractères ne sont pas différents ou tant que le caractère de fin ‘\0’ n’est pas détecté.
 

Valeurs de retour

Retourne un entier indiquant les différences détectées.

<0Le premier caractère qui est différent a une valeur plus petite dans str1 que str2 
0Le contenu des deux chaines est le même
>0Le premier caractère différent trouvé a une valeur plus grande dans str1 que str2

 

 

 

Exemple

Sortie

 

Librairie C Fonction – strcpy()

Syntax

Description

La fonction strcpy() copie la chaine pointée par source, sur le tampon pointé par destination. La copie comprend le caractère de terminaison ‘\0’. Attention, le tampon de destination doit être suffisamment grand afin de pouvoir recevoir la chaîne de caractères.

Exemple

Dans l’exemple ci-dessus, on copie la chaîne s1 dans s2.

Lire un fichier en C avec fgetc

Nous allons au travers de ce tutoriel expliquer comment programmer en C  la lecture d’un fichier texte. Nous expliquerons chaque ligne de code ajoutée afin d’arriver à un programme fonctionnel.

Tout d’abord, afin de faire des opérations d’entrées sorties, commençons par inclure le fichier d’entête stdio.h (Standard Input/Ouuput Header).

Tout programme écrit en C doit contenir une fonction principale appelée main, c’est à partir de cette dernière que débute un programme.

Comme vous pouvez le voir ci-dessus, à la ligne 3, le mot clé int précède la fonction main pour indiquer que cette dernière retourne un entier.

Nous ajoutons la primitive return à la fin de notre fonction afin de retourner une valeur.

Habituellement un programme retourne 1 en cas d’erreur sinon 0. Considérons que si notre programme arrive à la fin de la fonction main c’est qu’il n’y a pas eu d’erreur.

Afin de pouvoir lire notre fichier nous avons besoin du pointeur de fichier :

FILE* pFichier

Pour stocker les caractères nous utilisons la variable (type entier) :

int c

Nous ouvrons le fichier avec la fonction fopen qui retourne un pointeur sur le fichier. En cas d’échec elle retourne NULL.

La valeur de retour de la fonction fopen est utilisée afin d’initialiser notre pointeur pFichier .

La fonction fopen attend deux paramètres qui sont respectivement, le nom du fichier et mode d’ouverture.

Nous ouvrons un fichier nommé fichier.txt et utilisons le mode d’ouverture « r » pour read (accès en lecture).

Si un echec a eu lieu lors de l’ouverture du fichier, le pointeur pFichier est égal à NULL, dans ce cas nous affichons un message d’erreur à l’aide de la fonction  perror.

La fonction fgetc lit le fichier et retourne le caractère courant, la position dans le fichier est modifiée.

Affichons sur la sortie standard le caractère lu à l’aide de la fonction printf. Nous indiquons que nous souhaitons afficher un caractère avec %c et nous lui fournissons le caractère à afficher c en paramètre.

Notre programme n’est pas encore fini, il lit pour l’instant que le premier caractère du fichier avant de se terminer.

Implémentons une boucle afin d’appeler la fonction fgetc tant que des caractères sont présents. Nous pouvons savoir lorsque nous sommes à la fin du fichier grâce à la fonction fgetc qui retournera dans ce cas EOF.

Ajoutons une boucle infinie while depuis laquelle nous sortirons si le caractère EOF est détecté.

Si le caractère courant est égal à EOF (End Of File – Fin du fichier) nous sortons de la boucle  à l’aide de l’instruction break .

Ajoutons l’instruction fclose afin de fermer correctement le fichier une fois la lecture terminée.

Ne plus répondre au ping

Vous pourriez avoir envie de configurer votre machine pour ne plus qu’elle réponde aux ping pour de multiples raisons, comme par exemple des raisons de sécurité ou éviter de congestionner le réseau.

Quelqu’un pourrait par exemple nuire s’il inondait (flood) le réseau avec la commande ping -f.

En désactivant, sur votre machine Linux, la réponse au ping, ce genre de problème est éviter.

Ne plus répondre au ping temporairement

Vous pouvez dire au système de ne plus répondre au ping temporairement à l’aide de la méthode suivante :

Notez que cette modification est temporaire et qu’elle sera automatiquement perdue après un simple redémarrage de votre système.

Pour que votre système réponde au ping à nouveau (sans le redémarrer) mettez la valeur « 0 » comme dans l’exemple ci-dessous :

Ne plus répondre au ping de manière permanente

Il est possible de configurer votre système afin qu’il ne réponde plus au ping de manière permanente. En utilisant la méthode ci-dessous, votre machine Linux ne répondra plus au ping et ce même après un redémarrage.

Etape 1 : Editez le fichier sysctl.conf et ajouter la ligne suivante.

Etape 2 : Exécutez la commande sysctl -p pour que la modification soit prise en compte immédiatement.

La commande ci-dessus recharge la configuration de systcl à partir du fichier de configuration « systcl.conf ».

 

 

Après avoir utilisé l’une des méthodes ci-dessus qui comme nous l’avons vu permet de désactivé la réponse au ping sur un système Linux, si une personne ping votre machine, ce dernier n’aura aucune réponse. Votre système ne répondra plus aux requêtes Ping.

 

 

Afficher le nombre d’arguments en C

Ci-dessous un morceau de code en langage c qui affiche simplement le nombre d’arguments passés en paramètre au programme.

Ci-dessus, notre code source.

Maintenant compilons…

Et lançons notre programme.

Tiens!! bizarre?!? Il affiche 1 alors que je n’ai fourni aucun parametre. Je vais lui donné un paramètre pour voir ce que cela donne.

Ah ben, ca y est, je crois avoir compris. Vous aussi? Le nom du programme est lui aussi comptabilisé.

 

Hello world en langage C

Dans cet article je vais vous montrer comment faire un hello world en langage C sous Linux.

Rechercher dans l’historique Bash avec Ctrl+R

Alors que je passe beaucoup de temps à administrer des machines en lignes de commandes, je pense qu’il est très utile d’écrire cet article sur une fonctionnalité de BASH parfois méconnue mais indispensable à connaitre.

Cette dernière permet en effet de rechercher dans l’historique des commandes déjà exécutées dans BASH.

Autrefois, j’utilisais la flèche du haut pour afficher les commandes précédentes. J’utilisais aussi la commande history qui affiche un listing de toute les commandes BASH.

Un jour j’ai découvert (enfin on m’a montré) le raccourci clavier CTRL + r et depuis je n’utilise plus que ça !

Je vous explique, c’est très simple :

Exemple :

Dans votre terminal si vous tapez Ctrl + r, vous obtiendrez :

Ensuite tapez un mot clé correspondant à ce que vous pourriez avoir envié de rechercher dans l’historique :

Ces derniers jours, j’ai utilisé des lignes de commandes qui comportées « gcc », si je tape « gcc » il m’affiche :

Ci-dessus, on peut voir qu’il m’affiche une ligne commande entière (avec les arguments) qui contient l’expression « gcc ». Cette ligne de commande correspond à la dernière ligne de commande que j’ai tapé et qui contenait le mot clé gcc.

En appuyant une deuxième fois sur Ctrl + R, je remonte dans l’historique Bash enregistré. Il m’affiche :

Ci-dessus, il m’affiche une autre ligne de commande que j’ai tapé dernièrement et qui contient également l’expression « gcc ».

En appuyant successivement sur CTRL + r vous pouvez remonter dans l’historique des commandes.

Un autre exemple, si je tape Ctrl +r vfat, il m’affiche :

Il a trouvé la dernière commande que j’avais tapé et qui comprenait le mot clé vfat.

Si vous souhaitez sélectionner la ligne de commande qu’il vous propose, rien de plus simple, soit vous appuyez sur la touche entrée pour éxecuter la commande, soit vous l’éditer directement. Pour l’éditer, déplacer le curseur avec les flèches droite et gauche. Pour annuler appuyer sur Ctrl +c.

 

 

 

Vim et Vi Tutoriel: Comment utiliser les macros

Dans Vim les macros permettent d’enregistrer et de jouer une séquence d’actions dans l’éditeur.

A l’aide d’exemples détaillés je vais vous expliquer comment faire pour enregistrer et lancer des macros dans les éditeurs Vi et Vim.

Les étapes pour faire une macro dans Vim sont les suivantes :

  1. Démarrez l’enregistrement en appuyant sur la touche q, suivi d’un caractère minuscule afin de nommer la macro
  2. Effectuez les actions qui seront enregistrées à l’intérieur de l’éditeur Vim
  3. Stoppez l’enregistrement en appuyant sur la touche q
  4. Jouez la macro enregistrée en appuyant sur la touche @ suivi du nom de la macro
  5. Pour répéter la macro plusieurs fois, appuyer sur : NN @ ‘nom macro’. NN étant un nombre

Exemple : Génération d’une séquence de nombre à l’intérieur d’un fichier en utilisant une Macro Vim

 

1. Créez et ouvrez un fichier test.txt pour générer la séquence:

2. Passer en mode insertion et tapez « 1 . » comme ci-dessous:
Appuyer sur ‘Echap’ ‘i’ puis ‘1 .’

3. Lancer l’enregistrement et appeler la macro ‘a’
Appuyez sur ‘Echap’ ‘q’ puis ‘a’
q lance l’enregistrement
a permet de nommée la macro a

Quand vous appuierez sur q a, l’indication « recording » (ou « enregistrement ») apparaîtra en bas de l’éditeur vi.

4. Copier la première ligne sur la seconde de manière à avoir deux lignes avec « 1 . » comme ci-dessous :
Appuyez sur: ‘Echap’ ‘yy’ puis ‘p’
yy va copier la ligne courante
p va coller la ligne qui vient d’être copiée

Vim va afficher la mention « recording » (ou « enregistrement ») au bas de l’écran comme ci-dessous.

Vim affiche message enregistrement en bas

Vim affiche le message « Enregistrement » en bas

5. Incrémentez le nombre
Pressez: Control + a
Incrémentez le nombre en plaçant le curseur sur la seconde ligne et en appuyant sur la combinaison de touches Ctrl+a

Vim affiche toujours « Enregistrement » en bas de l’écran.

 

6. Stopper l’enregistrement

Appuyez sur q
Pressez q pour stopper l’enregistrement. Vous allez avoir le message en bas de l’écran qui va disparaître.

7. Répéter l’action enregistrée 98 fois

Appuyez sur 98@a

Maintenant répéter cette action en appuyant sur 98 @ a
@a répète la macro « a » une fois
98@a répète la macro « a » 98 fois, ce qui va permettre d’avoir la séquence de nombre de 1 à 100 comme ci-dessous :

vim_macro98

Génération d’une séquence de nombre en utilisant une macro Vim

 

Les pointeurs en C

Un pointeur est une sorte de variable un peu spéciale. Les pointeurs sont conçus pour contenir une adresse mémoire; par exemple l’adresse d’une autre variable.

Déclarer un pointeur est la même chose que pour déclarer une variable normal, excepter qu’il faut faire précéder ce dernier par un astérisque ‘*’.

Il y a deux nouveaux opérateurs que vous devrez connaître pour travailler avec les pointeurs. L’opérateur ‘&’ qui permet de récupérer l’adresse d’une variable. Et l’opérateur de déréférencement ‘*’.

Lorsque vous placez un caractère esperluette devant une variable vous récupérez son adresse, qui peut ensuite être enregistrer dans un pointeur.

Lorsque vous utilisé un caractère astérisque devant une variable vous allez pouvoir récupérer la valeur qui se trouve à cette adresse mémoire.

Ci-dessous, voici un exemple afin d’illustrer mon explication:

En exécutant le code source ci-dessus, voici le résultat que vous devriez obtenu :