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

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

22.07.2019, 19:23. Показов 6153. Ответов 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
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 19:26
Отвечает тоже вызывающая сторона, но автор функции должен так разработать ее интерфейс, чтобы некорректные аргументы было сложно подставить. Ну и, конечно, первыми операторами должны идти всевозможные проверки корректности аргументов с заменой неверных дефолтными значениями либо выбросом исключений.
1
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 19:33  [ТС]
Цитата Сообщение от jugu Посмотреть сообщение
Отвечает тоже вызывающая сторона
Цитата Сообщение от jugu Посмотреть сообщение
Ну и, конечно, первыми операторами должны идти всевозможные проверки корректности аргументов с заменой неверных дефолтными значениями либо выбросом исключений.
немного противоречат друг другу не находите
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 19:40
Цитата Сообщение от rams Посмотреть сообщение
немного противоречат друг другу не находите
Никаких противоречий. Отвечает за корректность вызывающая сторона. А функция должна работать надежно при любых аргументах, даже неверных. Т.е. в алгоритме функции все пути должны быть в идеале определены.
0
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 19:54  [ТС]
Цитата Сообщение от jugu Посмотреть сообщение
А функция должна работать надежно при любых аргументах, даже неверных.
Это отражено в стандарте или вы сами придумали. Мысль конечно не плохая.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 20:47
Цитата Сообщение от rams Посмотреть сообщение
немного противоречат друг другу не находите
Конечно. Проверять дважды не эффективно. Но решать, - программисту. Если функция влияет на скорость, то лучше проверки делать на вызывающей стороне (это всегда лучше именно там и делать), но если проверка не критична к скорости, но критична по возможным последствиям никто не обвинит монашку и свечу.
А в сях есть запись в стандарте об ответственности и проверках передаваемых аргументов?
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 20:53
Цитата Сообщение от rams Посмотреть сообщение
Это отражено в стандарте или вы сами придумали. Мысль конечно не плохая.
К сожалению, придумал не я, а те, кто стоял у истоков программирования на языках высокого уровня.

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно. Проверять дважды не эффективно. Но решать, - программисту.
Всё зависит от того, что это за функция, где, как и кем она будет использоваться. Нас учили в свое время, что хорошая функция должна адекватно реагировать на любые комбинации аргументов, правильные они или нет. К сожалению, на 100% это обеспечить можно далеко не всегда.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.07.2019, 21:00
Цитата Сообщение от rams Посмотреть сообщение
Т.е. если ты вызываешь printf("%d", some_int) и подставляешь туда нечто не int
У тебя вопрос стоИт в контексте эллипса (параметров с тремя точками) или чего? А то если аргумент функции объявлен как int, а туда передают, например, float, то по правилам языка построится преобразование типов. А это уже совсем из другой оперы
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 21:08
Цитата Сообщение от rams Посмотреть сообщение
В языке c за корректность аргументов обычно отвечает вызывающая сторона.
обе стороны.
и это не зависит от языка.

есть такое понятие "инвариант".
это - способность функции сохранять работоспособность
независимо от корректности вызывающей стороны.

хороший код - инвариантен.

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

что касается сишки:
существуют кейсы, когда инвариант попросту не возможен.
например: printf, или классика жанра:
C
1
2
// функция в принципе не способна валидировать аргументы
int process(const int* array, const size_t count);
так уж устроен язык.
не всегда есть возможность проверить аргументы.
но если есть возможность обеспечить инвариант - его нужно обеспечить.
2
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
22.07.2019, 21:15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно. Проверять дважды не эффективно. Но решать, - программисту.
Добавлю, что обычно для проверки корректности использования внутреннего API используют assertions, например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
===============
Creates a viewport with the specified width and height.
 
@param v Is a valid pointer to a Viewport structure.
@param w The viewport's width in range [0, VIEWPORT_MAX_WIDTH].
@param h The viewport's height in range [0, VIEWPORT_MAX_HEIGHT].
===============
*/
void Viewport_Create(Viewport *v, unsigned int w, unsigned int h)
{
    assert(v != NULL);
    assert(w <= VIEWPORT_MAX_WIDTH);
    assert(h <= VIEWPORT_MAX_HEIGHT);
 
    SDL_CreateWindowAndRenderer(w, h, 0, &v->window, &v->renderer);
 
    v->width = w;
    v->height = h;
}
Так что говорить о неэффективности не приходится.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 21:49
Цитата Сообщение от jugu Посмотреть сообщение
Всё зависит от того, что это за функция, где, как и кем она будет использоваться.
Существуют прямые и точные указания?
Цитата Сообщение от Eanmos Посмотреть сообщение
Так что говорить о неэффективности не приходится.
assert в релиз не компилируется и является отладочным кодом. В этом смысле он не является кодом функции в заданной теме. Хотя к теме и относится, конечно.

Цитата Сообщение от hoggy Посмотреть сообщение
принцип простой:
все входящие аргументы должны быть проверены.
если аргументы не корректны,
необходимо уведомить об этом вызывающую сторону.
Ни кто не может запретить. Поэтому - холивар по определению. Однако если вызывающая сторона передаёт сериями, например. В цикле, скажем. То там можно проверить границы диапазона и положиться на алгоритм и шаг изменения. Это просто быстрее. У вызывающей стороны может быть гораздо больше эффективных способов обеспечить "инвариант". Она порождает значения аргументов и знает о них больше чем функция. О функции знает разраб кода. Отказываться от этого - комфорт и тормоза. Энтропия от потери информации - зло. Зато не нужно знать читать маны.
Холивар, имхо.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 22:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поэтому - холивар по определению.
по какому такому определению?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Это просто быстрее.
"быстрее" - это вопрос дизайна и принципов обработок ошибок.

вообще, судя по твоей реакции ты не в теме.
ты знаешь, что такое assert, и зачем он нужен?

Цитата Сообщение от IGPIGP Посмотреть сообщение
У вызывающей стороны может быть гораздо больше эффективных способов обеспечить "инвариант"
не может, по определению понятия "инвариант".

Цитата Сообщение от hoggy Посмотреть сообщение
"инвариант".
это - способность функции сохранять работоспособность
независимо от корректности вызывающей стороны.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Она порождает значения аргументов и знает о них больше чем функция.
есть ещё понятие "инкапсуляция".

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

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

когда верхние и нижние этажи пишутся с оглядкой друг на друга - это говнокод.
0
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 22:32  [ТС]
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Просто есть максималисты ну типа см. выше.
И доводы что обычно проверок и так хватает и проверять еще и аргументы значит еще более все усложнять не работают.
Вот я подумал может есть какой то гуру или указание стандарта на который можно сослаться.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 22:57
Цитата Сообщение от hoggy Посмотреть сообщение
инкапсуляция - характеристика компонента (функции/класса/библиотеки/модуля/etc),
которая характеризует степень независимости деталей внутренней реализации от внешнего мира.
хороший код - инкапсулированый.
хорошая функция ничего не знает,
и не должна знать о внешнем мире.
Вызывающая сторона - внешний мир. И она должна знать о функции. Деталей реализации не нужно знать. Но если нет возможности понять, что для функции съедобно, а что нет, то это и есть
Цитата Сообщение от hoggy Посмотреть сообщение
говнокод
Другой вопрос, это то, что с ростом сложности, отслеживание логики для вызова становится бесполезной затеей. Для этого и OOP. Там идеома "чёрного ящика", о которой вы настойчиво говорите, реализуется по-человечески.
И всё же, решать разработчику, что ему выбрать. Делать код который будет падать/бросать исключения при отладке и тестировании, до тех пор пока не будут устранены причины. Либо делать код который будет тихо поедать всё что ему скармливают. Сроки, деньги и доступные ресурсы не последний аргумент. Проще всего идти по второму пути. Я не спорю. Но это не самый быстрый вариант.

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вообще, судя по твоей реакции ты не в теме.
ты знаешь, что такое assert, и зачем он нужен?
hoggy, хамите сударь.

Добавлено через 6 минут
Цитата Сообщение от rams Посмотреть сообщение
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Согласен. Но о процентах я бы не говорил. Если скорость - любой ценой, то функция не должна тормозить. Ограничения в документации. Но чаще-таки, всё иначе. Чем сложнее код тем накладней отслеживать такие зависимости.
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 23:06
Цитата Сообщение от IGPIGP Посмотреть сообщение
Существуют прямые и точные указания?
Математически точных указаний, конечно же, нет. Но есть требования, которые предъявляются к программам, их структурным элементам, в т.ч. и к функциям. Одно из таких требований - универсальность, т.е. работа с любыми данными, не только корректными.

Добавлено через 3 минуты
Цитата Сообщение от rams Посмотреть сообщение
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Это ваше право. Можно, конечно, писать функции, ничего не проверяя, отдавая это на откуп тому, что вызывает. Типа "передал фигню", ну и получи! В результате могут возникать трудноуловимые ошибки времени выполнения, на устранение которых тратится масса времени.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 23:08
Цитата Сообщение от jugu Посмотреть сообщение
Одно из таких требований - универсальность, т.е. работа с любыми данными, не только корректными.
Где это требование изложено?
jugu, я не спорю о том, что как рекомендация, это имеет право на жизнь. Я говорил о том, что не существует способа написать такое требование задав точные границы. То есть, оно не может быть частью разумного стандарта.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.07.2019, 23:10
Цитата Сообщение от rams Посмотреть сообщение
или указание стандарта на который можно сослаться
На каждую функцию, или набор функций, необходимо смотреть требования.
В угоду производительности, проверку аргументов многие функции стандартной библиотеки не производят.
1
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 23:12  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но о процентах я бы не говорил
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
}
1
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
22.07.2019, 23:17
Цитата Сообщение от rams Посмотреть сообщение
C
1
2
3
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
}
Опять же, такая проверка имеет смысл в форме

C
1
2
3
4
5
int getRand(int min, int max)
{
    assert(min < max);
    ...
}
Чтобы исключить ошибки при использовании API разработчиками. Такой способ просто не даст использовать функцию неправильно. Хотя можно заранее обговорить действия, выполняемые при передаче в функцию неверных аргументов (специальное возвращаемое значение, errno и т. д.).
0
22.07.2019, 23:18

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
hoggy, хамите сударь.
А где тут хамство?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2019, 23:18
Помогаю со студенческими работами здесь

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

Чат не отвечает, пока кто-либо не подключится
Всех приветствую. Столкнулся со следующей проблемой при написании простого чата по 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); ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru