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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это... :)

Sequence point?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Goodefine писал(а):
ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это... :)

Sequence point?
не, говорит: вы используете в качестве условия результат присваивания :) т.е. не нравится ему =, подсказывает "а не == хотели?"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

ARV писал(а):avreal, вы ведь признаете, что конструкция !a != !b вам далась не с наскоку? пришлось пораскинуть мозгами, не так ли?
Так это же хорошо, что пришлось мозгами пораскинуть!
Кстати, мне и велосипед не с наскоку в детстве дался... Хотя можно было ограничиться 3-колёсным и говорить, что 2-колёсный придуман только для того, чтобы выделиться «постижением»...

ARV писал(а):а по-настоящему-то никакого выигрыша она не дает, ктоме удовольствия знать, что ты это постиг, а многие - нет.
Ну тут опять... С одной стороны -- это тоже немало. Осознание определенной глубины знания языка позволяет свободнее изъясняться на нём даже не используя в конкретный момент эту «элитарность». Сравните с «естественными» языками, например, с русским. Сравните то, что и как может сказать человек более грамотный и знающий больше слов с тем, кто знает язык хуже. Даже если в данный момент этот более грамотный и обходится без «заумных словечек».
И я же не «зажал», я при удобном случае рассказываю, помогаю «постичь».

С другой -- польза как минимум в том, что я с тех пор не «просто знаю», а «прочно знаю, на уровне рефлексов», чему может быть равно выражение (a>b).
И, наоборот, у того, кто прочно знает, что логические операторы языка С возвращают 0 или 1 (он мог этого же достичь простым чтением стандарта) -- не возникнет проблем с !a != !b. Ну, может, короткое замешательство от непривычного вида. Далее это садится в «паттерн», как и *ptr++ и никаких проблем не возникает.

ARV писал(а):P.S. на классический while(*dst++ = *src++); компилятор реагирует варнингом, что как-то настораживает - ой, не спроста это... :)
На заведенную, но не использованную переменную -- тоже ворчит. И на использованную до инициализации. И т.д.
Спасибо ему за внимательность, но никакого подтекста, касающегося именно использования результата «присваивающего выражения» (именно так называется a = b в C, и это тоже неспроста) тут нет.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

ARV писал(а):чтобы придумать такой хитрый ход, кто-то напряг свой мозг. кто-то был первым и показал остальным. остальные тоже напрягли мозги чтобы понять,
Кстати, ход-то не очень и хитрый. Просто я тогда вообще плохо С знал.
А так -- достаточно вместо:

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

if ( (a == 0 && b != 0) || (a != 0 && b == 0) ) puts("Только одна из переменных a и b равна 0");
подумать по-другому:

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

if ( (a == 0) != (b == 0) ) puts("Только одна из переменных a и b равна 0");
что, при упомянутом выше отнюдь не «тайном» или «элитарном» знании того, что в языке С логические операторы возвращают не «0 и не-0», а «0 и 1», тривиальным образом превращается в

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

if ( !a != !b ) puts("Только одна из переменных a и b равна 0");
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение ellioh »

ARV писал(а):не, говорит: вы используете в качестве условия результат присваивания т.е. не нравится ему =, подсказывает "а не == хотели?"

Так это же убирается двойными скобками, разве нет?
То есть

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

while((*dst++=*src++));
Клоподавер упрыгхт
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Да. И, кстати говоря, в своём сообщении я так и написал :-)
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение ellioh »

avreal писал(а):Да. И, кстати говоря, в своём сообщении я так и написал
Немного не нравятся такие доп. скобки, но я не выключаю никакие предупреждения, а лишних видеть не хочу. Так что поддался на навязываие такого стиля.

Да, точно, в оригинале-то всё было правильно, это я поздно подоспел, ответил на ответ. А со стилем -- что ж поделать, варнинги -- штука полезная. Путь настоящих джедаев -- -Wall. :)
Клоподавер упрыгхт
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет!
Имеется куча массивов, которые надо по очереди передать в функцию.

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

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));

и так далее... . чую что это ппц как не правильно...
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

Сообщение ARV »

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

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

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

Сообщение demonchik »

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

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

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 КБ) 373 скачивания
радиоэлектроника - жизнь моя...
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

