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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

[uquote="a5021",url="/forum/viewtopic.php?p=3526985#p3526985"][uquote="Psych",url="/forum/viewtopic.php?p=3526960#p3526960"]что можно сделать со стрингами ... Это не моя похоть[/uquote]
Или у вас пробивается что-то подсознательное или черти что можно подумать. :)[/uquote]
Ну пишут этот чертов код не один человек и каждый пишет по своему. Файлов куча --исправлять все под стринги да ну нах ---исправлю пару строчек. Я что-то не догоняю??
Кароче все работает через костыли збс))),
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

что происходит с макросами GCC?! :o :shock:
вот это препроцессор проглатывает без проблем:

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

#define _UDR		CONCAT(UDR,MP3_USART)
#define _UCSRA		CONCAT(CONCAT(UCSR,MP3_USART),A)
#define _UCSRB		CONCAT(CONCAT(UCSR,MP3_USART),B)
#define _UCSRC		CONCAT(CONCAT(UCSR,MP3_USART),C)
подставляя вместо MP3_USART циферку 1 и генерируя в итоге правильные наименования регистров USART типа USCR1A, UCSR1B и т.д.

а вот это уже не проглатывает:

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

#define _UBRRH		CONCAT(CONCAT(UBRR,MP3_USART),H)
#define _UBRRL		CONCAT(CONCAT(UBRR,MP3_USART),L)
выдавая ошибку:

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

../mp3_task.c:35:24: error: pasting ")" and "H" does not give a valid preprocessing token
 #define __UBRR  CONCAT(UBRR,MP3_USART)
                        ^
avr_helper.h:7:24: note: in definition of macro '_CONCAT_'
 #define _CONCAT_(x,y)  x ## y
                        ^
../mp3_task.c:36:17: note: in expansion of macro 'CONCAT'
 #define _UBRRH  CONCAT(__UBRR,H)
                 ^~~~~~
avr_helper.h:9:22: note: in expansion of macro '_CONCAT_'
 #define CONCAT(y,x)  _CONCAT_(y,x)
                      ^~~~~~~~
../mp3_task.c:35:17: note: in expansion of macro 'CONCAT'
 #define __UBRR  CONCAT(UBRR,MP3_USART)
                 ^~~~~~
../mp3_task.c:36:24: note: in expansion of macro '__UBRR'
 #define _UBRRH  CONCAT(__UBRR,H)
                        ^~~~~~
../mp3_task.c:227:4: note: in expansion of macro '_UBRRH'
    _UBRRH = UBRRH_VALUE;
    ^~~~~~
../mp3_task.c:37:31: error: pasting ")" and "L" does not give a valid preprocessing token
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                               ^
avr_helper.h:7:24: note: in definition of macro '_CONCAT_'
 #define _CONCAT_(x,y)  x ## y
                        ^
../mp3_task.c:37:17: note: in expansion of macro 'CONCAT'
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                 ^~~~~~
avr_helper.h:9:22: note: in expansion of macro '_CONCAT_'
 #define CONCAT(y,x)  _CONCAT_(y,x)
                      ^~~~~~~~
../mp3_task.c:37:24: note: in expansion of macro 'CONCAT'
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                        ^~~~~~
../mp3_task.c:228:4: note: in expansion of macro '_UBRRL'
    _UBRRL = UBRRL_VALUE;
    ^~~~~~
чё за хрень?! :shock:
Последний раз редактировалось ARV Ср дек 19, 2018 09:39:35, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение WiseLord »

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

Сообщение ARV »

не понял... три раза нормально, а на 4-й и 5-й раз порядок стал важен?

Добавлено after 59 minutes 17 seconds:
ну где же эти гуры, которые любят флудить по поводу всякого говнокода и прочих нюансов Си?! как нужно решить реальную проблему, так все молчат...

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

Добавлено after 5 minutes 51 second:
вот так прокатило:

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

#define _tl(x)		CONCAT(x,L)
#define _th(x)		CONCAT(x,H)

#define _UBRRH		CONCAT(UBRR,_th(MP3_USART))
#define _UBRRL		CONCAT(UBRR,_tl(MP3_USART))
понять бы, в чем фишка...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение WiseLord »

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

Сообщение ARV »

WiseLord писал(а):Похоже, что фишка подобна этой:
не просто подобна, а она и есть. сейчас причесал и так работает:

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

#define _UBRRH      CONCAT(UBRR,CONCAT(MP3_USART,H))
получается, вы были правы - порядок обращения к макросам имеет значение. и второй раз вы тоже правы, сказав
WiseLord писал(а):не до конца понятно, почему с разными буквами ведёт по-разному
вот такой он, строго стандартизированный язык Си... :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3529973#p3529973"]ну где же эти гуры, которые любят флудить по поводу всякого говнокода[/uquote]
Вы таким неуклюжим способом хотите подключить их к решению своих проблем? Как то это совсем без огонька у вас получается.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

