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

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

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

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

pokk, а почему бы и нет ? :roll:
Или не получается ? Покажите как делаете.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

C #error я погорячился лучше скорее #warning подойдет
Как ему задать что бы он TEST посчитал а потом заменил

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

#define TEST   (uint16_t)(2*30*3)
#warning "VarTest=TEST"
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

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

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

Сообщение WiseLord »

Думаю, никак
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="pokk",url="/forum/viewtopic.php?p=3470652#p3470652"]Можно ли c помощью #error выдать define ?[/uquote]
Ответ ради ответа:
#define __STR(x) #x
#define __STR2(x) __STR(x)
#pragma message __STR2(__LINE__)

Но есть нюанс:
[uquote="pokk",url="/forum/viewtopic.php?p=3470652#p3470652"]В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.[/uquote]
Препроцессор - это подстановщик - он ничего не считает и не округляет - он подставляет выражение по месту использования определения. Кстати, он также ничего и не компилирует - лишь передаёт компилятору С-файл с уже развёрнутыми #define #include директивами. Включите в проекте опцию "не удалять промежуточные файлы компиляции" и поищите среди временных файлов эти самые развёрнутые С-файлы. Могут называться *.i, *.ii, *.pre или как нибудь ещё - очень полезно на будущее при разборках с препроцессором.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

никогда раньше не сталкивался с применением оператора "запятая", кроме как в списках полей инициализации переменных и в операторе for.
а тут, знакомясь с темами на форуме, увидел, что практикуется код типа

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

if(condition) var1=a, var2=b, var3=c;
может мне кто-нибудь объяснить, в чем смысл такой записи, а так же вообще в чем смысл оператора "запятая" в подобных случаях?
т.е. в чем разница между разделением отдельных операторов точкой с запятой и только запятой?
что-то у меня возникает полная уверенность, что это очередной способ выстрелить себе в ногу...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Const14
Родился
Сообщения: 17
Зарегистрирован: Чт авг 06, 2015 09:38:22

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

Сообщение Const14 »

Вы немного "плаваете" в понятиях оператор (statement), операция (operator), выражение (expression).
Выражение (expression) завершённое символом ";" является оператором (statement). То есть
- это выражение (expression)
- это оператор (statement)

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

var1=a, var2=b
- это тоже выражение
а

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

var1=a, var2=b;
- оператор.

пример использования выражения, содержащего запятую:

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

for(i=0; i<10; i++, j++)
   arr1[i] = arr2[j];

здесь

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

i++, j++
- выражение.
Пример использования оператора вы привели сами. Вместо применения составного оператора, состоящего из трёх отдельных операторов

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

{ var1=a; var2=b; var3 =c; }

применён один оператор

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

var1=a, var2=b, var3 =c;

То есть, симол "," в выражении является такой же (почти такой же:) ) операцией (operator), как и "+","-","=";
Последний раз редактировалось Const14 Пт окт 05, 2018 08:54:48, всего редактировалось 3 раза.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Синтаксисом языка разрешено? Разрешено. Значит имеет право быть. Сейчас даже вот так разрешено

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

if(uint32_t x=10; condition) var1 = x, var2 = x*x, var3 = x*x+x;
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Const14, вы написали много чего, но ответа на мой вопрос не дали: в чем смысл подобных замен? в чем смысл выражения, состоящего из нескольких независимых выражений, если результатом такого составного выражения будет только одно значение, а остальные не востребуются?
VladislavS писал(а):Значит имеет право быть
да и хрен бы с ним. вопрос - ЗАЧЕМ это разрешено синтаксисом? ведь какой-то смысл должен быть в каждой фиче?

Добавлено after 2 minutes 58 seconds:
да, как-то не привык разделять термины оператор и операция. согласен, корректно было спросить про операцию "запятая".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

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

Сообщение ARV »

не понимаю

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

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Нормальным программистам это позволяет "использовать составные выражения там где синтаксисом предусмотрено ОДНО выражение". А тебе да, для ошибок.
Может лучше Денниса Ритчи спросить?
Const14
Родился
Сообщения: 17
Зарегистрирован: Чт авг 06, 2015 09:38:22

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

Сообщение Const14 »

Вероятно Вы знаете, что есть такое понятие, как грамматика языка. В грамматику выражений языка C включена операция "," в частности для того, чтобы можно было использовать такие выражения в операторе цикла "for". Соответственно, везде, где язык допускает использовать выражения, они могут быть записаны без каких-либо ограничений. Это унификация. Но Вас никто не обязывает это делать.

