инициализация C выстраивает с повторяющимися данными

После начальника отдела и менеджера я не уверен, каков третий критерий, но, возможно, вы можете изменить эту формулу в соответствии с потребностями.

=INDEX(A:A,AGGREGATE(15,7,ROW($2:$9)/((B$2:B$9=F4)*(C$2:C$9=E4)),COUNTIFS(E4:E$4,E4,F4:F$4,F4)))

enter image description here

5
задан Elazar Leibovich 10 May 2009 в 10:02
поделиться

5 ответов

The boost preprocessor library (which works fine for C) could help.

#include <boost/preprocessor/repetition/enum.hpp>

#define VALUE(z, n, text) {1,2}

struct st ar[] = {
    BOOST_PP_ENUM(27, VALUE, _)
};

#undef VALUE

If you wish to use it, you'll just need the boost/preprocessor directory from boost - it's entirely self contained.

Although, it does have some arbitrary limits on the number of elements (I think it's 256 repetitions in this case). There is an alternative called chaos which doesn't, but it's experimental and will only work for preprocessors that follow the standard precisely (GCC's does).

10
ответ дан 18 December 2019 в 09:52
поделиться

I'm guessing you can, on the file with the array definition, do:

#include "rep_array_autogen.c"
struct st ar[SIZE_OF_ARRAY] = REPARRAY_DATA;

and have your Makefile generate rep_array_autogen.c with a format like

#define SIZE_OF_ARRAY 3
#define REPARRAY_DATA {{1, 2}, {1, 2}, {1, 2}, }

Since rep_array_autogen.c is built on your machine, it would be just as fast as hand-coding it in there.

2
ответ дан 18 December 2019 в 09:52
поделиться

Самый простой способ, который я могу придумать, - это написать сценарий для генерации инициализаторов, которые вы можете включить в свой код C:

{1,2},
{1,2},
{1,2}

Затем в своем источнике:

struct st ar[] = {
    #include "init.inc"
};

Вы можете организовать свой Makefile для автоматической генерации, если хотите.

5
ответ дан 18 December 2019 в 09:52
поделиться

То, что у вас есть в форме I s, - лучшее, что может дать вам Стандарт C. Я не понимаю, как можно отказаться от стандартного кода инициализации, но со сборкой все в порядке. Встраивание сборки обязательно является нестандартным непереносимым механизмом.

Проблема с рекурсивными макросами заключается в том, что вы не знаете, где остановиться.

0
ответ дан 18 December 2019 в 09:52
поделиться

Элазар,

Можете ли вы предоставить данные, подтверждающие вашу точку зрения, что предварительно инициализированные данные выполняются быстрее, чем инициализация во время выполнения?

Если да, запуск кода на стандартной машине с жестким диском (HDD), а ваша программа находится на жестком диске, то время для копирования данных из раздела данных вашего двоичного образа в ОЗУ по существу такое же время, как и при использовании какого-либо типа запуска -время инициализации.

Кип Лейтнер

0
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: