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

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

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

Сообщение WiseLord »

А как, по Вашему, без скобок различить 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},
    },
  },
};
Реклама
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

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

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

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

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Спасибо :beer:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

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

Сообщение AndyBig »

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

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

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

#define DEFAULT (unsigned char)100;
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3291108#p3291108"]Теперь на строчку с объявлением переменной в EEPROM ругается "error: initializer element is not constant". Компилятор GCC. Что я сделал не так ?[/uquote]
из стандарта:
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;
}
[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3291108#p3291108"]Если что, 5 правило отсюда http://chipenable.ru/index.php/embedded ... rules.html[/uquote]
вообще там все разумно, но стоит добавить "где это возможно". И компилятор должен быть достаточно мозговитый и со включенными оптимизациями - иначе под эту константу-переменную (она с точки зрения языка таки переменная с неизменным значением) выделится память.
вот тот кусочек кода, 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
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

[uquote="alex_",url="/forum/viewtopic.php?p=3290040#p3290040"][uquote="Chip115",url="/forum/viewtopic.php?p=3288951#p3288951"]Подскажите, что значит эта запить?[/uquote]
Вообще то тут пытались инициализировать двумерный массив вот только с ошибками, надо было сделать так:

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

uint8_t buf [3][2] = {
{12 , 18}, 
{11, 28}, 
{13, 15}
};
:)[/uquote]

Вот еще пример

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

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},
};
Видимо по четным индексам идет адрес, по не четным - значение. Скобки для удобства чтения кода. Вроде так.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Вероятнее всего, что тип registerSetting_t состоит из двух элементов. Был бы int - было бы сообщение об ошибке. не?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Не могу разкурочить этот тип. Это выдал кодогенератора, мол заготовка. Определение этого типа нет.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="Chip115",url="/forum/viewtopic.php?p=3295062#p3295062"]Это выдал кодогенератора, мол заготовка. Определение этого типа нет.[/uquote]
Если код собирается - его не может не быть. Гляньте в препроцессорный выхлоп - возможно для этого придётся включить временно опцию preprocess only в настройках проекта. В папочке с временными файлами компиляции загляните в разные типы - они или *.i или *.pre, иногда вместо объектников - у разных тулчейнов по разному.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

Почему переменная, обьявленная как 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.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="dm211",url="/forum/viewtopic.php?p=3309450#p3309450"]Почему переменная, обьявленная как unsigned char уходит на минус?[/uquote]
Как переменная, обьявленная как unsigned char, может уйти на минус?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

что значит "уходит на минус"?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

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

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

еще раз: что вы называете "уходит на минус"?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="dm211",url="/forum/viewtopic.php?p=3309462#p3309462"]Забыл написать, уходит на минус при
x--;[/uquote]
Ты понимаешь что такое беззнаковая переменная? Если она равно 0 и отнять 1, то получим 255.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

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

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