LINUX.ORG.RU

[C] Инициализация рекурсивных структур на этапе компиляции


0

2

Есть структура:

typedef struct txt_stat
{
	wchar_t ch;
	double freq;
	struct txt_stat **txt;
	size_t tsize;
} txt_stat_t;
Поле txt указывает на массив указателей ( размера tsize ) на txt_stat_t.

На основе собранной статистики хочется вшить струкуту в исходник.
Пример:


const struct txt_stat lang_table_ru = 
{
	.ch = L'\0',
	.freq = 0.0,
	.tsize = 2,

	.txt = ( txt_stat_t *[2] ) {
		( txt_stat_t [1] ) {
			.ch = L'а',
			.freq = 0.5,
			.tsize = 1,

			.txt = {
				{
					.ch = L'б',
					.freq = 1.0,
					.tsize = 0,

					.txt = NULL
				} 
			}
		},
		( txt_stat_t [1] ) {
			.ch = L'б',
			.freq = 0.5,
			.tsize = 0,

			.txt = NULL
		} 
	}
};

Пример, соответственно, gcc не компилирует.

Вопрос: Возможна ли инициализация рекурсивной структуры на этапе компиляции ( где в примере ошибка )?

Ответ на: комментарий от Dudraug

Например так:

struct matrix {
  int rows;
  int cols;
  int **val;
} a = {        .rows=3,  .cols=1,
        .val = (int*[3]){ (int[1]){1},
                          (int[1]){2},
                          (int[1]){3} } },

  b = {        .rows=3,  .cols=4,
        .val = (int*[3]){ (int[4]){1, 2, 3, 4},
                          (int[4]){5, 6, 7, 8},
                          (int[4]){9,10,11,12} } };
gcc спокойно компилирует такой код.

dimorphus ()

Как-то так. Это c99, compound literals.

const struct txt_stat lang_table_ru = 
{
   .ch = L'\0',
   .freq = 0.0,
   .tsize = 2,

   .txt = (txt_stat_t *[2]) {
      &(txt_stat_t) {
         .ch = L'а',
         .freq = 0.5,
         .tsize = 1,

         .txt = (txt_stat_t*[1]) {
            &(txt_stat_t) {
               .ch = L'б',
               .freq = 1.0,
               .tsize = 0,

               .txt = NULL
            }
         }
      },
      &(txt_stat_t) {
         .ch = L'б',
         .freq = 0.5,
         .tsize = 0,

         .txt = NULL
      } 
   }
};

anonymous ()

Примерно так можно:

const struct txt_stat a1[] = {
	{
		.ch = L'б',
		.freq = 1.0,
		.tsize = 0,
		.txt = NULL
	}
}, a2[] = {
	{
		.ch = L'а',
		.freq = 0.5,
		.tsize = 1,
		.txt = a1
	},
	{
		.ch = L'б',
		.freq = 0.5,
		.tsize = 0,
		.txt = NULL
	}
}, lang_table_ru = {
	.ch = L'\0',
	.freq = 0.0,
	.tsize = 2,
	.txt = a2
};

const86 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.