Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107

Кто отвечает за корректность аргументов функции?

22.07.2019, 19:23. Показов 6397. Ответов 72

Вопрос к знатокам стандарта или просто ведующим.

В языке c за корректность аргументов обычно отвечает вызывающая сторона.

Т.е. если ты вызываешь printf("%d", some_int) и подставляешь туда нечто не int,
то это твои проблемы потом удивляться, недоумевать или возмущаться на некорректный вывод или уход в даун.

А с++ какая практика?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2019, 19:23
Ответы с готовыми решениями:

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)?
Я конечно, понимаю, что на такие вопросы отвечают "почитай книжку". Я читала, честное слово:) Конкретно. Есть функция void jacobi (...

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки первой строки: void makeArr(char *str,...

Для разминки тем, кто спрашивает и тем, кто отвечает
Преамбула. Задача возникла не вдруг и не на пустом месте. Это попытка (возможно и не очень удачная) оценить потенциал форума. ...

72
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 23:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вызывающая сторона - внешний мир. И она должна знать о функции
не понятно, к чему ты это написал.
особенно, если учесть, что это - ответ на цитату,
где речь о вызывающей стороне.

Цитата Сообщение от IGPIGP Посмотреть сообщение
И всё же, решать разработчику, что ему выбрать.
у себя дома можешь вообще никаких проверок не делать.

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

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
хамите сударь.
ты вообще знаешь, что такое хамство?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 23:28
Цитата Сообщение от rams Посмотреть сообщение
Ну и на фига

rams, я согласен по духу, но
Цитата Сообщение от rams Посмотреть сообщение
почти на 100%
это к сожалению многовато. Однако, тема холиварна. Она покажет новичкам в очередной раз, что можно быть неплохим технарём и слабо анализировать. Я тут и себя имею ввиду.
rams, вот простой пример. std::vector не отслеживает границ в операторе индексирования, но имеет метод at(size_t)
https://ru.cppreference.com/w/... /vector/at
где такая проверка производится (за отдельную плату). А решать, платить или нет - пользователю. Об этом я и говорю. Проверять перед вызовом, труднее, но можно сэкономить общее время выполнения. Вы думаете данный пример, новость для присутствующих? Нет. Но смотреть и видеть, - не одно и то же самое.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 23:35
Цитата Сообщение от rams Посмотреть сообщение
if(min > max) ...?//Ну и на фига
почему у тебя min и max местами перепутались?

почему такое вообще могло произойти?
либо программная ошибка где-то в алгоритмах.
либо человеческий фактор (кто-то налажал, напутал, etc)

значит должен стоять assert(min <= max);

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
std::vector не отслеживает границ в операторе индексирования,
в любой вменяемой реализации (msvc, например) там стоит assert.

Добавлено через 53 секунды
Цитата Сообщение от IGPIGP Посмотреть сообщение
at(size_t)
а вот зачем в std::vector этот метод завезли - это для меня вопрос.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 23:36
Цитата Сообщение от hoggy Посмотреть сообщение
а вот зачем в std::vector этот метод завезли - это для меня вопрос.
Скромничаете. У вас гораздо больше вопросов, но мне это уже не интересно.
0
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 23:47  [ТС]
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
if(min > 0)
if(max >0)
if(max <= MAX)
if
if
}

or

int rnd = getRand(-1,1);//boom this function not working, required another function or overload
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.07.2019, 23:48
Ответ имхо очевиден. Путин.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 00:21
Цитата Сообщение от _Ivana Посмотреть сообщение
Ответ имхо очевиден. Путин.
Не похоже. Хотя, - с какой стороны посмотреть...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.07.2019, 01:53
Цитата Сообщение от rams Посмотреть сообщение
if(min > max) ...?//Ну и на фига
Иначе все эти if/assert будут не в одном getRand, а во всех точках где getRand вызывается.
0
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
23.07.2019, 04:20  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Иначе все эти if/assert будут не в одном getRand, а во всех точках где getRand вызывается.
А вы типа не знаете какие данные будете в функцию передавать и вобще чего в от нее хотите
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 09:24
Цитата Сообщение от Renji Посмотреть сообщение
Иначе все эти if/assert будут не в одном getRand, а во всех точках где getRand вызывается.
На каждый вызов, это будет свой набор. И он, что интересно, будет разный, так как в разных точках вызова аргументы порождаются по разному. Могут быть и такие где, всё или часть условий уже проверено по причинам не связанным с данным конкретным вызовом или гарантировано самим алгоритмом порождения аргументов.
Это сложно и не надёжно в по мере возрастания сложности, но это путь к повышению скорости. Где-то оправдано, а где-то нет.
Проверки в самой функции гарантируют полный пакет в каждом вызове.
Хорошо защищённый код похож на танковый полк. Мощно и непробиваемо. У нас споры тоже что-то из этого напоминают. В каждом танке - светлая голова. Иногда снаружи. Танкист блондин, - идеальный воин.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.07.2019, 09:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Где это требование изложено?
В фундаментальных книгах по программированию, которые мы все изучали в свое время.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 09:29
Цитата Сообщение от jugu Посмотреть сообщение
В фундаментальных книгах по программированию, которые мы все изучали в свое время.
Я говорю о стандарте и документации. Что касается фундаментальных книг, будет уместно привести примеры, тем не менее. Это хороший способ убедиться в том, что фундамент не у всех отраслей человеческого знания, добротен.
И всё же.
Давайте так: источник, цитата, контекст. Интересно увидеть.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.07.2019, 09:51
Вспомним функции WinAPI. Еще со времен Юрского периода у многих из них возвращаемым значением является HRESULT, который в закодированном виде представляет статус выполненной операции. По его значению можно понять, что произошло и что было не так с аргументами. При всём потоке кала с сторону Windows это ИМХО хороший стиль написания функций.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я говорю о стандарте и документации.
В стандарте таких требований нет. У стандарта иные задачи.

Добавлено через 4 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что касается фундаментальных книг, будет уместно привести примеры, тем не менее. Это хороший способ убедиться в том, что фундамент не у всех отраслей человеческого знания, добротен.
В данном случае фундамент добротен. Гораздо лучше иметь функцию, которая ведет себя предсказуемо на любых комбинациях аргументов, чем функцию, которая вылетает в неопределенность при любом шаге в сторону.

Добавлено через 6 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Давайте так: источник, цитата, контекст. Интересно увидеть.
То есть вас убедит, если некий академик Иванов И.И. или профессор Swith S.S. давал такие рекомендации?

Добавлено через 6 минут
Цитата Сообщение от rams Посмотреть сообщение
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
}
В этой функции как раз никакой проверки не надо. Идеальная интерфейс! Эх, если б все функции так можно было писать...
Кстати, в STL многие функции имеют именно такой интерфейс (функция связана с окружением по данным и по формату параметров), что гарантирует корректность аргументов и не требует проверки. В качестве примера приведем шаблон копирования:
C++
1
2
3
4
5
6
7
8
9
template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}
Большая часть проверок здесь делается во время компиляции согласно требованиям, которые шаблон предъявляет к своим параметрам. Условие while также проверяет корректность взаимного расположения итераторов. Никаких дополнительных if-ов не нужно. Написано всё очень умно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 10:50
Цитата Сообщение от jugu Посмотреть сообщение
В стандарте таких требований нет. У стандарта иные задачи.
Первая фраза, совпадает с тем, что я говорю. И этот ответ я предполагал услышать. Вторая часть, не соответствует истине. Но я не хочу обсуждать задачи стандарта. Это слишком общая тема. Мы тута в 3-х соснах упрели.