typedef struct{
	char		about_a[CNT];
	char		about_f[CNT];
	char		about_d[CNT];
	char		about_i[CNT];
	char		about_t[CNT];
} n_t;

typedef struct{
	int		x;
	n_t		y;
}my_t;

my_t var = {
	.x = 12,
	.y = {"1"} // <--- WARNING: missing braces around initializer
};
что за фигня? :o планирую инициализировать все поля структуры y одинаковой строкой - получаю варнинг :( инициализируется только первое поле структуры...

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

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

А если так:

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

my_t var = {
   .x = 12,
   .y = {{"1"}} 
};
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Добавлено after 3 minutes 28 seconds:
даже так остается варнинг:

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

my_t var = {
   .x = 12,
   .y = {.about_a="1", .about_f="1", .about_d="1", .about_i="1", .about_t="1"} 
};
но так хоть все поля инициализируются верно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

а так

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

my_t var = {
   .x = 12,
   .y = {{.about_a="1"}, {.about_f="1"}, {.about_d="1"}, {.about_i="1"}, {.about_t="1"}}
};
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]планирую инициализировать все поля структуры y одинаковой строкой[/uquote]надо каждое поле и инициализировать
[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]получаю варнинг[/uquote]странно, у меня оно без варнингов собирается (gcc 6.5.0, 7.4.0, 8.2.0; -Wall)
[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]инициализируется только первое поле структуры[/uquote]так и должно быть
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]планирую инициализировать все поля структуры y одинаковой строкой[/uquote]планировать мало, нужно сделать :) Ваш код инициализирует только первый элемент. Наверное, Вы по аналогии с

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

my_t var = {0};
решили, что всё проинициализируется "1"?
"Omitted fields are implicitly initialized the same as for objects that have static storage duration."
Предупреждение возникает, предположительно, из-за того, что элементы структуры тоже являются массивами. Но чтобы получить это предупреждение мне пришлось добавить gcc опцию -Wmissing-braces
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

AAX писал(а):решили, что всё проинициализируется "1"?
да, а разве я не прав? ведь

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

int arr[100] = {7};
struct var { int a; int b; int c} = {7};
проинициализирует все элементы и поля семерками... или нет? для структур правило "для всех" не действует?
AAX писал(а): Но чтобы получить это предупреждение мне пришлось добавить gcc опцию -Wmissing-braces
у меня по умолчанию -Wall
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ARV писал(а):для структур правило "для всех" не действует?
Нет, конечно. С чего бы ?
Проинициализируется только первое поле структуры.
Такое правило (инициализация всех ячеек одним значением) только для массивов. В структурах могут быть разные типы полей, по этому подобное правило было бы нелогичным.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

ARV писал(а):проинициализирует все элементы и поля семерками... или нет?
ЕМНИП, и для массива - нет. Только первый элемент, остальные - нулями.
Для GCC можно ещё '...' использовать для указания диапазона.
В любом случае, любые попытки инициализировать элементы чем-то, отличным от нуля, будут увеличивать размер прошивки, тем больше, чем больше элементов в массиве, структуре и т.д.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Такое правило (инициализация всех ячеек одним значением) только для массивов
мда... как обманчива природа... спасибо за науку.
WiseLord писал(а):В любом случае, любые попытки инициализировать элементы чем-то, отличным от нуля, будут увеличивать размер прошивки
в моём случе речь об инициализации EEPROM, так что ничего увеличиваться не будет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1457
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3545811#p3545811"]ЕМНИП, и для массива - нет. Только первый элемент, остальные - нулями.[/uquote]
Неохота искать источники, но я так тоже всегда считал. А значит откуда то вбилось.)
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="ARV",url="/forum/viewtopic.php?p=3545804#p3545804"]
AAX писал(а):решили, что всё проинициализируется "1"?
да, а разве я не прав?[/uquote]я ж ссылку дал. Можно было бы за минуту прочесть, и понять, прав-не прав... Это ж не википедия :) Это руководство GCC.
[uquote="ARV",url="/forum/viewtopic.php?p=3545804#p3545804"]
AAX писал(а): Но чтобы получить это предупреждение мне пришлось добавить gcc опцию -Wmissing-braces
у меня по умолчанию -Wall[/uquote]Вы, наверное, решили, что опция -Wall включает все возможные предупреждения компилятора? This enables all the warnings about constructions that some users consider questionable. Впрочем, ходить по ссылкам, читать - скукота... гораздо лучше положиться на мнение неизвестного человека из интернетов, с вероятностью 95% - бестолкового, т.к. "толковым" в интернетах отвисать некогда ;) Мкей, тогда давайте так: -Wall не включает всех возможных предупреждений. С настройками по-умолчанию (-Wall) приведённая Вами конструкция не вызывает появления каких-либо предупреждений при компиляции при помощи gcc version 5.4.0 (AVR_8_bit_GNU_Toolchain_3.6.0_1734)
Ответить

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