@Sh0ttky

Можно ли инициализировать статический массив алгоритмом?

Если мне нужно заполнить статический массив скажем 8000 известными числами, предоставляют ли языки c и c++ (предпочтительно си) какие-либо инструменты для этого?

т.е. заполнять не так
static const int a[3] = {1 , 2, 3};

а написать что-то типа
static const int a[50];
for (int i = 0; i < 50; i++) a[i] = i;

int main() {...}


понятно, что можно заполнить заголовочный файл скриптом, но интересна возможность сделать это именно компилятором.
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
В C++14 для этого есть constexpr-функции:

#include <iostream>
#include <array>

template<typename T, size_t n>
constexpr T& at(std::array<T, n>& a, size_t i) {
    return const_cast<T&>(static_cast<const std::array<T, n>&>(a)[i]);
}

template<typename T, size_t n>
constexpr const T& at(const std::array<T, n>& a, size_t i) {
    return a[i];
}

constexpr std::array<int, 20> generate_fib() {
    auto result = std::array<int, 20>{};
    for (size_t i = 0; i < 20; ++i) {
        if (i < 2) {
            at(result, i) = 1;
        } else {
            at(result, i) = at(result, i-1) + at(result, i-2);
        }
    }
    return result;
}

constexpr static const auto fib = generate_fib();

int main()
{
    for (auto elem : fib) {
        std::cout << elem << ' ';
    }
    return 0;
}

Скомпилировать онлайн на GCC6.

Ограничения:
  1. В C++14 не предусмотрели constexpr для std::array::operator[]. Обещают исправить в C++17, а пока имеем костыль в виде функции at.
  2. Ни одна из текущих версий Visual Studio не способна скомпилировать данный код. M$ не дружит с constexpr.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@dmtrrr
Backend developer
Что мешает написать ф-цию?
Ответ написан
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Возможно вы ищете метапрограммирование?
Ответ написан
Adamos
@Adamos
Напишите простенький скрипт, который создает .h-файл с объявлением и всеми данными этого массива. Делов-то.
Аналогично в код подключается, например, графика в формате XPM.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект