LINUX.ORG.RU

С++ создать ограниченный тип


0

3

в Ада можно сделать собственный подтип:

subtype Data is Integer;
subtype Age is Data range 0..140;

как нибудь можно сделать подобное в c++?

★★★★★

Последнее исправление: splinter (всего исправлений: 1)

Ответ на: комментарий от next_time

Забей, не нужно им решение, просто попытались вбросить.

tff
()
Ответ на: комментарий от emulek

А он взял, и ВНЕЗАПНО дал 10. Мой код этого даже не заметит, а твой — рухнет. Ибо твой тип 10 не умеет. Проблема. У тебя.

Ну так фишка в том что у меня рухнет приложение на уровне снятия с АЦП, а у тебя будет новая Фукусима.

splinter ★★★★★
() автор топика
Последнее исправление: splinter (всего исправлений: 1)
Ответ на: комментарий от next_time
~$ cat 1.cpp
#include <cstdint>

struct Int
{
    constexpr Int( int n ) : n_( n > 100 ? (intptr_t) "n > 100!!!11" : n ) {}
    int n_;
};

int main()
{
    constexpr Int n1( 10 ); // OK
    constexpr Int n2( 200 ); // Fail
}

~$ g++ -std=c++11 1.cpp
1.cpp: In function ‘int main()’:
1.cpp:14:27: error: ‘const Int{((int)((long int)"n > 100!!!11"))}’ is not a constant expression
     constexpr Int n2( 200 ); // Fail
                           ^

вот проверка, которая сработает при компиляции, а у тебя молча все компилируется

wota ★★
()
Последнее исправление: wota (всего исправлений: 2)
Ответ на: комментарий от wota

Хочешь сказать, можно будет написать два конструктора - один для обычного int, другой для constexpr, и во втором проверять границы, например, static_assert?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

да, сейчас static_assert нельзя использовать, т.к. constexpr конструктор может быть вызван в runtime

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

чтоб проверка не «ушла» в рантайм, но я прогуглил - в С++14 этого не будет

упс, отвлекался во время написания поста, получилось неоднозначно, имелось ввиду, что не будет принято данное предложение

wota ★★
()
Ответ на: комментарий от splinter

Ну так фишка в том что у меня рухнет приложение на уровне снятия с АЦП, а у тебя будет новая Фукусима.

Даже не рухнет, а обработает исключение, и станет работать дальше.

Deleted
()
Ответ на: комментарий от wota

вот проверка, которая сработает при компиляции, а у тебя молча все компилируется

да, но нужно руками вбивать явно constexpr, а не хочется

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от splinter

Ну так фишка в том что у меня рухнет приложение на уровне снятия с АЦП, а у тебя будет новая Фукусима.

от того, что будет не 9.9999, а 10, будет Фукусима? Обоснуй.

emulek
()
Ответ на: комментарий от emulek

Ты батя? Или Эдичка? Похоже просто по уровню тупняка.

Например, у тебя АЦП 12 разрядов. Измеряется ток. Понятно, что значение может быть от 0 до 4095, и оно будет преобразовано в мА.

В программах бывают ошибки. Если из-за программной ошибки на каком-то уровне в переменной связанной с АЦП, например, окажется 54000, то возникнет исключение. Мы его ловим, помечаем канал как недостоверный и в самом худшем случае система уходит в аварийный останов (это дорого, но процедура стандартная и не опасная).

А если в переменной, отвечающей, например, за давление газа окажется какая-то херня, которая будет восприниматься как достоверная, то в соответствии с её значением может отработать алгоритм (например, расчет угла в дозаторе газа) и это может привести к аварии.

Конечно, дебилов и невежд с ЧСВ 100500 среди разработчиков хватает, поэтому в системы добавляют независимые контура защиты. И есть вероятность, что сработают механичиские разрушающиеся предохранители, и взрыва, утечки, етс не будет, но это совсем другие деньги, сроки восстановления и административные последствия.

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

да, но нужно руками вбивать явно constexpr, а не хочется

поэтому я и не посоветовал это ТС

wota ★★
()
Ответ на: комментарий от anonymous

Ты батя? Или Эдичка? Похоже просто по уровню тупняка.

