Перейти к содержанию
    

Как в C (C++) написать красиво проверку, что несколько переменных равны?

Обновился до последнего Keil, не помогло. Да и билд компилятора остался прежним. V5.06 update 6 (build 750). В общем, пока hasn't been fixed.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А компилятор заменили на armclang в настройках?

P.S. Возможно, тулчейн будет в ARM DS. Я пользуюсь gnu make для сборки и самими исполняемыми файлами тулчейна, IDE - Qt Creator, поэтому не могу подсказать, как в Keil можно выбрать другой тулчейн.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, Grizzly сказал:

А компилятор заменили на armclang в настройках?

Выбирал, но он тот же самый. На V6, как писал, перейти не могу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 14.08.2019 в 16:25, ViKo сказал:

Так, как понимаете, не работает.

static_assert(g00 == g01 == g02, "Oh!");

Можно

static_assert(g00 == g01 && g01 == g02, "Oh!");

А еще как? А то их 16 штук, этих gXX... надоест сравнивать.

Меня сегодня муза (программирования) посетила. А что, если для сравнения значений вычислить логические битовое "И" и "ИЛИ" всех переменных и сравнить результаты на равенство? Любое отличие переменных выдаст или первый или второй результаты, не равными исходным. И, следовательно, не равными между собой. Так или нет?

Поправил термин.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, ViKo сказал:

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

Лучше кодом покажите...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, Arlleex сказал:

Лучше кодом покажите...

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

Код напишу с использованием свёрток в С++17. Возможно. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 26.12.2019 в 14:13, Arlleex сказал:

Лучше кодом покажите...

/*  Check that pins GPIO names are the same  */
    static_assert(
        (uint(PN.name) & ... ) == (uint(PN.name) | ...), 
        "The GPIO Port name isn't the same!");

name - тип-перечисление имён портов
С++17, свёртка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, ViKo сказал:

        (uint(PN.name) & ... ) == (uint(PN.name) | ...), 

А зачем так сложно? Быстрая проверка на равенство множества значений ещё со времён оных делалась:

if (!(a - b | a - c | a - d | ...)) { a,b,c,d равны друг другу}

По вкусу '-' можно заменить на '^'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, jcxz сказал:

А зачем так сложно?

Чтобы не дробить PN на PFirst и POther.
Вы могли и проще, сравнивать a==b && a=c && ... 
Тем более, на этапе компиляции вычисляется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

XOR одинаковых значений даст 0, различающиеся биты дадут 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, one_eight_seven сказал:

XOR одинаковых значений даст 0, различающиеся биты дадут 1

Как насчет разного количества переменных? 2, 3 и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, one_eight_seven сказал:

XOR одинаковых значений даст 0, различающиеся биты дадут 1.

Да конечно, ага.

0x1 ^ 0x2 ^ 0x3 = 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Serhiy_UA сказал:

Еще один метод, если я правильно понял задачу (проверка условия, все ли числа равны).

Если чисел 16 шт, то просто сложите все, потом сумму сдвиньте в младшую сторону на 4 разряда, и выполните одно сравнение результата с любым из этих 16 чисел. 

Чо ? 2+2+2...+2+0+4=32  и потом 32/16=2 и сравню с первым, то как бы по вашему все нормально =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, megajohn said:

Чо ? 2+2+2...+2+0+4=32  и потом 32/16=2 и сравню с первым, то как бы по вашему все нормально =)

Мой совет не корректен

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...