Добавлено after 1 minute 44 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3473371#p3473371"]Может лучше Денниса Ритчи спросить?[/uquote]
Вряд-ли это возможно. Он уже давно ушёл в мир иной.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Const14",url="/forum/viewtopic.php?p=3473374#p3473374"]Вряд-ли это возможно. Он уже давно ушёл в мир иной.[/uquote]Естественно, в переносном смысле. Благо он оставил прекрасные книги по языку, в которых любой хрюндель найдёт ответы на свои вопросы.
Последний раз редактировалось VladislavS Пт окт 05, 2018 09:16:07, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Роман, при всём уважении, но у Вас похоже "зудит" при отсутствии активности на форуме. Вместо того, чтобы провести приятно время, занявшись каким-либо полезным и любимым делом, Вы очередной раз начинаете разводить демагогию.
PS: Прошу прощения, если форма моего сообщения была оскорбительной. Но иной, способной выразить мою мысль, в моей голове не сложилось.

----------
Тему почистил.
Const14
Родился
Сообщения: 17
Зарегистрирован: Чт авг 06, 2015 09:38:22

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

Сообщение Const14 »

Alex, позволю себе вернуть реплику по делу с небольшим изменением, которая, как мне кажется, была незаслуженно удалена вместе с мусором
Обычно си-программисты стремятся к минимизации исходного текста везде, где это возможно и где язык это позволяет. Например перестановка элементов массива, скажем при его сортировки, требует составного оператора из трёх операторов:

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

if( a[i]<b[j] )
{
   t = a[i];
   a[i] = b[j];
   b[j] = t;
}


В данном примере кажется логичным представить составной оператор перестановки в виде одного:

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

if( a[i]<b[j] )
    t = a[i], a[i] = b[j], b[j] = t;


На этом умолкаю.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Const14 писал(а):В данном примере кажется логичным представить составной оператор перестановки в виде одного
В одну строку также можно написать.

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

if( a[i]<b[j] )
    {t = a[i]; a[i] = b[j]; b[j] = t;}
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

А не может ли быть так, что там играет роль то, что составной оператор возвращает значение, а группа, возможно, нет?

Но у меня тоже есть вопрос. Тут я всё пытаюсь разобраться, что является объектом, что описанием. С простыми переменными всё просто - уже более-менее научился. А вот как быть со структурами и объединениями. Пример:

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

struct flag {
  unsigned char dst_enable: 1;  // вкл. перехода на летнее время
  unsigned char leadingzero:1;
};
 
union {
  unsigned char eflag;
  struct flag   fflag;
} test;

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

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

Сообщение ARV »

uldemir писал(а):как мне это описать в .h файле, чтобы другие знали, что есть такой test.flag.leadingzero?
сам всегда делаю и другим советую: typedef

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

// файл my_defines.h
typedef struct {
  unsigned char dst_enable: 1;  // вкл. перехода на летнее время
  unsigned char leadingzero:1;
} flag_t;
 
typedef union {
  unsigned char eflag;
  flag_t   fflag;
} test_t;

extern test_t test;

// в одном из файлов пишется так
#include "my_defines.h"
test_t test;

// в остальных файлах только инклюдится my_defines.h


Добавлено after 6 minutes 10 seconds:
кстати, многие компиляторы, например, GCC, поддерживают безымянные (анонимные) структуры и юнионы внутри структурных типов данных. то есть можно так

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

typedef union{
     unsigned char as_byte;
     struct{
        unsigned char dst_enable: 1;  // вкл. перехода на летнее время
        unsigned char leadingzero:1;
     }
} flag_t;

extern flag_t flag;
тогда можно будет сократить число точек при обращении к полям flag:

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

flag.as_byte = 3;
flag.dst_enable = 0;
flag.leadingzero = 1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="Const14",url="/forum/viewtopic.php?p=3476543#p3476543"]В данном примере кажется логичным представить составной оператор перестановки в виде одного:

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

if( a[i]<b[j] )
    t = a[i], a[i] = b[j], b[j] = t;
[/uquote]
Тогда уж:

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

if(a[i] < b[j])
    b[j] = (t = a[i], a[i] = b[j], t);

<мечтательно>Ещё бы t прямо здесь объявить ...</мечтательно> :D
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

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