no comment

Конечно, дебилов и невежд с ЧСВ 100500 среди разработчиков хватает, поэтому в системы добавляют независимые контура защиты. И есть вероятность, что сработают механичиские разрушающиеся предохранители, и взрыва, утечки, етс не будет, но это совсем другие деньги, сроки восстановления и административные последствия.

эти контура должны добавляться ЯВНО.

emulek
()
Ответ на: комментарий от splinter

плохой пример.

ибо у тебя градусы 0..359 - это эталоны классов/групп эквивалентности

т.е 100500 градус вполне отображается на тот или иной эталон в отличии от ограниченого типа где значение окромя перечисленных тем или иным путём недопустимл

qulinxao ★★☆
()
Ответ на: комментарий от emulek

> Конечно, дебилов и невежд с ЧСВ 100500 среди разработчиков хватает, поэтому в системы добавляют независимые контура защиты. И есть вероятность, что сработают механичиские разрушающиеся предохранители, и взрыва, утечки, етс не будет, но это совсем другие деньги, сроки восстановления и административные последствия.

эти контура должны добавляться ЯВНО.

Да, я и написал что контура добавляются явно. Нечего писать - не пиши, скор за сегодня уже добавили.

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

можно. просто нужно сделать обёртку над примитивным типом в виде класса, кстати в Аде (и где угодно) реализовано точно также

next_time ★★★★★
()
Ответ на: комментарий от wota

Утверждение было следующим, цитирую:

В итоге работать будет, но медленно. Потому что все проверки будут происходить только при выполнении кода, но не компилятором

Ну и? Как отсутствие предупреждений во время компиляции повлияет на производительность?

next_time ★★★★★
()
Ответ на: комментарий от next_time

Ну и? Как отсутствие предупреждений во время компиляции повлияет на производительность?

ну то, что dimss написал про медленно - откровенная чушь, человек просто не умеет оценивать задачи и не понимает, что в той же Ada без динамики тоже никак, с этим и спорить не надо, а вот ошибки еще при компиляции - вещь просто сама по себе удобная, логичная и интересная, и С++ ее таки в данном случае не умеет, и вряд ли раньше С++17 сумеет, но, справедливости ради, в этом он далеко не одинок

wota ★★
()
Ответ на: комментарий от anonymous

Следует считать, что программа написана без ошибок. Ибо с тем же успехом может не только «нечаянно переменная данных с АЦП перезаписаться», но и «нечаянно вызваться функция открытия клапана» и тут уже ничто не спасёт.

С другой стороны, если делать формулы универсальные (поддержка отрицательных скоростей, длин, высот, градусной меры больше 360 и т. д.), то в случае каких-то необычных ситуаций (например, самолёт опускается ниже уровня мирового океана, ибо местность позволяет - реальный пример катастрофы из-за недальновидности программистов) код не упадёт, а отработает корректно.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Следует считать, что программа написана без ошибок.

Во-первых, не следует; во-вторых, нерелевантно.

tailgunner ★★★★★
()
Ответ на: комментарий от wota

а вот ошибки еще при компиляции - вещь просто сама по себе удобная, логичная и интересная

Это только на первый взгляд. На практике, проверки попадания некоего значения в некий диапазон во время компиляции, т.е., читай, проверка констант, лично мне ни разу не пригодились, т.е. вообще никогда не испытывал такой потребности.

Кроме того, такая проверка априори недееспособна для случая сложных данных (читай, классов).

Проблема реализации такой возможности заключается в том, что она несколько увеличивает объём «сахара» в языке(а синтаксис С++ и так ругают за его перегруженность). Ещё хуже то, что такая возможность только затрудняет чтение чужого кода, особенно, если автор кода с трудом осознаёт, что же он творит.

Живой пример тому — вопрос вокруг углов. Некоторым людям кажется очевидным ограничение углов от 0 до 360 градусов, на самом же деле, 400 градусов — это 0 + 40, причём это с точки зрения математики, а с точки зрения физики - это полный оборот + 40. Таким образом, очевидное, казалось бы, решение, на самом деле содержит в себе коренную ошибку. И эта ошибка может быть скрыта в месте определения переменной.

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

