Какие есть способы заполнения массива на этапе компиляции?
Мне нужно заполнить массива на этапе компиляции, пр этом, способ 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 ,
} ;