Aller sur skilly.com

Testez vos compétences et prouvez votre niveau d'expertise

L'œil de Skilly

Toutes les nouveautés High Tech pour les développeurs !

  • Actualités
  • Gourous du Code
  • Événements
  • Just for Fun
  • Quelques Chiffres

Conception d’une bibliothèque réentrant en C – Obscurification

0
  • par Garf365
  • dans C · Gourous du Code
  • — 26 fév, 2014

Pour mon premier article, je vais me contenter de donner une petite astuce permettant de masquer des choix d’implémentation d’une bibliothèque et d’éviter les variables globales pour utiliser un enchaînement de fonctions de cette bibliothèque.
Prenons par exemple le cas d’un calcul de CRC. D’un point de vue utilisateur, nous effectuons le calcul comme cela :

  • Initialisation du calculateur
  • Insertion de données pour le calcul du CRC
  • Récupération du CRC ou vérification

Nous allons utiliser une bibliothèque de calcul pour cela. Cette bibliothèque fournira comme fonctions :

  • crc_init() : initialise le calculateur
  • crc_add(unsigned char) : ajoute des données
  • crc_get()
  • crc_check()

Or, nous voulons que cette bibliothèque soit réentrante car nous l’utiliserons dans un environnement multi-thread. Nous allons donc utiliser un contexte que nous passerons d’un appel de fonction à l’autre. Mais on ne veut pas que ce contexte soit modifiable par le programme utilisant notre bibliothèque. Voici l’astuce :

/*********** Fichier : libCRC.h ***********/
typedef struct crc_internal * crc_context;
enum {
CRC5,
CRC8,
CRC16,
CRC32
} crc_type;

/* création d’un contexte */
crc_context crc_create_context(const enum crc_type _type);
/* initialisation du calcul */
void crc_init(const crc_context _context);
/* Insertion de données */
void crc_add(const crc_context _context, const unsigned char data);
/* Récupération du crc calculé */
int crc_get(const crc_context _context);
/* Vérification du crc */
int crc_check(const crc_context _context);
/* Libération du contexte */
void crc_delete_context(crc_context *_context);

/********** libCRC.c **********/
#include « libCRC.h »
struct crc_internal
{
enum crc_type type;
int shift_register;
int check_value;
int initial_value;
int polynomial;
};

crc_context crc_create_context(const enum crc_type _type)
{
crc_context new_context = NULL;

new_context = malloc(sizeof(struct_internal));

/** populate new_context according _type **/

return new_context;
}

void crc_delete_context(crc_context *context)
{
free(*context);
*context = NULL;
}

/********* main.c **********/
#include « libCRC.h »

int main(int argc, char *argv[])
{
unsigned char data[NB_DATA];
int crc_value;
crc_context crc;

crc = crc_create_context(CRC16);
crc_init(crc);
crc_add(crc, data[0]);
crc_add(crc, data[1]);
…
crc_value = crc_get(crc);

crc_delete_context(&crc);

return 0;
}

L’astuce consiste à déclarer un nouveau type « pointeur vers une structure », type de structure que seule notre librairie connait. Ainsi, le programme principale connait le type et la taille des données qu’il a à gérer : un pointeur sur une structure particulière.
Et voilà, on est capable de trimbaler un contexte, évitant d’avoir une variable globale causant la perte de la réentrance, tout en cachant l’implémentation de la bibliothèque aux utilisateurs.

 

oscurification

Share

Articles liés

  • AngularJS Angular JS : le framework Javascript par Google
  • De l’importance de l’encre De l’importance de l’encre
  • hibernate search Hibernate Search
  • Reconnaissance faciale PHP Reconnaissance faciale en full PHP (+librairie GD)