ХЭ!!! хлопцы! разобрался! надо было задать везде размеры строк. и все!!! )))))))))))
радиоэлектроника - жизнь моя...
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение ellioh »

avreal писал(а):

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

CXXSTD := -std=gnu++0x
CWARN =  -Wall -Wextra  # <----------   Втыкать сюда

Вот на extra меня, честно сказать, не хватает. :) Хотя сегодня попробую на AVR++ прогнать компиляцию с -Wextra, может, удастся пофиксить и под extra...

Кстати, вот интересный момент: -std=gnu++0x. Оно действительно как-то терпимо поддерживает C++0x? Я пока нос туда не совал. Впрочем, в 0x, конечно, уйма вкусных фич (лично мне страшно не хватает шаблонного typedef), но пока все подряд не начнут поддерживать 0x, писать на нём что-то реальное, конечно, рано...

UPD: А не так всё страшно с -Wextra, что-то я перепутал. Мне казалось, полезут варнинги от преобразования enum в беззнаковые типы и обратно. Но нет, на всей либе вылезло 8 предупреждений о неиспользуемых параметрах функций -- и всё.
Клоподавер упрыгхт
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение ellioh »

РЕШЕНО: скриптом на Python выдрал из IAR'овских заголовочных файлов сведения о том, где какой порт есть, и сгенерил заголовочный файл с макроопределениями. Если в макросе установлен бит 0, есть PORTA, 1 -- PORTB и т.д.
Скрипт: http://pastie.org/1815977
Заголовочник: http://pastie.org/1815983


Коллеги, возник вопрос по IAR. Портирую на IAR код, которому важно знать, какие порты есть у target-устройства (код определяет классы для работы с портами, и это код библиотеки).

На GCC я это делал примерно так:

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

#ifdef PORTA
//Здесь определение класса
#endif
#ifdef PORTB
//Здесь определение класса
#endif


Это работало постольку, поскольку PORTx в заголовочных файлах avr-gcc объявлены через #define. С IAR всё несколько хуже, поскольку там #define нет, а есть описание неименованного union с использованием IAR'ового расширения языка.

Нет ли какого-то вменяемого решения проблемы и для 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)


UPD: Подумал, поступил пока так:

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

// Маска, определяющая наличие портов (0x01 -- PORTA, 0x02 -- PORTB ... 0x20 -- PORTF)
#define AVRPP_IAR_PORTS_MASK 0x0f

#if (AVRPP_IAR_PORTS_MASK & 0x01)
//Определение порта A
#endif

Теперь, по крайней мере, реально написать один конфигурационный файл с кучей масок для всех МК.
Клоподавер упрыгхт
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

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

Сообщение Alexeus »

Подскажите как реализовать в Си:

в переменную приходят данные беззнакового целого типа 4B, 0A, 34, 55, F0... каждый байт последовательно вносится в массив. Массив 6 байт.
нужно отобразить эти байты на дисплее так как они пришли т.е. 4B, 0A..., но на дисплей нужно передать их в символьной кодировке, т.е. наверное разделить на полубайты -отдельно 4, отдельно B (4B) и вот тут вопрос- как сделать перевод байта в кодировку дисплея, т.е. "4 B" будет 0х34 (4), 0х42 (В)?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Alexeus писал(а):Подскажите как реализовать в Си

Да, для начала разбить байт на два полубайта. Ну а если посмотреть на таблицу символов ASCII http://www.asciitable.com/ (которая частично совпадает с таблицей дисплея), то видно, что для вывода чисел 0...9 надо прибавить $30 (48), а для 10...15 (и больше) надо прибавить $37 (55). Так делал на АСМе.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

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

Сообщение Alexeus »

спасибо за наводку! понял. в моем случае если число до "9" (0-9), то прибавляю 30, если больше "10-16" (A-F), то прибавляю 31.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Alexeus писал(а):в моем случае если число до "9" (0-9), то прибавляю 30
.. только не 30, а 0х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); }
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

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;
}
avr-gcc -Os -S

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

put:
/* prologue: function */
/* frame size = 0 */
   subi r24,lo8(-(48))
   cpi r24,lo8(58)
   brlo .L2
   subi r24,lo8(-(7))
.L2:
   ret
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ответить

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