Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а разве время не в unsigned long хранится? просто принудительно привести к целочисленному типу, вычислить разность, а результат потом разбить на секунды-минуты... не?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Доброе утро! Бьюсь на одной проблемой второй день.
Пишу на СИ в IAR.
Есть у меня некая структура:

Код: Выделить всё

typedef struct
{
  int32_t       power;
  int32_t       energy;
  uint32_t      voltage;
  uint32_t      current;
} ChannelData_t;
Затем я создал еще одну, в которую была включена предыдущая структура:

Код: Выделить всё

typedef struct
{
  ChannelData_t ChannelData[8];
} All_ChannelData_t;
Как мне теперь присвоить значения всем четырем элементам каждой из восьми структур?
Пробовал кучу вариантов, в том числе и такой в СИшном файле (который, как мне кажется, должен был работать):

Код: Выделить всё

All_ChannelData_t All_ChannelData = {
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
};

но вываливается ошибка о том, что указано слишком много значений.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

запятая последняя в каждой структуре и последняя в массиве - не лишняя ли?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Если их убрать (в любой комбинации), то ничего не меняется, хотя по логике, лишняя только одна в конце массива.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Должно быть 32 целых числа и между ними 31 запятая. Считай.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

кстати, зачем еще одна структура, если в ней только одно поле - массив? чем массив плох?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Если речь о GCC, можно так:

Код: Выделить всё

All_ChannelData_t All_ChannelData = { .ChannelData[0 ... 7] = { 1000, 1000, 1000, 1000 }};
ARV писал(а):запятая последняя в каждой структуре и последняя в массиве - не лишняя ли?
VladislavS писал(а):Должно быть 32 целых числа и между ними 31 запятая. Считай.
От этих якобы лишних запятых хуже не будет. Я предпочитаю ставить запятую и для последнего поля в структуре - потом, при добавлении новых полей, и дифф выглядит "чище" и копипастить проще.
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3501367#p3501367"]Должно быть 32 целых числа и между ними 31 запятая.[/uquote]
То есть, дополнительные разделительные фигурные скобки не нужны?
ARV писал(а):кстати, зачем еще одна структура, если в ней только одно поле - массив? чем массив плох?
В будущем, возможно расширение второй структуры.
WiseLord писал(а):All_ChannelData_t All_ChannelData = { .ChannelData[0 ... 7] = { 1000, 1000, 1000, 1000 }};
Это получается будет восемь строк (в каждой по одной структуре)?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

isx писал(а):Это получается будет восемь строк (в каждой по одной структуре)?
нет, это одна строка для всех восьми структур, но это расширение синтаксиса Си только для компилятора GCC
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="isx",url="/forum/viewtopic.php?p=3501356#p3501356"]Пробовал кучу вариантов, в том числе и такой в СИшном файле (который, как мне кажется, должен был работать):[/uquote]

Код: Выделить всё

All_ChannelData_t All_ChannelData = {
(ChannelData_t){
  1000,
  1000,
  1000,
  1000,
},
(ChannelData_t){
  1000,
  1000,
  1000,
  1000,
},
...
};
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Можно ещё и так, чуть длиннее, без GCC-шного расширения в виде оператора ...:

Код: Выделить всё

    All_ChannelData_t All_ChannelData = {
        .ChannelData[0] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[1] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[2] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[3] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[4] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[5] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[6] = {
            1000, 1000, 1000, 1000,
        },
        .ChannelData[7] = {
            1000, 1000, 1000, 1000,
        },
    };
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="ARV",url="/forum/viewtopic.php?p=3501507#p3501507"]все эти варианты не объясняют, почему у задавшего вопрос не проходит его вариант - он тоже корректный с виду[/uquote]все эти оба правильных варианта ;) инициализации вложенной структуры, как мне кажется, отлично объясняют, в чём проблема у задавшего вопрос: {1000,1000,1000,1000,} - с точки зрения компилятора это массив int[4], имеющий разительно отличаться от структуры из четырёх элементов int32_t. Мало того, даже если мы явно укажем элементам тип int32_t, что-то вроде {(int32_t)1000,(int32_t)1000,(int32_t)1000,(int32_t)1000,} всё равно будет разница в выравнивании элементов у массива и структуры.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Код: Выделить всё

typedef struct
{
  int32_t       power;
  int32_t       energy;
  uint32_t      voltage;
  uint32_t      current;
} ChannelData_t;

typedef struct
{
  ChannelData_t ChannelData[8];
} All_ChannelData_t;

All_ChannelData_t All_ChannelData = {
  1001, 1002, 1003, 1004,
  2001, 2002, 2003, 2004,
  3001, 3002, 3003, 3004,
  4001, 4002, 4003, 4004,
  5001, 5002, 5003, 5004,
  6001, 6002, 6003, 6004,
  7001, 7002, 7003, 7004,
  8001, 8002, 8003, 8004
};
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

AAX писал(а):отлично объясняют, в чём проблема у задавшего вопрос: {1000,1000,1000,1000,} - с точки зрения компилятора это массив int[4], имеющий разительно отличаться от структуры из четырёх элементов int32_t
ерунду глалолить изволите.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Всех благодарю за помощь!
Прокатил вот такой вариант:

Код: Выделить всё

All_ChannelData_t  All_ChannelData= { 
  .ChannelData[0] = { 1000, 1000, 1000, 1000},
  .ChannelData[1] = { 1000, 1000, 1000, 1000},
  .ChannelData[2] = { 1000, 1000, 1000, 1000},
  .ChannelData[3] = { 1000, 1000, 1000, 1000},
  .ChannelData[4] = { 1000, 1000, 1000, 1000},
  .ChannelData[5] = { 1000, 1000, 1000, 1000},
  .ChannelData[6] = { 1000, 1000, 1000, 1000},
  .ChannelData[7] = { 1000, 1000, 1000, 1000},
};
В принципе, это тоже, что предлагал WiseLord
Сейчас разбираюсь с выравниванием структуры. Как оказалось, этот момент тоже может добавить щепотку геморроя в работу с кодом.
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="ARV",url="/forum/viewtopic.php?p=3501526#p3501526"]ерунду глалолить изволите.[/uquote]извольте проглаголить истину, в таком раскладе. А то чот как-то... несерьёзно
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

при инициализации переменной константой не играет роль размер самой переменной - если константа "помещается" в переменную, то и Ок, а если не помещается, будет варнинг.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

Сначала правильно объясните компилятору, какую переменную вы инициализируете. Си предоставляет программисту 100500 способов выстрелить себе в ногу.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

запись, приведенная isx в его сообщении, вполне соответствует требованиям инициализации структур, и поэтому я сказал, что не понятно, почему у него не получается.
в любом случае ваши объяснения проблемы, что константа int пишется в переменную uint32_t, и, якобы, вызывает какие-то проблемы с выравниванием или размещением в памяти - это ерунда.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»