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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4] 5 6 ... 290
46  Программирование / С/C++ / Re: Итераторы : Апрель 25, 2021, 09:02
И тот reinterpret_cast, нафиг он нужен? Тем более memcpy. Да просто так
Код
C++ (Qt)
using CDataRef = std::reference_wrapper<CData>;
QSet<CDataRef>& SelectionAsRefs( void )
{
static_assert(sizeof(CData*) == sizeof(CDataRef));
return *(QSet<CDataRef> *) &mSelection;
}
 
И вся любовь.
Точно.
А придурки из комитета все какие то касты придумывают, то static_cast, то reinterpret_cast, сейчас bit_cast придумали. Нечем им заняться. Улыбающийся
Зачем? Если можно сишным кастануть и вся любовь. Улыбающийся
47  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 24, 2021, 11:41
А вообще тема конечно обширная. Все зависит от того, что вы хотите: если вам нужны только pack/unpack - это будет одно решение. Если вы хотите хранить такие структуры в памяти и работать с ними из бизнес-логики, то другое.

Для примера:
Код
C++ (Qt)
// Схемы пакетов
auto ShemaPacket1 = std::make_tuple( 3, 3, 10, 52 );
auto ShemaPacket2 = std::make_tuple( 9, 11, 37, 60, 1, 1 );
 
// Возвращает упакованный bit_array
auto bits1 = pack( ShemaPacket1, 1, 2, 8, 1024 );
auto bits2 = pack( ShemaPacket1, data.val1, data.val2, data.val3, data.val4 );
auto bits3 = pack( ShemaPacket2, 15, 0, 0, 1024, 1, 0 );
 
// Возвращает кортеж значений по указанной схеме или exception
auto result1 = unpack( bits1, ShemaPacket1 )
auto [val1, val2, val3, val4] = unpack( bits1, ShemaPacket1 )
auto result3 = unpack( bits3, ShemaPacket2 )
 
 
48  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 24, 2021, 07:54
Причем размер не всех полей известен на момент компиляции. Только точно известно, что не бывает полей шире, чем 64 бита.
Т.е. в формате вместе со значением поля указывается и его размер в битах?
Или вы имеете ввиду, что пользователь этого формата должен иметь возможность выбирать любой размер поля от 1-64 бита?

https://github.com/CrustyAuklet/bitpacker
https://github.com/wkaras/C-plus-plus-library-bit-fields
49  Программирование / С/C++ / Re: Итераторы : Апрель 23, 2021, 15:21
Угрызения совести Улыбающийся Все-таки это говнокод

Я на это смотрю и думаю: Да, этому парню говнокод не предложишь.

Код
C++ (Qt)
void CBigClass::SomeMethod( bool useSelection )
{
 ..
 int limit = useSelection ? mSelection.size() : mData.size();
 auto dataIt = mData.begin();  
 auto selIt = mSelection.begin();  
 for (int i = 0; i < limit; ++i) {
   CData * dataPtr;
   if (useSelection) {
      dataPtr = *selIt;
      ++selIt;
   }
   else {
      dataPtr = &(*dataIt);
      ++dataIt;
   }
 
  ...
 }
}
 
50  Программирование / С/C++ / Re: Итераторы : Апрель 23, 2021, 09:18
Что же нового/современного можно использовать? (вместо структур > 10 летней давности).
Для того, что бы появились новые структуры данных, эти новые структуры сначала должен кто-то придумать.
Т.к. от std-шников ждать ничего не приходится, то остаетесь только вы. Улыбающийся
А как придумаете, то std-шники сразу эти новые структуры реализуют в своем убогом std. Улыбающийся
51  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 07:28
А насколько вообще хорош (правомерен и.т.п.) такой выбор контейнеров?
Он великолепен. Улыбающийся

Основная ваша проблема в этом:
(как и делать из тела метод)
Как только вы сделаете отдельный метод, все у вас начнет получаться. Улыбающийся
52  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 07:02
Там в целом были какие-то изменения в с++11, но яхз, поправлено это или "везет" что все новые компиляторы печатают одинаково.
Конечно поправили, gcc до 7 генерировал неправильный код.
В случае с стримами порядок вызовов функций четко определен.

