Discussion:Introduction au langage C/Types

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche

C'est la cata ce cours. Un char contient un byte signé ou pas, selon l'implémentation. Il faut donc présenter les types char, signed char et unsigned char. Les valeurs comme SHORT_MIN ne sont pas de -32768, mais -32767. Un char ne prend pas un octet, mais un byte (l'unité d'adressage). Le (void) ne correspond pas à la pratique et n'a guère de sens dans un langage d'expression comme C : selon la même logique il faudrait écrire (void)a = b + c; pour indiquer qu'on n'utilise pas la valeur de l'assignation. En revanche on évite de déclarer la taille d'un tableau qu'on initialise. Initialiser un char* avec une chaîne constante viole la const-correctness. Etc. 83.189.167.227 19 février 2008 à 17:32 (UTC)

Bonjour 83.189.167.227
Je vous remercie pour vos encouragements concernant cet article ;-)
  • (void)a = b + c; n’est pas autorisé et provoque une erreur de compilation : essai.c:25: error: invalid use of void expression. Tout comme il est interdit définir une variable de type void.
    • My bad, je voulais dire (void)(a = b + c); En effet, en C, les assignations et les appels de fonction sont des expressions comme les autres, qui ont un type et une valeur. 83.189.171.202 22 février 2008 à 14:39 (UTC)
  • Je caste systématiquement en void les fonctions dont je ne souhaite pas utiliser le code retour. Ex.: (void)strcpy(dest, src);.
Pourquoi ?
Travaillant dans le domaine de la qualité des logiciels, j'utilise des outils d'analyse statique comme lint, splint ou Prolint. Ces outils me signalent par un avertissement toutes les fonctions dont le code retour a été implicitement ignoré.
Une erreur courante consiste à oublier de récupérer la valeur retournée par une fonction : double surface;...;calculeSurface(...); au lieu de double surface;...;surface = calculeSurface(...);.
Le compilateur ne signale rien, mais la variable surface n’est pas mise à jour et les calculs utilisant cette grandeur seront faux.
On peut aussi oublier de la même façon de tester le code retour d'une fonction système avec des conséquences funestes : plantage violents. Ce comportement est acceptable pour un code bricolé, mais pas pour du logiciel critique (vie de personne en jeu) ou couteux (simulation numérique de un mois qui s'arrête sur un super calculateur).
  • Vous écrivez : les valeurs comme SHORT_MIN ne sont pas de -32768, mais -32767.
Sur ma plateforme le programme ci-dessous contredit votre affirmation :
INT_MIN : -2147483648, INT_MAX : 2147483647
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(void)
{
   (void)printf("INT_MIN : %d, INT_MAX : %d\n", INT_MIN, INT_MAX);
   return EXIT_SUCCESS;
}
Pour plus d'explication, lire b:Programmation C/Types de base#Entiers.
Oui, je me suis encore mal exprimé, décidemment... Je voulais dire ce qui est expliqué dans le livre : il y des valeurs garanties (au moins 32767 et au plus -32767) mais les implémentations sont libres de donner d'autres valeurs (-32768 étant effectivement courant pour SHORT_MIN). 83.189.171.202 22 février 2008 à 14:39 (UTC)
  • En revanche on évite de déclarer la taille d'un tableau qu'on initialise. : OK, c’est corrigé.
  • Initialiser un char* avec une chaîne constante viole la const-correctness : Vous avez raison.

En bref, merci pour vos remarques. C'est loin d’être parfait et je vous engage à vous inscrire, vous présenter pour ensuite corriger les erreurs et améliorer ce cours.

"Additionnons nos forces, partageons nos connaissances". --Thierry46 20 février 2008 à 13:16 (UTC)

Autres remarques :

  • « une variable est dite typée et ne peut contenir que des valeurs de ce type » Mouais, la formulation me paraît trop compliquée en introduisant une notion de type de variable et une notion (inexistante en C) de type de la valeur de la variable. Une variable a un type fixe déterminé à la compilation. Toute valeur a aussi un type. Et toute expression. Et chacun de ces types est déterminé à la compilation. Bref, C est un langage statiquement typé.
  • Un char peut faire plusieurs octets, selon l'implémentation.
  • C n'a pas de notion de caractère ('a' est un int), donc écrire qu'un char contient un caractère ASCII est un raccourci pour le moins osé.
  • Le chapitre sur les conversions de type parle de conversions automatiques, puis donne un exemple avec des conversions explicites... La promotion est oubliée.
  • Les « tableaux dynamique », ça n'existe pas.
  • Assigner une table de caractères de dimension fixe avec une chaîne littérale est un pousse au crime (GCC donne un avertissement en cas de dépassement, mais bon). Mieux vaut avoir un const char * dans la structure.
  • 83.189.171.202 22 février 2008 à 14:39 (UTC)