реклама на сайте
подробности

 
 
> Инициализация структуры. Что не так?, Обращаюсь к коллективному разуму
SasaVitebsk
сообщение Sep 6 2012, 11:59
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Написал симулятор и отладил в QT4. Всё работает, достаточно объёмный проект.
Начал переносить на целевую платформу в IAR.
Споткнулся на ровном месте. Хотелось бы решить "в лоб", так как по-другому очень большой кусок работы.
Помогите.
Есть объявление структуры:
Код
// хранится во флэши
typedef struct
{
  int8_t               *Index;         // Указатель на редактируемый параметр/ смещение для каналов
  uint16_t              Number;         // Число пунктов
  uint16_t                Ch;                // 0/ Указатель на канал
  uint8_t               *ItemName[];    // Указатели на имена пунктов
} RadioBtn_t;

Есть строки:
Код
uint8_t const    sFlowControlComport[3][9] = {"None","Hard","Xon/Xoff"};

Есть объявление:
Код
//***************************************************************
// @@ 1312. Управление потоком
RadioBtn_t rbtFlowControl =
{
    0,                                            // Указатель на редактируемое значение
    3,                                            // Всего 3 пункта,
    ((uint32_t)&ComSetting[0].flowcontrol- (uint32_t)ComSetting),    // flowcontrol
    {sFlowControlComport[NONE], sFlowControlComport[HARD], sFlowControlComport[SOFT]}
};

Qt компилирует правильно и никаких вопросов у него это не вызывает
У IAR ARM 6.4.02 возникает 2 ошибки
1 - в строке 4 структуры у него претензия, что это не константа, но на самом деле это смещение адресов и должно вычислятся на этапе компиляции. Не вижу здесь проблемы и QT тоже не видит. Как это объяснить IAR?
2 - IAR в строке 5 пишет: слишком много параметров инициализации. Честно говоря, тоже не вижу проблемы.
Понятно что я могу указать лишь только имя масива и смещаться на длину элемента, но здесь я привожу только частный случай. Есть места, где это разные строки произвольной длины, так что такой метод не предлагать. Хотелось бы поэкономить место. Не хотелось бы также создавать отдельный масив указателей - тоже + 4 байта на один радиобутон. Поскольку элементов очень много, то будет набегать. Ну и QT почемуто понимает меня и работает как нужно. Поэтому непонятно ...
Какие будут предложения?
Заранее благодарю всех откликнувшихся ...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Sep 7 2012, 08:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



rolleyes.gif Я буду добиваться, чтобы всё во флэш легло. Это обычное графическое меню, для 128*64. И в озу ему делать нечего ... biggrin.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 7 2012, 08:09
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Не выйдет. Нельзя в си инициализировать константу константой...
например так нельзя:
Код
const int x = 3;
const int y = x;  // никак, обидно:-(

и так нельзя:
Код
const RadioBtn_t rbtFlowControl =
{
    0,
    3,
    offsetof(ComSetting_t,flowcontrol),
    {sFlowControlComport[NONE], sFlowControlComport[HARD], sFlowControlComport[SOFT]}  // это невозможно при наличии const квалификатора у типа этой rbtFlowControl структуры.
};

разве что:
Код
typedef struct
{
  int8_t*     Index;
  uint16_t    Number;
  uint16_t    Ch;
  const char* ItemName[];
} RadioBtn_t;

const char sFlowControlComportNone[]    = "None";
const char sFlowControlComportHard[]    = "Hard";
const char sFlowControlComportXonXoff[] = "Xon/Xoff";

const RadioBtn_t btn =
{
    (void*)0,
    0,
    0,
    {
        sFlowControlComportNone,
        sFlowControlComportHard,
        sFlowControlComportXonXoff
    }
};
И keil и gcc (правда gcc только при включенной опции --pedantic) ругаются на сие, но по-разному:
Код
keil: main.c(26): error:  #146: too many initializer values
gcc: main.c:26:2: error: initialization of a flexible array member [-Werror=pedantic]

Думаю, что keil не прав, но от этого вам не легче. И переписать всё-же придётся чтобы был нормально переносимый код.
Я обычно когда сомневаюсь в чём-то (правда уже редко это бывает) сразу на разных компиляторах прогоняю тестики и делаю выводы о том что такое хорошо, а что такое плохо.
Безотносительно даже стандарта Си...
Вы кстати добавьте следующие ключи компиляции к gcc (если у вас он установлен) узнаете много нового о своих программах:-)
-std=c99
-pedantic
-Wall
-Wextra
-Werror


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Инициализация структуры. Что не так?   Sep 6 2012, 11:59
- - MrYuran   Цитатаuint8_t const sFlowControlComport[3][9] =...   Sep 6 2012, 12:22
- - GetSmart   По поводу ошибки номер раз. Воспользуйтесь дефайно...   Sep 6 2012, 12:39
|- - SasaVitebsk   Цитата(GetSmart @ Sep 6 2012, 16:39) По п...   Sep 6 2012, 13:08
|- - MrYuran   Цитата(SasaVitebsk @ Sep 6 2012, 17:08) И...   Sep 6 2012, 13:21
|- - scifi   Цитата(SasaVitebsk @ Sep 6 2012, 17:08) И...   Sep 6 2012, 13:23
|- - Сергей Борщ   QUOTE (SasaVitebsk @ Sep 6 2012, 16:08) Т...   Sep 6 2012, 13:27
- - SasaVitebsk   Спасибо большое. Что-то вчера, к концу рабочего дн...   Sep 7 2012, 05:54
|- - MrYuran   Цитата(SasaVitebsk @ Sep 7 2012, 09:54) В...   Sep 7 2012, 06:03
|- - demiurg_spb   Кодtypedef struct { int8_t* Index; uint16_t ...   Sep 7 2012, 06:18
- - scifi   Кстати, как-то не очень хорошо выглядит эта структ...   Sep 7 2012, 06:24
|- - SasaVitebsk   Цитата(scifi @ Sep 7 2012, 10:24) Кстати,...   Sep 7 2012, 07:38
|- - demiurg_spb   Зато размер структуры RadioBtn_t будет значительно...   Sep 7 2012, 07:54
|- - scifi   Цитата(demiurg_spb @ Sep 7 2012, 12:09) Б...   Sep 7 2012, 12:16
- - SasaVitebsk   Переписываю, хотя честно говоря - непонятно. Почем...   Sep 7 2012, 11:49
- - demiurg_spb   А вы в QT проект с++ или си делали? Если си, то по...   Sep 7 2012, 11:56
- - SasaVitebsk   Цитата(demiurg_spb @ Sep 7 2012, 14:56) А...   Sep 7 2012, 12:46
- - MrYuran   Цитата(demiurg_spb @ Sep 7 2012, 15:56) П...   Sep 7 2012, 12:51
- - ReAl   Цитата(MrYuran @ Sep 7 2012, 15:51) GCC п...   Sep 7 2012, 14:03
- - MrYuran   Цитата(ReAl @ Sep 7 2012, 18:03) Это (име...   Sep 7 2012, 14:10
- - ReAl   Цитата(MrYuran @ Sep 7 2012, 17:10) А в И...   Sep 7 2012, 14:11


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 17:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016