Laisser un commentaire Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  • Article précédent Hibernate Search
  • Article suivant Challenge Java – Une carte cadeau GrosBill à gagner !
    • Derniers Articles
    • Articles populaires
    • Tags
    • Challenge Node js Fb coverChallenge Node.js – Un chèque cadeau à gagner !20 octobre 2014
    • nodejs-logoNode.js disponible sur Skilly !15 octobre 2014
    • Challenge Ruby On Rails Fb coverChallenge Ruby On Rails – Un chèque cadeau à gagner !6 octobre 2014
    • CSS Week - Challenge de la semaine 15/07C’est la CSS Week !15 juillet 2013
    • CLI : PHP en ligne de commande5 février 2014
    • Reconnaissance faciale PHPReconnaissance faciale en full PHP (+librairie GD)23 juillet 2013
    • 1anDeTests Android Anniversaire ASP.NET C# Challenge Challenges compétence C Sharp CSS Dataviz Drupal Hibernate HTML5 infographie java jQuery linux MongoDB Monster Monster Race Moteur MySQL My SQL Node.js Objective-C PHP recherche Ruby On Rails Sauvegarde Scrum Search Skilly Spring Titanium Windows Server Wordpress
  • Pas encore fan ?

  • Catégories

    • Actualités
    • C
    • Challenges
    • Conférences
    • Événements
    • Gourous du Code
    • Hackathons
    • Hibernate
    • Javascript
    • Just for Fun
    • PHP
    • Quelques Chiffres
    • Skilly Inside
    • Tests de compétences
  • Activité récente

    • Marc dans Utilisation de variables très locales en C
    • Rafflin dans CLI : PHP en ligne de commande
    • Emma dans CLI : PHP en ligne de commande
    • Bernie_liege dans Reconnaissance faciale en full PHP (+librairie GD)
    • Geeko dans C’est la CSS Week !
  • Skilly est un site dédié aux professionnels de l’informatique, qui permet une auto-évaluation objective de son niveau sur une vingtaine de technologies IT.
  • Home
  • Gourous du Code
  • C
  • Conception d’une bibliothèque réentrant en C – Obscurification
  • Articles récents

    • Challenge Node.js – Un chèque cadeau à gagner !
    • Node.js disponible sur Skilly !
    • Challenge Ruby On Rails – Un chèque cadeau à gagner !
    • Ruby On Rails disponible sur Skilly !
    • Challenge MySQL – Un chèque cadeau à gagner !
  • Allez viens on est bien !

  • Twitter
    Skilly
    Skilly
    @SkillyFR

    @shafan_dev Bonjour Pierre, nous sommes toujours là :) Vous avez constaté un problème sur le site ? Je vous propose d'en parler en DM.

    Répondre Retweeter Favori
    9 h 18 min · 21 avril 2015
    Twitter
    Clever Institut
    Clever Institut
    @CleverInstitut

    Testez vos compétences GIT sur @SkillyFR et participez à notre prochaine formation du 29 et 30 janvier chez @CleverAge

    Répondre Retweeter Favori
    17 h 29 min · 19 janvier 2015 · Retweeté par Skilly
    Twitter
    Shmoolki
    Shmoolki
    @Shmoolki

    Dossier : Quand choisir #MySQL ou #NoSQL ? bit.ly/1Bl8baO MErci @SkillyFR

    Répondre Retweeter Favori
    9 h 52 min · 5 janvier 2015 · Retweeté par Skilly
    Twitter
    Skilly
    Skilly
    @SkillyFR

    L'équipe Skilly vous souhaite de très bonnes fêtes de fin d'année ! :) pic.twitter.com/jop1BxK8nw

    Répondre Retweeter Favori
    15 h 22 min · 24 décembre 2014
    Twitter
    Skilly
    Skilly
    @SkillyFR

    Cette semaine, on parle de Skilly dans @debugroomtv ! Regardez l'émission ici : debugroom.fr/debug-room-21-…

    Répondre Retweeter Favori
    17 h 04 min · 23 décembre 2014
  • Recherche

© COPYRIGHT 2013 L'ŒIL DE SKILLY