0 / 0 / 0
Регистрация: 02.03.2023
Сообщений: 4
1

Инициализация константного массива

02.03.2023, 11:17. Показов 615. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Есть ли какой-нибудь способ/трюк для инициализации константного массива из разных единиц трансляции?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// File storage.h
// Макрос? / constexpr? / ...?
#define SET_VALUE(index, val)
 
// File storage.cpp
// Дефолтная инициализация
const int array[5] = {0};
 
// File a.cpp
SET_VALUE(1, 10);
 
// File b.cpp
SET_VALUE(3, 30);
Ожидаемый результат:
- в массиве array будут следующие значения: [0, 10, 0, 30, 0]
- сам массив будет расположен в секции .rodata

Зараниее спасибо всем откликнушимся.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2023, 11:17
Ответы с готовыми решениями:

Инициализация константного поля
#include <iostream> struct Value { const int m_value = 0; Value(const int m_value =...

Инициализация константного вектора списком инициализации
Есть вот такая программка: #include <iostream> #include <vector> using namespace std; ...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является...

Инициализация константного члена класса с проверкой значения
Допустим есть класс константным членом class a{ const int i; public: a(int...

Как избежать дублирования кода при написании константного и не константного метода?
Есть класс Buffer, который содержит метод forBounds, который в качестве параметров принимает...

8
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.03.2023, 12:27 2
Bassib, для начала массив нужно сделать extern, чтобы его можно было видеть в других единицах транляции, потому что const дает внутреннее связывание по умолчанию.

Далее нужны уточнения: массив должен иметь значение [0, 10, 0, 30, 0] уже зашитыми в исполняемый файл? Или "инициализация" при запуске тоже допускается?
0
0 / 0 / 0
Регистрация: 02.03.2023
Сообщений: 4
02.03.2023, 12:59  [ТС] 3
DrOffset, да с extern понятно, упустил. Тут это не главное.
Я уточнил про .rodata, т.е. "инициализация при запуске" не допускается. Элементы массива должны сформироваться во время компиляции и в финальном виде попасть в исполняемый файл.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.03.2023, 13:07 4
Цитата Сообщение от Bassib Посмотреть сообщение
Элементы массива должны сформироваться во время компиляции и в финальном виде попасть в исполняемый файл.
Думаю, что по крайней мере стандартными средствами, для разных единиц трансляции это сделать невозможно.
0
0 / 0 / 0
Регистрация: 02.03.2023
Сообщений: 4
02.03.2023, 13:49  [ТС] 5
Жаль конечно, если не найдется какого-то трюка. Может у кого-то еще будут мысли.
В любом случае, DrOffset, спасибо за попытку помочь.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.03.2023, 13:55 6
Bassib, думаю, в конкретном компиляторе можно что-то сделать, через нестандартные расширения, ассемблерные вставки и какой-нибудь linker script (как в gcc). Но конкретного рецепта "навскидку" я не выдам.

Может расскажете зачем вам это понадобилось?
0
Модератор
5102 / 3329 / 535
Регистрация: 01.06.2013
Сообщений: 6,956
Записей в блоге: 9
02.03.2023, 14:10 7
Подозреваю что это для микроконтроллера, например ARM, где rodata не попадёт в ОЗУ, а будет при выполнении прямо из flash памяти читаться. Иначе смысла нет. Соответственно, и спрашивать нужно про конкретный компилятор для конкретного микроконтроллера в разделе про микроконтроллеры.
0
0 / 0 / 0
Регистрация: 02.03.2023
Сообщений: 4
02.03.2023, 14:12  [ТС] 8
Речь про embedded системы. Хотел получить модульность и сэкономить RAM.
Идея заключалась в формировании общей таблицы векторов прерываний, которые бы устанавливались в этой таблице разными "модулями" в разных файлах.
Сейчас это обычно делается через weak функции у ручного формирования таблицы, но там жестко фиксируется имя этого обработчика.
Возможно несколько сумбурное объяснение, но надеюсь идею Вы поняли
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.03.2023, 14:14 9
Цитата Сообщение от Curry Посмотреть сообщение
Подозреваю что это для микроконтроллера, например ARM, где rodata не попадёт в ОЗУ
Это как раз понятно.
Непонятно было зачем нужно именно один массив из разных единиц трансляции инициализировать.
0
02.03.2023, 14:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2023, 14:14
Помогаю со студенческими работами здесь

Добрый вечер! Передача в функцию константного значения и обьявление им массива
Вот у меня есть функция с объявленым массивом внутри: f(const int &C) { int mass; } Где тут...

инициализация массива, вывод массива и обработка массива должны быть реализованы с помощью функций.
1 Последовательность a1; a2; ...; an состоит из нулей и единиц. Поставить в начало этой...

Инициализация константного массива из элементов кортежа
Как правильно создать константный массив из элементов кортежа? (я пробовал создать не константный)...

Перевод массива комплексных чисел в массив float. Инициализация двумерного массива
Здравствуйте! Начал осваивать python и никак не могу разобраться. Есть массив list, состоящий из n...

Инициализация массива
Не могу понять, почему компилятор ругается, вообщем вот что я сделал: public class queen {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru