Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Вт янв 23, 2018 14:30:54

А как, по Вашему, без скобок различить buf[3][2] и buf[2][3]? Естественно, смысл их как раз в этом.

Спойлер
Код:
uint8_t buf[4][2][3][5] = {   //    4 группы
  {                           // по 2 группы
    {                         // по 3 группы
      {43, 122, 43, 81, 28},  // по 5 элементов uint8_t
      {46, 553, 21, 35, 67},
      {42, 169, 60, 31, 98},
    },
    {
      {74, 296, 43, 62, 28},
      {54, 323, 21, 33, 89},
      {45, 787, 21, 17, 90},
    },
  },
  {
    {
      {84, 122, 43, 81, 28},
      {74, 553, 21, 35, 67},
      {84, 169, 60, 31, 98},
    },
    {
      {87, 26, 43, 69, 28},
      {95, 33, 21, 32, 89},
      {04, 77, 21, 18, 90},
    },
  },
  {
    {
      {84, 12, 43, 82, 28},
      {74, 53, 21, 35, 67},
      {84, 19, 60, 36, 98},
    },
    {
      {95, 33, 21, 32, 89},
      {87, 26, 43, 69, 28},
      {24, 77, 21, 18, 90},
    },
  },
  {
    {
      {84, 19, 60, 36, 98},
      {84, 12, 43, 82, 28},
      {74, 53, 21, 35, 67},
    },
    {
      {87, 26, 43, 69, 28},
      {04, 77, 21, 18, 90},
      {95, 33, 21, 32, 89},
    },
  },
};

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

Вт янв 23, 2018 20:27:19

Доброго времени суток. Раньше жил - не тужил, именовал константы с помощью дефайнов и горя не знал. Сегодня вычитал, что это неправильно, так делают лузеры, и им потом девушки не дают... Надо исправляться :))) Итак, было:
Код:
#define DEFAULT 100;

Далее в EEPROM объявляется переменная с этим значением:
Код:
unsigned char EEMEM mode      = DEFAULT;

И все чудесно работает.
Переделал так:
Код:
const   unsigned    char   DEFAULT   = 100;

Теперь на строчку с объявлением переменной в EEPROM ругается "error: initializer element is not constant". Компилятор GCC. Что я сделал не так ?
Если что, 5 правило отсюда http://chipenable.ru/index.php/embedded ... rules.html

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

Вт янв 23, 2018 20:48:32

Пока_без_кота писал(а):Раньше жил - не тужил, именовал константы с помощью дефайнов и горя не знал. Сегодня вычитал, что это неправильно, так делают лузеры, и им потом девушки не дают...
не читайте глупости
Пока_без_кота писал(а):Переделал так:
вы объявили переменную, которая по умолчанию получает значение 100 и не может быть изменена в дальнейшем.
Пока_без_кота писал(а):Теперь на строчку с объявлением переменной в EEPROM ругается
и правильно делает, так как на этапе компиляции переменные не доступны.

верните, как было, и не парьте мозг

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

Вт янв 23, 2018 22:00:23

Спасибо :beer:

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

Вт янв 23, 2018 22:23:40

ARV писал(а):не читайте глупости

Полностью согласен.

Не извращайтесь, спокойно пользуйтесь #define и дальше :) Только желательно явно указывать тип:
Код:
#define DEFAULT (unsigned char)100;

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

Ср янв 24, 2018 07:06:48

AndyBig писал(а):Только желательно явно указывать тип
для констант, укладывющихся в int, не обязательно, а для больших - присоединяюсь к рекомендации.

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

Ср янв 24, 2018 14:58:02

Теперь на строчку с объявлением переменной в EEPROM ругается "error: initializer element is not constant". Компилятор GCC. Что я сделал не так ?

из стандарта:
All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

так, к примеру, вполне корректно:
Код:
static const unsigned int DEF=100;

int main(){
    volatile unsigned int def = DEF;
    return 0;
}


Если что, 5 правило отсюда http://chipenable.ru/index.php/embedded ... rules.html

вообще там все разумно, но стоит добавить "где это возможно". И компилятор должен быть достаточно мозговитый и со включенными оптимизациями - иначе под эту константу-переменную (она с точки зрения языка таки переменная с неизменным значением) выделится память.
вот тот кусочек кода, gcc с разной оптимизацией
-O0
Спойлер
Код:
arkhnchul@tween-arkhost:/tmp/ctst$ gcc -O0 -S -c tst1.c -o -
   .file   "tst1.c"
   .section   .rodata
   .align 4
   .type   DEF, @object
   .size   DEF, 4
DEF:
   .long   100
   .text
   .globl   main
   .type   main, @function
main:
.LFB0:
   .cfi_startproc
   pushq   %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq   %rsp, %rbp
   .cfi_def_cfa_register 6
   movl   $100, %eax
   movl   %eax, -4(%rbp)
   movl   $0, %eax
   popq   %rbp
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc
.LFE0:
   .size   main, .-main
   .ident   "GCC: (Debian 7.2.0-19) 7.2.0"
   .section   .note.GNU-stack,"",@progbits

-O1
Спойлер
Код:
arkhnchul@tween-arkhost:/tmp/ctst$ gcc -O1 -S -c tst1.c -o -
   .file   "tst1.c"
   .text
   .globl   main
   .type   main, @function
main:
.LFB0:
   .cfi_startproc
   movl   $100, -4(%rsp)
   movl   $0, %eax
   ret
   .cfi_endproc
.LFE0:
   .size   main, .-main
   .ident   "GCC: (Debian 7.2.0-19) 7.2.0"
   .section   .note.GNU-stack,"",@progbits

т.е. нужно хотя бы O1

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

Вс янв 28, 2018 13:25:13

Подскажите, что значит эта запить?

Вообще то тут пытались инициализировать двумерный массив вот только с ошибками, надо было сделать так:
Код:
uint8_t buf [3][2] = {
{12 , 18},
{11, 28},
{13, 15}
};

:)


Вот еще пример
Код:
static const registerSetting_t preferredSettings[]=
{
  {CC1101_IOCFG0,      0x06},
  {CC1101_FIFOTHR,     0x47},
  {CC1101_SYNC1,       0x7A},
  {CC1101_SYNC0,       0x0E},
  {CC1101_PKTLEN,      0x14},
  {CC1101_PKTCTRL0,    0x05},
  {CC1101_FSCTRL1,     0x06},
  {CC1101_FREQ2,       0x21},
  {CC1101_FREQ1,       0x62},
  {CC1101_FREQ0,       0x76},
  {CC1101_MDMCFG4,     0xCA},
  {CC1101_MDMCFG3,     0xF8},
  {CC1101_MDMCFG2,     0x16},
  {CC1101_DEVIATN,     0x40},
  {CC1101_MCSM0,       0x18},
  {CC1101_FOCCFG,      0x16},
  {CC1101_AGCCTRL2,    0x43},
  {CC1101_AGCCTRL1,    0x49},
  {CC1101_WORCTRL,     0xFB},
  {CC1101_FSCAL3,      0xE9},
  {CC1101_FSCAL2,      0x2A},
  {CC1101_FSCAL1,      0x00},
  {CC1101_FSCAL0,      0x1F},
  {CC1101_TEST2,       0x81},
  {CC1101_TEST1,       0x35},
  {CC1101_TEST0,       0x09},
};

Видимо по четным индексам идет адрес, по не четным - значение. Скобки для удобства чтения кода. Вроде так.

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

Вс янв 28, 2018 13:39:17

Вероятнее всего, что тип registerSetting_t состоит из двух элементов. Был бы int - было бы сообщение об ошибке. не?

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

Вс янв 28, 2018 16:17:18

Не могу разкурочить этот тип. Это выдал кодогенератора, мол заготовка. Определение этого типа нет.

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

Вс янв 28, 2018 19:27:18

Это выдал кодогенератора, мол заготовка. Определение этого типа нет.

Если код собирается - его не может не быть. Гляньте в препроцессорный выхлоп - возможно для этого придётся включить временно опцию preprocess only в настройках проекта. В папочке с временными файлами компиляции загляните в разные типы - они или *.i или *.pre, иногда вместо объектников - у разных тулчейнов по разному.

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

Чт фев 15, 2018 14:17:06

Почему переменная, обьявленная как unsigned char уходит на минус?
Код:
unsigned char x;

if(x<0) x=0; // так компилятор ругается

if(x<=0) x=0; // уходит на минус

if(x==0) x=0; // тоже уходит на минус

if(x<1) x=0;   // тоже уходит на минус


Это в IAR для ARM.

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

Чт фев 15, 2018 14:20:19

Почему переменная, обьявленная как unsigned char уходит на минус?

Как переменная, обьявленная как unsigned char, может уйти на минус?

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

Чт фев 15, 2018 14:21:42

Что значит "уходит в минус"?
Ну и напоминаю: по умолчанию все операнды выражения автоматически приводятся к int (или к типу более "широкого" операнда). поэтому при сравнении x с 1 и переменная х, и константа 1 становятся ЗНАКОВЫМИ. со всеми вытекающими.

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

Чт фев 15, 2018 14:22:41

что значит "уходит на минус"?

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

Чт фев 15, 2018 14:24:04

Забыл написать, уходит на минус при
x--;

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

Чт фев 15, 2018 14:25:54

dm211 писал(а):уходит на минус при
x--;
и в каком месте вашего вопроса это происходит?

беззнаковая переменная у вас не уходит в минус, она становится наоборот, слишком большой :)))

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

Чт фев 15, 2018 14:27:03

еще раз: что вы называете "уходит на минус"?

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

Чт фев 15, 2018 14:27:34

Забыл написать, уходит на минус при
x--;

Ты понимаешь что такое беззнаковая переменная? Если она равно 0 и отнять 1, то получим 255.

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

Чт фев 15, 2018 14:29:20

Ну на табло у меня минус показывает :oops: sprintf
А я хочу, чтобы ниже нуля был ноль, тогда вопрос-что делать?
Ответить