92 votes

Tableau variablement modifié au niveau du fichier

Je veux créer un tableau statique constant qui sera utilisé dans l'ensemble de mon fichier d'implémentation Objective-C et qui ressemblera à quelque chose comme ceci au niveau supérieur de mon fichier ".m" :

static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = { 
  1,
  2, 
  3, 
  4 };

Je prévois d'utiliser NUM_TYPES plus tard dans le fichier, donc je voulais le mettre dans une variable.

Cependant, lorsque je fais cela, j'obtiens l'erreur suivante

"Types modifiés de manière variable au niveau du fichier".

J'en déduis que cela peut avoir un rapport avec le fait que la taille du tableau est une variable (je n'obtiens pas ce message lorsque je place un entier littéral à cet endroit, par exemple static int types[4] ).

Je veux réparer cela, mais peut-être que je m'y prends mal... J'ai deux objectifs ici :

  1. Pour avoir un tableau qui est accessible dans tout le fichier
  2. Pour encapsuler NUM_TYPES dans une variable pour ne pas avoir le même littéral éparpillé à différents endroits dans mon fichier.

Des suggestions ?

[EDIT] J'ai trouvé ça dans la Faq C : http://c-faq.com/ansi/constasconst.html

67voto

larsr Points 387

La raison de cet avertissement est que const dans c ne veut pas dire constant. Il signifie "lecture seule". La valeur est donc stockée à une adresse mémoire et peut potentiellement être modifiée par le code machine.

35voto

caf Points 114951

Si vous comptez utiliser le préprocesseur de toute façon, comme dans les autres réponses, vous pouvez faire en sorte que le compilateur détermine la valeur de l'option NUM_TYPES automatiquement :

#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = { 
  1,
  2, 
  3, 
  4 };

22voto

Jim Buck Points 10839
#define NUM_TYPES 4

11voto

Dave L Delaney Points 71

Il est également possible d'utiliser une énumération.

typedef enum {
    typeNo1 = 1,
    typeNo2,
    typeNo3,
    typeNo4,
    NumOfTypes = typeNo4
}  TypeOfSomething;

3voto

hans lepoeter Points 1

Je pense qu'il s'agit d'un défaut de nombreux compilateurs C. Je sais avec certitude que les compilateurs avec lesquels j'ai travaillé ne stockent pas une variable "static const" à une adresse mais remplacent l'utilisation dans le code par la constante même. Ceci peut être vérifié car vous obtiendrez la même somme de contrôle pour le code produit lorsque vous utilisez une directive #define du préprocesseur et lorsque vous utilisez une variable "static const".

Quoi qu'il en soit, vous devriez utiliser des variables constantes statiques au lieu de #defines chaque fois que cela est possible, car les constantes statiques sont sans danger pour les types.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X