Код
C++ (Qt)
std::cout << a() << b() << c() << std::endl;
 

Если в b() генерируется исключение, то в потоке должен остаться результат от a(). А теперь посмотрите что кодогенерит gcc до 7. Улыбающийся
53  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:56
И в чём проблема? Это пайплайн. Он должен выполняться строго слева направо (ибо в этом его суть) и никак иначе. Сайд-эффект в чём?
В том, что gcc до 7.1 лажал и генерировал шляпу. Улыбающийся
54  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:22
Да, жесть. Нужно быть осторожным. Улыбающийся

За такое, конечно нужно яйца откручивать gcc-шникам. Улыбающийся
Спасибо хоть gcc с 7.1 начал нормальный код генерить.
55  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:09
Ну вот gcc 4.6 печатает "210", а 10.3 печатает "120" https://godbolt.org/z/Pc9fa4bf9
Вот два скрина, в обоих случаях вроде 012?
Увидел где 210.


вот только оператор (даже член класса) это функция от двух аргументов
Код:
foo(f(), g());
не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано?
Ну и что, что два аргумента. В этом операторе нам не важно, какая функция будет выполнена первой operator<<( this(), f() )
56  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 16:37
Кстати, при прочих равных (когда нет выделения общих вычислений на аргументах) на практике соглашение о вызове по идее должно коррелировать с порядком вычисления аргументов - тот, который пушим первым первым и вычисляем, но не вычисляем первым аргумент из середины, т.к. его нельзя сразу запушить. Но, например, при register calling convension то, что будет передаваться в регистрах можно вычислять в любом порядке. Так что вариаций много.
Как я помню, это отдается на откуп компилятора. Поэтому может быть что угодно, закладываться на это нельзя.
57  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 15:23
Вспомнилось что когда-то весьма усердно изучалось нечто вроде
Цитировать
Pascal передает параметры слева направо, стек очищает сама ф-ция. А вот С - справа налево и стек очищает вызывающий. Поэтому можно передавать переменное число параметров и.т.д и.т.п. (потом еще для калбэков надо было учитывать)
Ну может какой-то смысл в этом и есть, но в принципе это совершенно бесполезное забивание головы всякой фигней  Улыбающийся
Да-да, продолжайте наблюдение. Улыбающийся
58  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 15:22
Да, но нет, это не члены класса а свободные функции:
А у какого компилятора operator<< это свободная функция?
У gcc и clang это члены класса. Даже у msvc это член класса.

и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
Что вначале выполниться boo или f? Улыбающийся
Код
C++ (Qt)
boo( f() );
 

а здесь:
Код
C++ (Qt)
auto &os1 = std::cout.operator<<( f() );
auto &os2 = os1.operator<<( f() );
auto &os3 = os2.operator<<( f() );
auto &os4 = os3.operator<<( std::endl );
 

Даже в вашем варианте порядок вызовов четко определен. Улыбающийся
59  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 13:31
В 2ГИСе мы спрашивали похожую задачку
std::cout << f() << f() << f() << std::endl;

где f() имеет сайд-эффект (делает i++)

никто не решил (я в том числе)
Нужно было вспомнить, что эта запись сахар для такой Улыбающийся
Код
C++ (Qt)
std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
 
А они всегда выполняются слева направо, т.к. здесь следующий оператор всегда применяется к результату предыдущего.

А вот с boo( f(), f(), f() ), не все так однозначно и, если мне не изменяет память, это отдается на откуп компилятора. Как правило f() будет вызываться справа налево, по крайней мере я не знаю ни одного компилятора, у которого это не так.
60  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 11:28
Вообще употребляемые здесь слова "продакшн", "разработка" и.т.п. - это просто "надувание щек", здесь обсуждается всего лишь мелкая деталь  Улыбающийся
Боже, от вас слышать про надувание щек... Улыбающийся
Страниц: 1 2 3 [4] 5 6 ... 290

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