Sequence point?ARV писал(а): P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
Вопросы по С/С++ (СИ)
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Реклама
не, говорит: вы используете в качестве условия результат присваиванияGoodefine писал(а):Sequence point?ARV писал(а): P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Так это же хорошо, что пришлось мозгами пораскинуть!ARV писал(а):avreal, вы ведь признаете, что конструкция !a != !b вам далась не с наскоку? пришлось пораскинуть мозгами, не так ли?
Кстати, мне и велосипед не с наскоку в детстве дался... Хотя можно было ограничиться 3-колёсным и говорить, что 2-колёсный придуман только для того, чтобы выделиться «постижением»...
Ну тут опять... С одной стороны -- это тоже немало. Осознание определенной глубины знания языка позволяет свободнее изъясняться на нём даже не используя в конкретный момент эту «элитарность». Сравните с «естественными» языками, например, с русским. Сравните то, что и как может сказать человек более грамотный и знающий больше слов с тем, кто знает язык хуже. Даже если в данный момент этот более грамотный и обходится без «заумных словечек».ARV писал(а):а по-настоящему-то никакого выигрыша она не дает, ктоме удовольствия знать, что ты это постиг, а многие - нет.
И я же не «зажал», я при удобном случае рассказываю, помогаю «постичь».
С другой -- польза как минимум в том, что я с тех пор не «просто знаю», а «прочно знаю, на уровне рефлексов», чему может быть равно выражение (a>b).
И, наоборот, у того, кто прочно знает, что логические операторы языка С возвращают 0 или 1 (он мог этого же достичь простым чтением стандарта) -- не возникнет проблем с !a != !b. Ну, может, короткое замешательство от непривычного вида. Далее это садится в «паттерн», как и *ptr++ и никаких проблем не возникает.
На заведенную, но не использованную переменную -- тоже ворчит. И на использованную до инициализации. И т.д.ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
Спасибо ему за внимательность, но никакого подтекста, касающегося именно использования результата «присваивающего выражения» (именно так называется a = b в C, и это тоже неспроста) тут нет.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Кстати, ход-то не очень и хитрый. Просто я тогда вообще плохо С знал.ARV писал(а):чтобы придумать такой хитрый ход, кто-то напряг свой мозг. кто-то был первым и показал остальным. остальные тоже напрягли мозги чтобы понять,
А так -- достаточно вместо:
Код: Выделить всё
if ( (a == 0 && b != 0) || (a != 0 && b == 0) ) puts("Только одна из переменных a и b равна 0");Код: Выделить всё
if ( (a == 0) != (b == 0) ) puts("Только одна из переменных a и b равна 0");Код: Выделить всё
if ( !a != !b ) puts("Только одна из переменных a и b равна 0");Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Сообщения: 100
- Зарегистрирован: Сб янв 22, 2011 16:57:45
Так это же убирается двойными скобками, разве нет?ARV писал(а):не, говорит: вы используете в качестве условия результат присваивания т.е. не нравится ему =, подсказывает "а не == хотели?"
То есть
Код: Выделить всё
while((*dst++=*src++));
Клоподавер упрыгхт
- Реклама
Да. И, кстати говоря, в своём сообщении я так и написал 
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Сообщения: 100
- Зарегистрирован: Сб янв 22, 2011 16:57:45
Да, точно, в оригинале-то всё было правильно, это я поздно подоспел, ответил на ответ. А со стилем -- что ж поделать, варнинги -- штука полезная. Путь настоящих джедаев -- -Wall.avreal писал(а):Да. И, кстати говоря, в своём сообщении я так и написал
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.
Клоподавер упрыгхт
all это ещё не все, хоть так и кажется
Код: Выделить всё
OPT = -Os
CSTD := -std=gnu99
CXXSTD := -std=gnu++0x
CWARN = -Wall -Wextra # <----------------- Втыкать сюда
CFLAGS = -g $(OPT) $(CWARN) -DF_CPU=$(F_CPU)UL
CFLAGS += -funsigned-bitfields -fshort-enums
CFLAGS += --param inline-call-cost=3
#CFLAGS += -fno-split-wide-types
#CFLAGS += -finline-limit=
#CFLAGS += -fno-if-conversion
CFLAGS += -mcall-prologues
#CFLAGS += -fno-strict-aliasing
# Copy common part of flags into C++ flags variable
CXXFLAGS = $(CFLAGS)
CXXFLAGS += -fno-exceptions -fno-rtti
CXXFLAGS += -fno-threadsafe-statics
# add standard flag to CFLAGS _after_ copying CFLAGS to CXXFLAGS
CFLAGS += $(CSTD)
CXXFLAGS += $(CXXSTD)Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Всем привет!
Имеется куча массивов, которые надо по очереди передать в функцию.
вот функция
Подскажите, как сделать красиво?
у меня на уме только так
и так далее... . чую что это ппц как не правильно...
Имеется куча массивов, которые надо по очереди передать в функцию.
Код: Выделить всё
xdata unsigned char const cmd_RESET[5] = {0xE3, 0x10, 0x00, 0x30, 0x00};
xdata unsigned char const cmd_PPWM[5] = {0xE3, 0x10, 0x00, 0x50, 0x00};
xdata unsigned char const cmd_DEADT[5] = {0xE3, 0x00, 0x36, 0x30, 0x00}; // 6 ìêñ ìåðòâîå âðåìÿ 48*125ns=6 us
xdata unsigned char const cmd_ACB[5] = {0xE3, 0x10, 0x00, 0x61, 0x00}; // 50 Ãö áàçîâàÿ ÷àñòîòà
xdata unsigned char const cmd_ACC[5] = {0xE4, 0x00, 0x60, 0x05, 0x00}; // óñêîðåíèå
xdata unsigned char const cmd_F[5] = {0xE4, 0x00, 0x62, 0x3C, 0x99}; // çàäàíèå ñèíóñîèäàëüíîé ÷àñòîòû
xdata unsigned char const cmd_FPWM[5] = {0xE3, 0x10, 0x00, 0x42, 0x00}; //10.6 êÃö ÷àñòîòà ØÈÌ
xdata unsigned char const cmd_VBOOST[5] = {0xE3, 0x00, 0x6C, 0x00, 0x00}; // 0 % àìïëèòóäà ñèíóñà ïðè íóëåâîé ñèíóñîèäàëüíîé ÷àñòîòå
xdata unsigned char const cmd_MODIN[5] = {0xE3, 0x00, 0x75, 0xFE, 0x00}; // 99 % èíäåêñ ìîäóëÿöèè ñèíóñà (àìïëèòóäà)
xdata unsigned char const cmd_FTOUT[5] = {0xE4, 0x00, 0x6A, 0x00, 0x08}; // òàéìàóò ïîñëå àâàðèè
xdata unsigned char const cmd_VBDEC[5] = {0xE4, 0x00, 0xC9, 0x03, 0x55}; // 119 % çíà÷åíèå Vbus ïðè êîòîðîì íà÷èíàåòñÿ ñíèæåíèå ñêîðîñòè òîðìîæåíèÿ
xdata unsigned char const cmd_VBRAKE[5] = {0xE4, 0x00, 0x64, 0x03, 0x55}; // 119 % çíà÷åíèå Vbus ïðè êîòîðîì ïîÿâëÿåòñÿ ñèãíàë âêë. òîðìîçíîãî VT
xdata unsigned char const cmd_VBROWN[5] = {0xE4, 0x00, 0x66, 0x80, 0x00}; // 50 % íèæíåå çíà÷åíèå Vbus ïðè îòêë. ØÈÌ è ïîÿâëÿåòñÿ ñèãíàë àâàðèè
xdata unsigned char const cmd_VBOVR[5] = {0xE4, 0x00, 0x68, 0x03, 0x71}; // 123 % âåðõíåå çíà÷åíèå Vbus ïðè îòêë. ØÈÌ è ïîÿâëÿåòñÿ ñèãíàë àâàðèè
xdata unsigned char const cmd_FORW[5] = {0xE3, 0x10, 0x00, 0x10, 0x00}; // "âïåðåä"
xdata unsigned char const cmd_REW[5] = {0xE3, 0x10, 0x00, 0x11, 0x00}; // "íàçàä"
xdata unsigned char const cmd_STOP[5] = {0xE3, 0x10, 0x00, 0x20, 0x00}; // "ñòîï"
xdata unsigned char const read_ACTF[3] = {0xD1, 0x00, 0x85}; // ïðî÷èòàòü òåêóùþþ ñèíóñîèäàëüíóþ ÷àñòîòó
xdata unsigned char const read_SETUP[3] = {0xD0, 0x00, 0xAE}; // ïðî÷èòàòü ðåãèñòð óñòàíîâîê
xdata unsigned char const read_VBUS[3] = {0xD1, 0x00, 0x79}; // ïðî÷èòàòü íàïðÿæåíèå ïèòàíèÿ èíâåðòîðà (DC_bus)
xdata unsigned char const read_F[3] = {0xD1, 0x00, 0x62}; // ïðî÷èòàòü çàäàíèå íà ñèíóñîèäàëüíóþ ÷àñòîòó
xdata unsigned char const read_STATUS[3] = {0xD0, 0x00, 0xC8}; // ïðî÷èòàòü ðåãèñòð ñòàòóñà
Код: Выделить всё
void MC3PHAC_Send(unsigned char *msg,unsigned char len)
{
unsigned char CRC=0;
delay_ms(50);
putdata(0x2B);
while(len>0){
if(*msg==0x2B){putdata(0x2B);} // ïîâòîðèòü áàéò
putdata(*msg);
CRC+=*msg;
*msg++;
len--;
}
CRC=~CRC+1;
putdata(CRC);
if(CRC==0x2B){putdata(CRC);}
delay_ms(40); // íå òðîãàòü
TI0=1;
}
у меня на уме только так
Код: Выделить всё
MC3PHAC_Send(cmd_RESET,sizeof(cmd_RESET));
MC3PHAC_Send(cmd_PPWM,sizeof(cmd_PPWM));
MC3PHAC_Send(cmd_DEADT,sizeof(cmd_DEADT));
MC3PHAC_Send(cmd_ACB,sizeof(cmd_ACB));
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... обычная передача через указатель ... чем плохо? ... только ИМХОChip115 писал(а):чую что это ппц как не правильно...
Код: Выделить всё
while(len>0){
if(*msg==0x2B){putdata(0x2B);} //
putdata(*msg);
CRC+=*msg;
*msg++;
len--;
}Код: Выделить всё
while(len--){
if(*msg==0x2B){putdata(0x2B);} //
putdata(*msg);
CRC+=*msg;
msg++;
если свои массивы вы дополните байтом, определяющим размер, разместив его на первом месте в массиве, то у вас отпадет необходимость передавать в функцию второй параметр - размер массива... ну, можно еще не указывать размерность массива - если он проинициализирован, то все вычислит компилятор и так...
не понятно, что вам не нравится...
не понятно, что вам не нравится...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
хлопцы, помогите пожалуйста. вот подумал в структуре обьявить другую структуру - проканало. но вот при записи второго поля, например имя папки, первое затирается! я не могу понять...
вот результат
Код: Выделить всё
typedef struct
{
int day;
char month[];
int year;
}data;
typedef struct
{
char fname[];
data fdata;
int fsize;
}file;
//file FILE1;
//file FILE2;
typedef struct
{
char folder_name[];
file FILE1;
file FILE2;
}folder;
folder FOLD1;
//---------------------------------------------------------------------
void cat(void)
{
char buf[10];
strcpy(FOLD1.folder_name,"FOLDER1");
strcpy(FOLD1.FILE1.fname,"FILE1");
strcpy(buf,FOLD1.FILE1.fname);
puts(buf);
printf("\r");
strcpy(buf,FOLD1.folder_name);
puts(buf);
}- Вложения
-
- terminal.png
- (2.65 КБ) 374 скачивания
радиоэлектроника - жизнь моя...
ХЭ!!! хлопцы! разобрался! надо было задать везде размеры строк. и все!!! )))))))))))
радиоэлектроника - жизнь моя...
- Сообщения: 100
- Зарегистрирован: Сб янв 22, 2011 16:57:45
Вот на extra меня, честно сказать, не хватает.avreal писал(а):Код: Выделить всё
CXXSTD := -std=gnu++0x CWARN = -Wall -Wextra # <----------------- Втыкать сюда
Кстати, вот интересный момент: -std=gnu++0x. Оно действительно как-то терпимо поддерживает C++0x? Я пока нос туда не совал. Впрочем, в 0x, конечно, уйма вкусных фич (лично мне страшно не хватает шаблонного typedef), но пока все подряд не начнут поддерживать 0x, писать на нём что-то реальное, конечно, рано...
UPD: А не так всё страшно с -Wextra, что-то я перепутал. Мне казалось, полезут варнинги от преобразования enum в беззнаковые типы и обратно. Но нет, на всей либе вылезло 8 предупреждений о неиспользуемых параметрах функций -- и всё.
Клоподавер упрыгхт
- Сообщения: 100
- Зарегистрирован: Сб янв 22, 2011 16:57:45
РЕШЕНО: скриптом на Python выдрал из IAR'овских заголовочных файлов сведения о том, где какой порт есть, и сгенерил заголовочный файл с макроопределениями. Если в макросе установлен бит 0, есть PORTA, 1 -- PORTB и т.д.
Скрипт: http://pastie.org/1815977
Заголовочник: http://pastie.org/1815983
Коллеги, возник вопрос по IAR. Портирую на IAR код, которому важно знать, какие порты есть у target-устройства (код определяет классы для работы с портами, и это код библиотеки).
На GCC я это делал примерно так:
Это работало постольку, поскольку PORTx в заголовочных файлах avr-gcc объявлены через #define. С IAR всё несколько хуже, поскольку там #define нет, а есть описание неименованного union с использованием IAR'ового расширения языка.
Нет ли какого-то вменяемого решения проблемы и для IAR? Потому что иначе пользователям придётся самим определять нужные порты, что очень уродливо:
UPD: Подумал, поступил пока так:
Теперь, по крайней мере, реально написать один конфигурационный файл с кучей масок для всех МК.
Скрипт: http://pastie.org/1815977
Заголовочник: http://pastie.org/1815983
Коллеги, возник вопрос по IAR. Портирую на IAR код, которому важно знать, какие порты есть у target-устройства (код определяет классы для работы с портами, и это код библиотеки).
На GCC я это делал примерно так:
Код: Выделить всё
#ifdef PORTA
//Здесь определение класса
#endif
#ifdef PORTB
//Здесь определение класса
#endif
Нет ли какого-то вменяемого решения проблемы и для IAR? Потому что иначе пользователям придётся самим определять нужные порты, что очень уродливо:
Код: Выделить всё
DEF_AVRPP_PORT(PORTA, port_a)
DEF_AVRPP_PORT(PORTB, port_b)
DEF_AVRPP_PORT(PORTC, port_c)
DEF_AVRPP_PORT(PORTD, port_d)
Код: Выделить всё
// Маска, определяющая наличие портов (0x01 -- PORTA, 0x02 -- PORTB ... 0x20 -- PORTF)
#define AVRPP_IAR_PORTS_MASK 0x0f
#if (AVRPP_IAR_PORTS_MASK & 0x01)
//Определение порта A
#endif
Клоподавер упрыгхт
- Сообщения: 690
- Зарегистрирован: Вс мар 04, 2007 01:17:12
Подскажите как реализовать в Си:
в переменную приходят данные беззнакового целого типа 4B, 0A, 34, 55, F0... каждый байт последовательно вносится в массив. Массив 6 байт.
нужно отобразить эти байты на дисплее так как они пришли т.е. 4B, 0A..., но на дисплей нужно передать их в символьной кодировке, т.е. наверное разделить на полубайты -отдельно 4, отдельно B (4B) и вот тут вопрос- как сделать перевод байта в кодировку дисплея, т.е. "4 B" будет 0х34 (4), 0х42 (В)?
в переменную приходят данные беззнакового целого типа 4B, 0A, 34, 55, F0... каждый байт последовательно вносится в массив. Массив 6 байт.
нужно отобразить эти байты на дисплее так как они пришли т.е. 4B, 0A..., но на дисплей нужно передать их в символьной кодировке, т.е. наверное разделить на полубайты -отдельно 4, отдельно B (4B) и вот тут вопрос- как сделать перевод байта в кодировку дисплея, т.е. "4 B" будет 0х34 (4), 0х42 (В)?
Да, для начала разбить байт на два полубайта. Ну а если посмотреть на таблицу символов ASCII http://www.asciitable.com/ (которая частично совпадает с таблицей дисплея), то видно, что для вывода чисел 0...9 надо прибавить $30 (48), а для 10...15 (и больше) надо прибавить $37 (55). Так делал на АСМе.Alexeus писал(а):Подскажите как реализовать в Си
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 690
- Зарегистрирован: Вс мар 04, 2007 01:17:12
спасибо за наводку! понял. в моем случае если число до "9" (0-9), то прибавляю 30, если больше "10-16" (A-F), то прибавляю 31.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
.. только не 30, а 0х30Alexeus писал(а):в моем случае если число до "9" (0-9), то прибавляю 30
Код: Выделить всё
if (*str_txt<='9' && *str_txt>='0') { *val=(*str_txt-'0'); break;}
if (*str_txt<='F' && *str_txt>='A') { *val=(*str_txt-'A'+10); break;}
if (*str_txt<='f' && *str_txt>='a') { *val=(*str_txt-'a'+10); } Проще сразу прибавить, а потом проверить и доприбавить. Код короче будет.Alexeus писал(а):спасибо за наводку! понял. в моем случае если число до "9" (0-9), то прибавляю 30, если больше "10-16" (A-F), то прибавляю 31.
Код: Выделить всё
#include <stdint.h>
// Само собой, на вход подавать только 0..15. Ну или [b]n &= 0x0F;[/b] в начале добавить.
char put(uint8_t n)
{
n += '0';
if (n > '9') n += ('A'-'0'-10);
return n;
}Код: Выделить всё
put:
/* prologue: function */
/* frame size = 0 */
subi r24,lo8(-(48))
cpi r24,lo8(58)
brlo .L2
subi r24,lo8(-(7))
.L2:
retЛень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


