32 votes

initialisation d'un tableau d'entiers

Quelqu'un aurait-il un moyen d'initialiser un tableau de ints (tout multi-octets type est bien, vraiment), à une valeur non nulle et non -1 valeur tout simplement? Je veux dire, est-il un moyen de le faire en une seule ligne, sans avoir à faire de chaque élément individuellement:

int arr[30] = {1, 1, 1, 1, ...}; // that works, but takes too long to type

int arr[30] = {1}; // nope, that gives 1, 0, 0, 0, ...

int arr[30];
memset(arr, 1, sizeof(arr)); // That doesn't work correctly for arrays with multi-byte
                             //   types such as int

Juste pour info, à l'aide de memset() de cette manière sur les tableaux statiques donne:

arr[0] = 0x01010101
arr[1] = 0x01010101
arr[2] = 0x01010101

L'autre option:

for(count = 0; count < 30; count++)
   arr[count] = 1;    // Yup, that does it, but it's two lines.

Quelqu'un a d'autres idées? Tant que c'est du code C, pas de limites sur la solution. (d'autres libs sont beaux)

36voto

mux Points 9745

Il s'agit d'une extension GCC:

 int a[100] = {[0 ... 99] = 1};
 

23voto

Art Points 6040
 for (count = 0; count < 30; count++) arr[count] = 1;
 

Une ligne. :)

20voto

Omkant Points 4781

Vous avez dit quelque chose à propos de 2 lignes mais vous pouvez le faire sur une seule ligne en utilisant l'opérateur virgule , .

 for(count = 0; count < 30 ; arr[count] = 1,count++);
 

14voto

Lundin Points 21616

La seule façon raisonnable de le faire pendant l'initialisation (plutôt que pendant l'exécution) semble être:

 #define ONE1     1
#define FIVE1    ONE1, ONE1, ONE1, ONE1, ONE1
#define TEN1     FIVE1, FIVE1
#define TWENTY1  TEN1, TEN1
#define FIFTY1   TWENTY1, TWENTY1, TEN1
#define HUNDRED1 FIFTY1, FIFTY1

int array [100][4] =
{
  HUNDRED1,
  HUNDRED1,
  HUNDRED1,
  HUNDRED1
};
 

Et ensuite, #define ONE2 2 et ainsi de suite. Vous avez eu l'idée.

EDIT: La raison pour laquelle j'ai écrit autant de macros était de démontrer la flexibilité de cette solution. Pour ce cas particulier, vous n'avez pas besoin de tous. Mais avec des macros comme celles-ci, vous pouvez écrire n'importe quel type de liste d'initialisation de manière rapide et flexible:

 {
  FIFTY1, FIFTY2,  // 1,1,1,1... 50 times, then 2,2,2,2... 50 times
  TWENTY3, EIGHTY4 // 3,3,3,3... 20 times, then 4,4,4,4... 80 times
  ... // and so on
};
 

10voto

AndreyT Points 139512

En C, vous développez généralement votre propre «bibliothèque de support» avec des macros comme

 #define SET_ALL(a_, n_, v_)\
  do { size_t i, n = (n_); for (i = 0; i < n; ++i) (a_)[i] = (v_); } while(0)

#define SET_ALL_A(a_, v_) SET_ALL(a_, sizeof(a_) / sizeof *(a_), v_)
#define ZERO_ALL(a_, n_) SET_ALL(a_, n_, 0)
#define ZERO_ALL_A(a_) SET_ALL_A(a_, 0)
 

puis les utiliser dans votre code comme

 int arr[30];

SET_ALL_A(arr, 1);
 

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