Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Нужен совет по созданию функции

16.09.2016, 15:18. Показов 842. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Занимаюсь разработкой класса для работы с прибором на основе его протокола обмена. Прибор при получении запроса дает ответ. Запросы бывают на запись и чтение данных.

Прототип функции на запись данных примерно такой: int Write(int Data);. То есть, функция получает данные Data, которые необходимо записать и возвращает ответ. По ответу определяется, записал прибор данные или же возникла какая-то ошибка.

А вот с функцией на чтение данных не все так просто. При чтении прибор может вернуть запрашиваемые данные, а может вернуть ошибку чтения. Поэтому прототип функции чтения нельзя сделать таким int Read();, так как будет не понятно что вернул прибор: запрашиваемые данные или ошибку.
Был вариант сделать прототип так: int Read(&Data);. То есть, функция возвращает признак успешности чтения, а сами данные записывает по ссылке Data. Однако вспоминается замечание уважаемого volvo о том, что не есть хорошо, когда функция что-то возвращает через свои параметры. Поэтому я в проектируемом классе создал общедоступную переменную Error, которая предназначена для фиксации ошибок.
C++
1
2
3
4
TMyClass *MyClass = new TMyClass;
 
int Data = MyClass->Read();
if(MyClass->Error) ShowMessage(L"Ошибочка чтения №" + String(MyClass->Error));
Если мой вариант имеет изъяны и можно сделать по-другому, то посоветуйте как.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2016, 15:18
Ответы с готовыми решениями:

Нужен совет по созданию своего типа данных
Приветствую всех. Мне необходимо создать свой тип данных "Пароль". Размер самого пароля всегда один и тот же и составляет 6 байт. Кроме...

Нужен совет от профессионалов по созданию БД
Всем доброго времени суток. В общем есть такая задача: Нужно написать приложение, с помощью которого можно заносить данные в БД, а затем по...

Нужен совет по созданию БД в Delphi
Мне необходимо создать программу-тренажёр для изучения математической логики. Я предполагаю случайным образом выбирать задания из базы...

6
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
16.09.2016, 18:32
Цитата Сообщение от d7d1cd Посмотреть сообщение
Однако вспоминается замечание уважаемого volvo о том, что не есть хорошо, когда функция что-то возвращает через свои параметры
Ничего в этом нехорошего нету. Иногда функции требуется вернуть не один, а несколько параметров и другого выхода нет. Всё WinApi на этом построено, огромное количество библиотек, выполненных в виде SDK.
Просто правилом хорошего тона считается выходные параметры маркировать в виде указателей, а не в виде ссылок
C++
1
void Foo(const string &in, string *out);
А вообще классически есть два подхода:
1) функция возвращает результат выполнения в виде некой переменной и пользователь решает, что дальше делать (опять в качестве примера то же WinApi)
C++
1
2
3
if (!GetWindowText(hwnd, lpString, nCount) {
    // получаем более расширенный GetLastError, решаем, что делать дальше
}
2) функция возвращает исключение, пользователю необходимо самому перехватывать это исключение
C++
1
2
3
4
5
6
try {
    int Data = MyClass->Read();
    // всё нормально, работаю дальше с Data
} catch(std::exception &e) {
// log e.what()
}
Пример из библиотеки glog
C++
1
2
3
4
// Demangle "mangled".  On success, return true and write the
// demangled symbol name to "out".  Otherwise, return false.
// "out" is modified even if demangling is unsuccessful.
bool GOOGLE_GLOG_DLL_DECL Demangle(const char *mangled, char *out, int out_size);
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
17.09.2016, 13:20  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Просто правилом хорошего тона считается выходные параметры маркировать в виде указателей, а не в виде ссылок
Чем продиктованы такие правила? Может это повелось из С, где ссылок не было еще? Передача значения по ссылке намного удобнее, чем через указатель.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
19.09.2016, 09:30
Цитата Сообщение от d7d1cd Посмотреть сообщение
Чем продиктованы такие правила?
По большей части эстетическим видом. Более наглядно, где меняется переменная, при разбирательстве с чужим кодом

1) int a меняется по указателю
C++
1
getValue(pObj, x, y, z, &a);
2) int a меняется по ссылке
C++
1
getValue(pObj, x, y,z, a);
А вообще на эту тему есть большой спор, лучше почитать здесь
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
02.02.2017, 21:00  [ТС]
Снова возникли сомнения... Сейчас, пока написано не много функций, решил окончательно определиться, чтобы потом не лопатить код.
"Рабочие" функции моего класса имеют один примерно такой "вид":
C++
1
2
void Read(int &value); // Чтение данных в переменную value
void Write(const int &value); // Запись данных из переменной value
О результате работы функции я узнаю по внутренней переменной класса Error, которая может быть либо 0 (функция выполнила задачу успешно), либо содержать код ошибки.
И вот тут возникает две идеи. Первая состоит в том, чтобы функции возвращали значение переменной Error. Вторая, чтобы функции записи ничего не возвращали, а функции чтения возвращали то, что они должны прочитать.
C++
1
2
3
4
5
6
7
8
9
10
// Первая идея:
int err, value = 1;
err = Read(int &value);
err = Write(const int &value);
// о результате знаю сразу
 
// Вторая идея:
int value = Read();
Write(const int &value);
// о результате буду узнавать через переменную класса Error
Подскажите, уважаемые знатоки, какой вариант выбрать? Или, может быть, есть совсем другой вариант? Подскажите. Лично сам больше склоняюсь к первому варианту.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
03.02.2017, 22:58  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
А вообще классически есть два подхода:
Моя первая идея соответствует первому классическому подходу в примере Maluda. Вторая, как мне кажется, более наглядная: вызвал функцию чтения - она вернула то, что прочитала...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,911
Записей в блоге: 12
03.02.2017, 23:23
Цитата Сообщение от d7d1cd Посмотреть сообщение
вызвал функцию чтения - она вернула то, что прочитала...
Или не прочитала, но вернула что-то, что потом фиг отличишь от корректного значения, и придется вообще при каждом вызове подобной функции лазить и проверять эту самую внутреннюю переменную Error, что добавит писанины. Я бы делал по первому варианту. Очень удобно в том же VCL:

C++
1
2
3
4
5
if(TryStrToInt(s, v))
{
    // если функция вернула true - значит, все нормально, и v содержит корректные данные.
}
else // error
А теперь попробуй это переписать по второму варианту, учитывая, что в строке может храниться и 0, и -1, и 0xFFFF какой-нибудь.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.02.2017, 23:23
Помогаю со студенческими работами здесь

Нужен совет по созданию программы
Не подскажите, как на языке си оформить задачу, в которой пользователю предлагается выбор по типу: "Если вы хотите то-то, нажмите 1,...

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

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

Нужен совет по созданию сети
Добрый день! прошу помочь грамотных людей в сетевой теме. У нас в компании около 12 компов, работают менеджеры. Все компы подключены...

Нужен совет по созданию высокопроизводительной БД
Всем доброго времени суток! Я до этого сталкивался только с небольшими по объёму проектами на MySQL и Firebird. Но сейчас появилась...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru