После начальника отдела и менеджера я не уверен, каков третий критерий, но, возможно, вы можете изменить эту формулу в соответствии с потребностями.
=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)))
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).
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.
Самый простой способ, который я могу придумать, - это написать сценарий для генерации инициализаторов, которые вы можете включить в свой код C:
{1,2},
{1,2},
{1,2}
Затем в своем источнике:
struct st ar[] = {
#include "init.inc"
};
Вы можете организовать свой Makefile
для автоматической генерации, если хотите.
То, что у вас есть в форме I
s, - лучшее, что может дать вам Стандарт C. Я не понимаю, как можно отказаться от стандартного кода инициализации, но со сборкой все в порядке. Встраивание сборки обязательно является нестандартным непереносимым механизмом.
Проблема с рекурсивными макросами заключается в том, что вы не знаете, где остановиться.
Элазар,
Можете ли вы предоставить данные, подтверждающие вашу точку зрения, что предварительно инициализированные данные выполняются быстрее, чем инициализация во время выполнения?
Если да, запуск кода на стандартной машине с жестким диском (HDD), а ваша программа находится на жестком диске, то время для копирования данных из раздела данных вашего двоичного образа в ОЗУ по существу такое же время, как и при использовании какого-либо типа запуска -время инициализации.
Кип Лейтнер