Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > инициализация массива в структуре


Автор: Alvi 19.2.2008, 10:39
Есть язык Си (НЕ С++). Нужно организовать примитивную базу данных для описания меню на микроконтроллер. 
Итак, хотелось бы всё меню поместить в структуру, в которой помещаются названия менюшек, единиц измерения, их значений и т.д. Для простоты задачи сделаем структуру из четырех элементов:
struct{
unsigned char ID; 
char Name[3];
int Default[3];
int Value[3];
}Menu;

где 
ID - номер элемента меню
Name - название элемента меню
Default - значения по умолчанию
value - текущее значение

все как бы ничего, но у меня параметры Name и Default должны инициализироваться при программировании, и не изменяться, т.е. хотелось бы видеть все это примерно в таком виде:

struct{
unsigned char ID; 
char Name[3] = {"Перем1", "Перем2", "Перем3"};
int Default[3] = {1, 2, 3};
int Value[3];
}Menu;

Но не работает, собака... При компиляции пишет ошибки как раз в строках инициализации массивов Name и Default.
Отсюда вопрос: Как это можно обойти? 
Не принимается инициализация элементов структуры типа:
Menu.Name[0] = "Перем1";
Menu.Name[1] = "Перем2";
Menu.Name[2] = "Перем3";

Т.к. таких элементов просто дофига ,плюс в структуре есть один двумерный массив, плюс при программировании для микроконтроллеров есть куча специфических моментов при инициализации строковых переменных (организация памяти там через ж... сделана). Т.е. в таком виде инициализация меню займет половина памяти микроконтроллера.
Жду ваших предложений.

Автор: EnergoHokum 19.2.2008, 11:13
То-есть, если я правильно понял, нужно, чтобы эти поля были одинаковыми для всех экземпляров этой структуры? Тогда, может быть, сделать эти поля static? И char Name[3] = {"Перем1", "Перем2", "Перем3"};, мне кажется, скорее должно быть char* Name[3] = {"Перем1", "Перем2", "Перем3"};. Поправьте меня, если что...

Автор: _stranger_ 19.2.2008, 11:21
может вот так:
Код

typedef struct
{
   unsigned char ID; 
   char Name[3];
   int Default[3];
   int Value[3];
}Menu;
Menu qqq = {0,{'a', 'a', 'a'},{1, 2, 3},};

Автор: Alvi 20.2.2008, 09:56
Да, все верно! Я уже вчера сам разобрался. Всем спасибо smile 
Надо, действительно, делать так:

struct M{
unsigned char ID; 
char Name[3];
int Default[3];
int Value[3];
};

struct M Menu{0, 
{"Перем1", "Перем2", "Перем2"},
{1, 2, 3},
{0, 0, 0}
};

Вот и все дела. Обращаться к элементам таких массивов совсем просто:
Menu.Value[2] = Menu.Default[2];

Ну или через typedef, что то же самое было бы smile

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)