next_time ★★★★★
()
Ответ на: комментарий от next_time

Живой пример тому — вопрос вокруг углов. Некоторым людям кажется очевидным ограничение углов от 0 до 360 градусов

Расскажи мне об ограничении температуры. -300 градусов - это как интерпретировать? А продолжительность интервала в -1 секунду?

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Потому что все проверки будут происходить только при выполнении кода, но не компилятором.

static_assert'ов можно навтыкать

annulen ★★★★★
()
Ответ на: комментарий от annulen

Не понимаю, почему ты ответил мне, но нет никакой разницы между величиной границ.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Расскажи мне об ограничении температуры. -300 градусов - это как интерпретировать?

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

https://ru.wikipedia.org/wiki/Отрицательная_абсолютная_температура

А продолжительность интервала в -1 секунду?

Снова хороший пример. Это ошибка или мы задали конечное значение интервала впереди начального. Может быть, так и надо?

next_time ★★★★★
()
Ответ на: комментарий от next_time

Расскажи мне об ограничении температуры. -300 градусов - это как интерпретировать?

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

Ну да, один из датчиков вдруг зафиксировал температуру ниже абсолютного нуля. Этот интереснейший научный факт нужно обнаружить (с помощьюю исключительной ситуации Constraint_Error) и исследовать.

А продолжительность интервала в -1 секунду?

Снова хороший пример. Это ошибка

Еще раз - продолжительность интервала. Т.е., например, приемник нужно открыть на -1 секунду. По-твоему, это может быть не ошибкой?

или мы задали конечное значение интервала впереди начального

Это типичная ошибка, для однаружения которой придумали ограниченные типы.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

для однаружения которой придумали ограниченные типы.

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

По-твоему, это может быть не ошибкой?

да, это не ошибка, просто точки старт и енд поменялись местами — это требует несколько иного подхода к обработке ситуации, но ошибкой не является, программа должна компилироваться в такой ситуации

Этот интереснейший научный факт нужно обнаружить (с помощьюю исключительной ситуации Constraint_Error) и исследовать.

Если так, то это обработка риалтайм, я уже писал как её организовать в С++. Если же мы сами, ручками, задали -300, значит так и надо, мы имеем дело именно с температурой ниже абсолютного 0, случаи ССЗБ не интересуют.

next_time ★★★★★
()
Ответ на: комментарий от tailgunner

Ты упорот в хлам.

Нетъ. И не стоило переходить на личности, когда вам стало нечего аргументированно ответить.

next_time ★★★★★
()
Ответ на: комментарий от next_time

можно. просто нужно сделать обёртку над примитивным типом в виде класса

отнаследоваться прямо нельзя, костыль\класс сделать можно

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

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

next_time ★★★★★
()
Ответ на: комментарий от KivApple

реальный пример катастрофы

Перезапуск навигационной системы на испытаниях — это реальный пример катастрофы?

anonymous
()
Ответ на: комментарий от anonymous

В этом вся и суть, почему это (обработку диапазонов значений, о чём собственно речь) лучше описать явно через функцию и чтобы оно обрабатывалось в риалтайпе — потому что, чуть что, и решение в стиле языка Ада придётся переписывать (сегодня мы определили такое поведение - завтра другое), что в итоге только замедлит время разработки, да к тому же затрудняет понимание кода в итоге.

next_time ★★★★★
()
Ответ на: комментарий от next_time

только полностью его прочитайте, а не как в прошлый раз

next_time ★★★★★
()

конечные поля Галуа?

Stil ★★★★★
()
Ответ на: комментарий от next_time

Если у тебя ошибка в формуле приводит к неправильному результату, как ты будешь реализовывать свою функцию коррекции ошибок?

anonymous
()
Ответ на: комментарий от anonymous

ошибка в формуле

в данном топике идёт обсуждение не ошибок в формулах, а ошибок ввода информации, «реализовывать свою функцию коррекции ошибок» в этом случае - банальная задача.

next_time ★★★★★
()
Ответ на: комментарий от next_time

В данном топике идет обсуждение типов с произвольно ограниченным набором значений. Причем тут ввод данных?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.