Affichage des articles dont le libellé est constantes. Afficher tous les articles
Affichage des articles dont le libellé est constantes. Afficher tous les articles

dimanche 11 janvier 2009

LabWindows/CVI 9.0 : les tables dynamique


Avec l'implémentation du standard C99, une avancé est fait quant à la gestion de la mémoire : la déclaration de tables dynamiques (variable-length arrays in english).

Vous me direz, les tables je connais, je la déclare un tableau de dix entiers en dimensionnant avec une constante comme suit : int iTable[10]. Les tables dynamiques, ok je connais, je déclare un pointeur puis je fais un malloc ou calloc pour la dimmensionner avec une variable, en n'oubliant pas de libérer la mémoire allouée avec un free à la fin du traitement.

Alors que sont les variable-length arrays ?
C'est la possibilité de declarer des tables en les dimensionnant avec des variables et non plus qu'avec les seules constantes.
Voici deux exemples pour illustrer l'utilisation d'un tableau dynamique : On demande à l'utilisateur de dimmensionner une table que l'on alloue puis on affiche le contenu de cette table.

AVANT
int rows, cols;
int i, j;
int *piTable = NULL;

printf("Entrez le nombre de ligne de la table: ");
scanf("%d", &iNbLigne);
printf("Entrez le nombre de colonne de la table: ");
scanf("%d", &iNbColonne);

*piTable = (int*)malloc(iNbLigne*iNbColonne*sizeof(int));
if (piTable != NULL)
{
  for (int i = 0; i < iNbLigne;i++)
  {
    for (int j = 0; j <
iNbColonne;j++)
    {
      piTable[i][j] = i*iNbColonne + j;
      printf("%d ", piTable[i][j]);
    }
    printf("\n");
  }
}
free(piTable);
piTable = NULL;


MAINTENANT
Dans le code suivant, on utilise également une autre nouveauté de la C99 : la déclaration des variables n'est plus cantonnée au début des blocs { }.

int iNbLigne, iNbColonne;
int i, j;

printf("Entrez le nombre de ligne de la table: ");
scanf("%d", &iNbLigne);
printf("Entrez le nombre de colonne de la table: ");
scanf("%d", &iNbColonne);

int tiTable[iNbLigne][iNbColonne];
for (int i = 0; i < iNbLigne; ++i)
{
  for (int j = 0; j < iNbColonne; ++j)
  {
    tiTable[i][j] = i*iNbColonne + j;
    printf("%d ",
tiTable[i][j]);
  }
  printf("\n");
}

Ici, la libération de la mémoire alouée à tiTable est effectuée à la fin de "vie" de cette variable. Comme tiTable est une variable locale, elle sera désalouée à la fin du traitement la fonction dans laquelle elle est déclarée.

Découvrez comment AJOLLY Testing peut apporter de la valeur à vos projets :
🌐 www.ajolly.fr

jeudi 8 janvier 2009

Les nouveautés de LabWindows/CVI 9.0 : le standard C99


Pas mal de nouveautés sont disponibles dans LabWindows/CVI 9.0 surtout avec l'implémentation du dernier standard du langage C : la C99. On aura donc attendu dix ans, le temps de maturation, pour bénéficier des avantages de ce nouveau standard.
Qu'apporte la C99 ?
Voici la liste de ces améliorations :
  • La déclaration des variables n'est plus cantonnée au début des blocs { }.
  • On peut déclarer des tables en les dimensionnant avec des variables et non plus qu'avec les seules constantes.
  • Chaque éléments des tables, structures et unions est maintenant initialisable distinctement et nommément.
  • Les éléments des tables, structures et unions peuvent être initialisés avec des variables.
  • nouveau type : les entiers de 64 bits (long long).
  • nouvelles fonctions snprintf et vsnprintf qui sont des versions "sécurisées" de sprintf et vsprintf puisqu'elles évitent les dépassements en contrôlant la taille de la chaîne d'entrée.
  • les macros à n arguments (...).
  • ajout de la variable du pré-compilateur __func__ contenant le nom de la fonction courante.
Je remarque que cette dernière nouveauté (__func__) de la C99 était déjà présente depuis quelques versions de CVI.

Je détaillerai dans des articles dédiés chaque aspect de la C99 pour LabWindows/CVI.

Découvrez comment AJOLLY Testing peut apporter de la valeur à vos projets :
🌐 www.ajolly.fr