Какие есть способы заполнения массива на этапе компиляции?

Мне нужно заполнить массива на этапе компиляции, пр этом, способ int arr[3] = {1, 2, 3} мне не подходит, мне нужно заполнить массив большого размера одним значением и в несколько его ячеек положить другое значение, если писать вышеупомянутым способом получается крайне громоздко. Какими способами можно выполнить поставленную задачу на этапе компиляции? (язык си)


Ответы (1 шт):

Автор решения: AlexGlebe

Шифровальные программы поступают автоматическим генерированием массивов и записи результата в исходный код. Вот пример как это делается.

array.h :

# define  arrN  (100U)
extern  int arr [ arrN  ] ;

makearr.c :

// gcc -std=c99 makearr.c -o makearr
# include <stdio.h>
# include "array.h"
int arr [ arrN  ] ;
// по умолчанию массив с нулями
int main(){
  for ( int  i = 0 ; i < arrN  ; ++  i )
    arr [ i ] = ( ( i + 47 ) * 9973 ) % 101 ;
  FILE  * const f = fopen ( "arr.c" , "w" ) ;
  fputs("// Программа создана автоматически\n",f);
  fputs("// gcc -std=c99 -c arr.c\n",f);
  fputs("# include \"array.h\"\n",f);
  fputs("int arr [ arrN  ] = {\n",f);
  int const * i = &(arr[0]) ;
  while ( i < &(arr[arrN])  ) {
    int j = 0 ;
    do  {
      fprintf ( f , "%d , " , * i ) ;
      ++  i ;
      ++  j ;
    } while ( j < 12  &&  i < &(arr[arrN]) ) ;
    fputs ( "\n" ,f ) ; }
  fputs("  } ;\n",f);  
  fclose(f);}

Компилируем и запускаем makearr.
Результат arr.c :

// Программа создана автоматически
// gcc -std=c99 -c arr.c
# include "array.h"
int arr [ arrN  ] = {
91 , 65 , 39 , 13 , 88 , 62 , 36 , 10 , 85 , 59 , 33 , 7 , 
82 , 56 , 30 , 4 , 79 , 53 , 27 , 1 , 76 , 50 , 24 , 99 , 
73 , 47 , 21 , 96 , 70 , 44 , 18 , 93 , 67 , 41 , 15 , 90 , 
64 , 38 , 12 , 87 , 61 , 35 , 9 , 84 , 58 , 32 , 6 , 81 , 
55 , 29 , 3 , 78 , 52 , 26 , 0 , 75 , 49 , 23 , 98 , 72 , 
46 , 20 , 95 , 69 , 43 , 17 , 92 , 66 , 40 , 14 , 89 , 63 , 
37 , 11 , 86 , 60 , 34 , 8 , 83 , 57 , 31 , 5 , 80 , 54 , 
28 , 2 , 77 , 51 , 25 , 100 , 74 , 48 , 22 , 97 , 71 , 45 , 
19 , 94 , 68 , 42 , 
  } ;
→ Ссылка