Цитата Сообщение от jugu Посмотреть сообщение
Гораздо лучше иметь функцию, которая ведет себя предсказуемо на любых комбинациях аргументов, чем функцию, которая вылетает в неопределенность при любом шаге в сторону.
Лучше кому и для чего? jugu, я привёл пример из stl. Это простой и логичный пример, - vector это самая людная/модная/центральная часть. А оператор индексирования - неотъемлемая часть vector. Тут нет ни чего случайного. Кроме мнений ряда профессионалов about.

Добавлено через 5 минут
Цитата Сообщение от jugu Посмотреть сообщение
То есть вас убедит, если некий академик Иванов И.И. или профессор Smith S.S. давал такие рекомендации?
Если вас не убедит, то вам и не стоит о них (рекомендациях - это уже лучше чем, 'требованиях') упоминать. Тем более как о фундаментальных законах бытия. Вы сейчас с собой пытаетесь поспорить.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.07.2019, 11:05
Цитата Сообщение от IGPIGP Посмотреть сообщение
Лучше кому и для чего?
Лучше для надежности программы, если вы еще не догадались.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
jugu, я привёл пример из stl.
Пример из STL вроде я привел (см. пару постов выше). И пояснил, почему он хорош. И показал, что в нем на самом деле "скрыта" куча проверок аргументов.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 11:14
Цитата Сообщение от jugu Посмотреть сообщение
Лучше для надежности программы, если вы еще не догадались.
Учение Ленина верно потому что оно СПРАВЕДЛИВО!
jugu, это уже не имеет смысла. Вы думаете выбор от [] до at(size_type) случаен?
Тема данного топика :
Цитата Сообщение от rams Посмотреть сообщение
Кто отвечает за корректность аргументов функции?
И нет однозначного ответа. Если у вас есть:
цитата из
Цитата Сообщение от rams Посмотреть сообщение
стандарта
или равного по строгости документа, - покажите. Остальное холивар. Различие между нами в том, что я говорю, о том, что это case-dependent, а вы говорите, что кто-то кому-то что-то должен. Предъявите долговые обязательства. Банковские чеки, закладные, векселя или даже простые расписки.
jugu, пламенные предостережения о том, что тех кто отступится от пути истинного ждёт неотвратимая и внезапная кара из любых мест в любые точки организма, - средневековый подход.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.07.2019, 11:23
Цитата Сообщение от IGPIGP Посмотреть сообщение
jugu, пламенные предостережения о том, что тех кто отступится от пути истинного ждёт неотвратимая и внезапная кара из любых мест в любые точки организма, - средневековый подход.
Не смею мешать вам биться лбом об стену, работая с небезопасными функциями

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Учение Ленина верно потому что оно СПРАВЕДЛИВО!
Ознакомьтесь с основами теории надежности вообще и программных средств, в частности, а потом подискутируем о Ленине.. да хоть о Сократе с Платоном
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.07.2019, 12:08
Цитата Сообщение от jugu Посмотреть сообщение
Не смею мешать вам биться лбом об стену, работая с небезопасными функциями
В том -то и дело, что тоталитарность мышления - свойство мыслящего. Для вас существует только альтернатива: или навсегда одно или навсегда другое. А я если бы хоть раз вздумал биться головой, - разбил бы её. Так что и тут я не с вами. Это не моё.
Цитата Сообщение от jugu Посмотреть сообщение
Ознакомьтесь с основами теории надежности вообще и программных средств, в частности, а потом подискутируем о Ленине..
hoggy тут тоже вместо аргументов пытался оценивать оппонента. А потом изумлялся : "Что такое хамство?"
Цитата Сообщение от Жванецкий
Хватит спорить о вариантах зернопогрузчика. Долой диспуты вокруг технических вопросов.

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

Что может говорить хромой об искусстве Герберта фон Караяна? Если ему сразу заявить, что он хромой, он признает себя побежденным.

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

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

Поведение в споре должно быть простым: не слушать собеседника, а разглядывать его или напевать, глядя в глаза. В самый острый момент попросить документ, сверить прописку, попросить характеристику с места работы, легко перейти на "ты", сказать: "А вот это не твоего собачего ума дело", и ваш партнер смягчится, как ошпаренный.
Что-то не стали вы приводить мест и цитат из указанных теорий. Цитат которые диктуют и указывают, замечу. То есть имеют не рекомендательно-информационный характер, а силу закона.
О том, что проверка внутри функции надёжнее никто не спорил.
Цитата Сообщение от jugu Посмотреть сообщение
подискутируем о Ленине
И тут вы проницательны как всегда. Я помогу. Цитата не о Ленине. Она о догматизме в его рафинированном виде. Громогласная тавтология:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Учение Ленина верно потому что оно СПРАВЕДЛИВО!
равнозначно
Цитата Сообщение от IGPIGP Посмотреть сообщение
Учение Ленина СПРАВЕДЛИВО потому что оно верно!
и совершенно самодостаточно.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.07.2019, 12:15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что-то не стали вы приводить мест и цитат из указанных теорий.
Это не имеет смысла, т.к. нет собеседника, готового внимать, а есть "стена", которая крепка в своём заблуждении ))
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.07.2019, 12:16
Цитата Сообщение от rams Посмотреть сообщение
А вы типа не знаете какие данные будете в функцию передавать и вобще чего в от нее хотите
А вы, типа, сразу пишите код без ошибок и даже опечаток у вас не бывает? Вы всегда помните что getRand принимает знаковое целое, но при этом не переваривает числа меньше единицы? Чем лучше код обмазан assert-ами, тем быстрее такие ошибки всплывут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.07.2019, 12:16

Кто отвечает на форумах?
Мне стало интересно кто отвечает на форумах? Этим людям заняться нечем чтоли, чтобы искать чьи то вопросы, вникать в них и потом писать...

Чат не отвечает, пока кто-либо не подключится
Всех приветствую. Столкнулся со следующей проблемой при написании простого чата по TCP/IP: после нажатия на кнопку &quot;Start Server&quot;...

Можно ли наращивать количество аргументов функции? Можно ли вернуть количество аргументов функции?
К примеру есть примитивная запись int Funk(bool Er,int q1,int q2,int q3) {return 0;} В данной записи объявлены аргументы int...

Корректность функции
Мне нужно чтобы не в процедуре проверялся ввод данных а в функции, как это сделать ? procedure input(var a:real;var b:real; var c:real); ...

Вычислить значение функции и вывести на печать значения функции и аргументов
Уважаемые программисты, Я новенький на вашем форуме, так что извините, если что не так. Помогите с таким заданием : Вычислить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru