Pages

vendredi 18 janvier 2013

délégation d'événement en js

En règle générale les événements sont attachés à l'élément qui va le traiter.

Par exemple en java-script, un menu (ul) contenant 10 entrées (li) où chaque entrée est associée à une action crée, au total, 10 événements. 10 événements attachés à la même action.

Pour dire vrai, cette méthode est peu performante et peut la plupart du temps être remplacée par un seul événement sur le parent. À ce moment le parent vérifie si l'événement est généré par un de ces fils et fait le traitement en conséquence.

var ul = document.getElementById("menu");
ul.onclick = function(e){
  if (e.target.parentNode === ul) //est-ce toi mon fils ?
    openWithAjax(e)
}

On peut trouver le même type de fonction dans JQuery: .on().

dimanche 13 janvier 2013

nullptr et std::nullptr_t

Dans les nouveaux mots-clef du C++11 voyons aujourd'hui nullptr.

Étant un mot-clef, il fait partie intégrante du langage mais son type (std::nullptr_t) est défini dans l'en-tête <cstddef>.

nullptr indique comme son nom l'indique un pointer nul. Il est beaucoup plus parlant que NULL ou 0.
Il permet également de lever les ambiguïtés comme le montre cet exemple:

void f(long);
void f(int*);

int main()
{
  f(0); //ambigu
  f(NULL); //ambigu ou autres erreurs
  f(nullptr);
}

Pour finir, nullptr ce cast implicitement en tout type de pointer.

int * p = nullptr;

mardi 8 janvier 2013

initialiser un tableau en C

Petite note rapide sur l'initialisation d'un tableau en C.

Si la taille du tableau n'est pas indiquée et qu'il est initialisé à sa définition, alors la taille sera d'une nombre d'éléments insérés.

int a[] = {0,1,2,3}; //4 valeurs
int a[4] = {1}; //{1,0,0,0}
int a[4] = {}; //{0,0,0,0}
int a[] = {1,[3]=3,5}; //positionnement d'initiation {1,0,0,3,5}

La dernière n'est pas valide en C++ :'(

A noter qu'une virgule après la dernière valeur est valide ({0,1,}). Mais pas si le tableau est vide ({,}).

jeudi 3 janvier 2013

Structure et union anonyme

Le C et le C++ permettent la création de structures et unions anonymes.

La structure anonyme à l'intérieur de l'union permet de regrouper plusieurs valeurs sans passer par une variable intermédiaire (une structure nommée).
(Exemple en C pour changer.)

typedef enum { MOUSE, KEYBOARD } ActionType;
typedef struct {
  ActionType type;
  union {
    int key;
    struct {
      unsigned int x, y;
    };
  } event;
} Action;
Action action1 = {MOUSE, {.x=0, .y=0}};
Action action2 = {KEYBOARD, {.key=128}};

Peu utilisé, il est possible de "déplacer" les attributs d'une structure sous-jacente dans la structure mère.
Par exemple une structure Coord à l'intérieur d'une structure Rect.

typedef struct {
  int x, y;
} Coord;

typedef struct {
  Coord coord;
  int w, h;
} Rect;

Pour connaître la position il faut -et c'est dommage- passer par la variable coord. C'est à ce moment que l'union et la structure anonyme rentre en jeu.

typedef struct {
  union {
    Coord coord;
    struct {
      int x, y;
    };
  };
  int w, h;
} Rect;

La contrainte est de devoir re-déclarer les attributs de la structure Coord. GCC fournit une extension (flag -fms-extensions) qui permet de s'en affranchir. Il faut indiquer le type, sans le nommer.

typedef struct {
  Coord;
  int w, h;
} Rect;

Mais comme toutes les extensions, à n'utiliser que dans des projets pour ce compilateur ;).