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

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

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

Сообщение ARV »

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

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

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

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение isx »

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

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

Сообщение VladislavS »

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

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

Сообщение ARV »

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

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

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

Сообщение 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

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

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение 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,
},
...
};
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение 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,} всё равно будет разница в выравнивании элементов у массива и структуры.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение 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
Опытный кот
Сообщения: 718
Зарегистрирован: Сб ноя 16, 2013 23:34:34

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

Сообщение AAX »

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

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

Сообщение ARV »

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

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

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

Сообщение AAX »

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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