ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
Sequence point?
ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
не, говорит: вы используете в качестве условия результат присваиванияGoodefine писал(а):ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
Sequence point?
Так это же хорошо, что пришлось мозгами пораскинуть!ARV писал(а):avreal, вы ведь признаете, что конструкция !a != !b вам далась не с наскоку? пришлось пораскинуть мозгами, не так ли?
Ну тут опять... С одной стороны -- это тоже немало. Осознание определенной глубины знания языка позволяет свободнее изъясняться на нём даже не используя в конкретный момент эту «элитарность». Сравните с «естественными» языками, например, с русским. Сравните то, что и как может сказать человек более грамотный и знающий больше слов с тем, кто знает язык хуже. Даже если в данный момент этот более грамотный и обходится без «заумных словечек».ARV писал(а):а по-настоящему-то никакого выигрыша она не дает, ктоме удовольствия знать, что ты это постиг, а многие - нет.
На заведенную, но не использованную переменную -- тоже ворчит. И на использованную до инициализации. И т.д.ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это...
Кстати, ход-то не очень и хитрый. Просто я тогда вообще плохо С знал.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");ARV писал(а):не, говорит: вы используете в качестве условия результат присваивания т.е. не нравится ему =, подсказывает "а не == хотели?"
Код: Выделить всё
while((*dst++=*src++));
avreal писал(а):Да. И, кстати говоря, в своём сообщении я так и написал
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.
Код: Выделить всё
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));
... обычная передача через указатель ... чем плохо? ... только ИМХО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);
}avreal писал(а):Код: Выделить всё
CXXSTD := -std=gnu++0x
CWARN = -Wall -Wextra # <---------- Втыкать сюда
Код: Выделить всё
#ifdef PORTA
//Здесь определение класса
#endif
#ifdef PORTB
//Здесь определение класса
#endif
Код: Выделить всё
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
Alexeus писал(а):Подскажите как реализовать в Си
.. только не 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