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

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

16.09.2016, 15:18. Показов 821. Ответов 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru