Russian Qt Forum
Ноябрь 24, 2024, 10:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 57 58 [59] 60 61 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 786239 раз)
b-s-a
Гость
« Ответ #870 : Март 17, 2012, 10:14 »

1. на мой взгляд, число должно быть числом.
2. ну так откажись. это твоя фишка. В моем стиле атрибуты имеют только подчеркивание в конце (value_).

squash unrelated changes - не объединяй несвязанные изменения. У тебя в одном месте изменения с таблицей скоростей, а в другом исправление ошибки. надо разделить.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #871 : Март 17, 2012, 12:12 »

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

Цитировать
2. ну так откажись. это твоя фишка. В моем стиле атрибуты имеют только подчеркивание в конце (value_).
Значит уберу префикс m_ и сделаю аналогично тому, как в в основном сделано в большинстве подмодулей /qtbase.

И еще: что тебе не понравилось с хешем на Gerrit? Объясни.
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #872 : Март 17, 2012, 19:31 »

сейчас сделано более или менее нормально. Вот только не уверен, что QHash это нормальный выбор. Может лучше просто статический массив вообще, а искать через qLowerBound (скорости же в порядке возрастания).
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #873 : Март 17, 2012, 21:40 »

Цитировать
Может лучше просто статический массив вообще, а искать через qLowerBound (скорости же в порядке возрастания).

Я думал об этом.. но:

В одну сторону поиска (от значения 9600 к коду B9600) - да, тут 9600 и т.п по возрастанию идет.
Но необходим также поиск и в другую сторону (от B9600 к 9600) - тут я не уверен, что константы Bxyz тоже идут по возрастанию,
да и не факт вообще, т.к. в разных *nix они могут иметь какое угодно значение.

Поэтому я и выбрал QHash как золотую середину.

Значит мне мержить? Или как?

Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #874 : Март 18, 2012, 09:15 »

А как hash позволяет искать в обратную сторону? Кстати, в обратную сторону искать надо исключительно 1 раз при определении текущих настроек при открытии порта. Думаю, что в этом случае тупой перебор всех элементов массива будет достаточен.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #875 : Март 18, 2012, 10:24 »

Цитировать
А как hash позволяет искать в обратную сторону?
В смысле?

Код
C++ (Qt)
QHash<int, int> h;
 
h[9600] = B9600;
h[115200] = B115200;
 
int rate = h.key(B115200);

Цитировать
Думаю, что в этом случае тупой перебор всех элементов массива будет достаточен.
Зачем? Зачем загромождать код еще и перебором? Зачем что-то городить?

Я считаю, что QHash самое оно.
« Последнее редактирование: Март 18, 2012, 10:26 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #876 : Март 18, 2012, 22:57 »

имхо, цена, которую ты платишь за QHash (как и другой контейнер) выше, чем ты получаешь выигрыш в данном случае. Так как элементов у тебя не тысячи, и поэтому, выигрыша по сравнению с QMap может вообще и не быть. Особенно, если участь частоту обращения к этому хэшу. А вот память в куче выделяться будет. Для каждого ключа будет считаться хэш при каждом обращении. Имхо, оно того не стоит...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #877 : Март 19, 2012, 10:14 »

Цитировать
Для каждого ключа будет считаться хэш при каждом обращении. Имхо, оно того не стоит...
Предлагаешь заменить на QMap ? Чисто из-за экономии памяти или из-за чего?

ЗЫ: В описании на QHash сказано что он быстрее чем QMap...

Я просмотрел исходники Qt на предмет юзания QHash - так там он используется повсеместно. А вот бинарного поиска по статическому массиву я вообще нигде не нашел.

Ок, давай я пока переправлю имена приватных членов класса,добавив обратно префикс m_ (хотя, в самих исходниках Qt не везде они ставят этот префикс для приватных членов),
а потом ты предолжишь что-то более лучшее чем контейнеры QHash и QMap для поиска по "двумерному" статическому массиву ко каждому "измерению".

Идет? Улыбающийся

--

Я подправил имена приватных членов...
Глянь, плз, на что там бот ругается, а то я не пойму..
Как обойти этот санити бот? обошел Улыбающийся
« Последнее редактирование: Март 19, 2012, 11:36 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #878 : Март 20, 2012, 22:35 »

2 b-s-a

Касаемо твоего предложения в gerrit по поводу дополнительного класса:

1. как я понял, ты предлагаешь добавить приватный класс SerialPortEnginePrivate, который
будет тупо предоставлять только список стандартных baud rate и их конвертацию из одного вида в другой?

2. этот класс в твоих мыслях должен быть кросс-платформенным или быть заточенным только для *nix?

Если кросс-платформенным - то непонятно как в нем объединить эти все платформы.
Например, для симбиана, *nix нативные константы скорости задефайнены по-разному.

Как в твоем понимании должны выглядель к примеру метод

symbian
Код
C++ (Qt)
quint32 settingsFromRate(TBps rate)
 
где rate - это enum (если не изменяет память, сейчас не имею установленного QtSDK)

*nix
Код
C++ (Qt)
quint32 settingsFromRate(quint32 rate)
 
где rate - это константа вида Bxyz

для разных ОС, объединенный в одном классе SerialPortEnginePrivate.

Приведи код Улыбающийся

3. Как ты предполагаешь выполнить реализацию SerialPortEnginePrivate, в части хранения таблицы скоростей,
в виде QHash или статического "двумерного" массива?

И если в виде массива - то приведи код каждого (из трех тобой предложенных) метода,
а то я на QHash быстренько налабаю и будешь опять "ругаться" Улыбающийся



Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #879 : Март 20, 2012, 23:05 »

Я не предлагаю добавлять новый класс. Я предлагаю использовать существующий. Для каждой платформы уже есть такой. Вот в него и надо добавить эти три статических публичных метода.
что ж ты так любишь плодить классы? То класс опций, теперь чуть было стандартных скоростей не сделал.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #880 : Март 21, 2012, 10:01 »

Цитировать
Я не предлагаю добавлять новый класс. Я предлагаю использовать существующий. Для каждой платформы уже есть такой. Вот в него и надо добавить эти три статических публичных метода.

1. Так существующий - это SerialPorEngine, а не SerialPorEnginePrivate
2. SerialPorEngine - чисто абстрактный класс, который неимеет нигде своей реализации (т.е. нету файлов serialportengine.cpp и т.п.),
поэтому появляется вопрос: а куда собственно втыкать реализацию этих трех методов?

Например, можно втыкнуть эти статические методы не в базовый SerialPorEngine - а в наследуемые WinSerialPorEngine, UnixSerialPorEngine.
И тогда в соответствующем платформо-зависимом SerialPorInfo_mac/linux/win сделать инклуды соответствующих WinSerialPorEngine, UnixSerialPorEngine и т.п.

т.е.

serialportengine_unix_p.h
Код
C++ (Qt)
class UnixSerialPortEngine : public QObject, public SerialPortEngine
{
...
public:
   static qint32 settingsFromRate(qint32 rate);
   static qint32 rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

serialportengine_win_p.h
Код
C++ (Qt)
class WinSerialPortEngine : public QWinEventNotifier, public SerialPortEngine
{
...
public:
   // Но тут для Windows вообще не понятно, нужны ли эти преобразования вообще?
   // т.к. rate имеет реальное числовое значение и нет необходимости его преобразовывать.
   static qint32 settingsFromRate(qint32 rate);
   static qint32 rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

serialportengine_symbian_p.h
Код
C++ (Qt)
class SymbianSerialPortEngine : public QObject, public SerialPortEngine
{
...
public:
   static qint32 settingsFromRate(IBps rate);
   static TBps rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

далее, в

serialportinfo_unix.cpp
Код
C++ (Qt)
...
#include "serialportengine_unix_p.h"
...
...
qint32 rate = UnixSerialPortEngine::settingsFromRate(B9600);
...
 

serialportinfo_mac.cpp
Код
C++ (Qt)
...
#include "serialportengine_unix_p.h"
...
...
qint32 rate = UnixSerialPortEngine::settingsFromRate(B9600);
...
 

serialportinfo_win.cpp
Код
C++ (Qt)
...
#include "serialportengine_win_p.h"
...
...
// Тут вообще под сомнением, нужно ли это.
qint32 rate = WinSerialPortEngine::settingsFromRate(9600);
...
 

serialportinfo_symbian.cpp
Код
C++ (Qt)
...
#include "serialportengine_symbian_p.h"
...
...
qint32 rate = SymbianSerialPortEngine::settingsFromRate(EBps9600);
...
 

Цитировать
что ж ты так любишь плодить классы?
ООП Улыбающийся

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

ИМХО, я не вижу проблем с использованием отдельного класса для опций.

4. Ты не ответил насчет реалзации хранения таблицы в виде QHash или статик аррай...
« Последнее редактирование: Март 21, 2012, 10:05 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #881 : Март 21, 2012, 11:33 »

settingFromRate принимает 9600 и возвращает B9600, а вот rateFromSetting наоборот. Причем, первая может вернуть 0, а вот вторая нет.
тип настройки зависит от платформы.
Для Windows делать нужно только один метод standardRates().
Реализация поиска по статическому массиву уже имеется в реализации SerialPortInfo под unix. Там надо лишь заменить элементы массива на структуры: {rate, setting}. Сортировка должна быть по полю rate. Ну и нужно у этой структуры оператор меньше определить (сравнивать по rate), чтобы поиск работал. А так же сделай функтор для поиска rate по setting (равно/не равно). Этот поиск будет простым перебором.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #882 : Март 21, 2012, 15:55 »

Забацай ка примерчик, если не сложно Улыбающийся

ЗЫ: ты предложил - "тебе и карты в руки" (с)
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #883 : Март 21, 2012, 20:14 »

Код
C++ (Qt)
struct BaudRate
{
  int rate;
  int setting; //int можно заменить на подходящий тип для данной ОС
  bool operator<(const BaudRate &other) const { return rate < other.rate; }
  bool operator==(const BaudRate &other) const { return setting == other.setting; }
};
 
static const BaudRate baudRates[] =
{
//...
  {9600, B9600},
//...
};
 
static const BaudRate *baudRates_end = baudRates + sizeof(baudRates)/sizeof(*baudRates);
 
int UnixSerialPortEngine::rateFromSetting(int setting)
{
  const BaudRate br = {0, setting};
  const BaudRate *ret = qFind(baudRates, baudRates_end, br);
  return (ret != baudRates_end) ? ret->rate : 0;
}
 
int UnixSerialPortEngine::settingFromRate(int rate)
{
  const BaudRate br = {rate, 0};
  const BaudRate *ret = qBinaryFind(baudRates, baudRates_end, br);
  return (ret != baudRates_end) ? ret->rate : 0;
}
 
QList<int> UnixSerialPortEngine::standardRates()
{
  QList<int> ret;
  for(const BaudRate *it = baudRates; it != baudRates_end; ++it)
     ret.append(it->rate);
  return ret;
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #884 : Март 22, 2012, 09:44 »

2 b-s-a,

А тебя не настораживает тот факт, что ::standardRates() при каждом вызове будет заново заполняться?
Не проще ли все-таки использовать QHash ? Улыбающийся

PS: Что по этому поводу думают другие участники форума?
« Последнее редактирование: Март 22, 2012, 09:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 57 58 [59] 60 61 ... 88   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.316 секунд. Запросов: 23.