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

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

22.07.2019, 19:23. Показов 6394. Ответов 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
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru