Информация об изменениях

Сообщение Re[17]: Сишный каст - зло? от 29.07.2023 13:36

Изменено 29.07.2023 13:37 so5team

Re[17]: Сишный каст - зло?
Здравствуйте, Marty, Вы писали:

S>>1. У вас такой же список претензий/замечаний/вопросов/домыслов, как и у B0FEE664? Или же есть что добавить?


M>Я не вчитывался в смысл, потому что от одного оформления у меня кровь из глаз пошла


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

S>>2. Если, по вашему мнению, код "максимально ужасен", то что могло бы его "исправить" (опять же по вашему мнению)?


M>Для начала — нормально оформить


Не постесняюсь спросить: а вы что, большую часть времени только с собственным кодом работаете? В чужой вообще не заглядываете?
Мне приходилось видеть и использовать разные стили оформления, так что на внешний вид, по большей части, пофиг, если только аффтары не злоупотребляют строками по 150+ символов длинной и функциями по 100+ строк.

S>>3. Могли бы вы, для симметрии, привести фрагмент своего кода с кастами, дабы проиллюстрировать как должен выглядеть нормально написанный вами код?


M>ЗЫ, хотя, вот, лови:

M>#include <iostream>
M>#include <iomanip>
M>#include <fstream>
...
M>#include <random>

Список инклюдов доставляет. Неприятный такой звоночек.

M>int main( int argc, char* argv[] )

M>{
M> UMBA_USED(argc);
M> UMBA_USED(argv);

Выглядит так, как будто вы 30 лет назад программировать учились. Я про UBMA_USED для аргументов функции, на которые забили.

M> if (w32.size()>10)

M> {
M> auto mid = w32.size()/2;
M> std::shuffle(w32.begin()+ (std::ptrdiff_t)1u, w32.begin()+(std::ptrdiff_t)mid, g);
M> std::shuffle(w32.begin()+(std::ptrdiff_t)mid, w32.end() -(std::ptrdiff_t)2u , g);
M> }
M> else
M> {
M> std::shuffle(w32.begin()+(std::ptrdiff_t)1, w32.end()-(std::ptrdiff_t)2, g);
M> }

Я, наверное, чего-то глобально не понимаю, но зачем это все?

Вот, по мотивам вашего кода минималистичный пример:
#include <algorithm>
#include <string>
#include <vector>
#include <random>

int main()
{
    std::mt19937 g{ std::random_device{}() };

    std::vector< std::string > words;

    for( auto & w : words )
    {
        auto w32 = w;
        if( w32.size() > 10u )
        {
            const auto mid = static_cast<std::ptrdiff_t>( w32.size() / 2 );
            std::shuffle( w32.begin() + 1, w32.begin() + mid, g );
            std::shuffle( w32.begin() + mid, w32.end() - 2, g );
        }
    }
}


Компилируем:
tmp\rsdn_cpp_20230729>cl -EHsc -WX -Wall -std:c++17 t1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.36.32532 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

t1.cpp
Microsoft (R) Incremental Linker Version 14.36.32532.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:t1.exe
t1.obj

Все. Никакого обилия кастов, не говоря уже про Си-шные касты.

Такое ощущение, что даже не дали себе труда подумать о том, что происходит. Вы явно используете литерал беззнакового типа, но вам-то нужен знаковый std::ptrdiff_t, поэтому вы недолго думая херачите Си-шный каст и угребищный получаете (std::ptrdiff_t)1u там, где достаточно всего лишь обычной единички.
Re[17]: Сишный каст - зло?
Здравствуйте, Marty, Вы писали:

S>>1. У вас такой же список претензий/замечаний/вопросов/домыслов, как и у B0FEE664? Или же есть что добавить?


M>Я не вчитывался в смысл, потому что от одного оформления у меня кровь из глаз пошла


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

S>>2. Если, по вашему мнению, код "максимально ужасен", то что могло бы его "исправить" (опять же по вашему мнению)?


M>Для начала — нормально оформить


Не постесняюсь спросить: а вы что, большую часть времени только с собственным кодом работаете? В чужой вообще не заглядываете?
Мне приходилось видеть и использовать разные стили оформления, так что на внешний вид, по большей части, пофиг, если только аффтары не злоупотребляют строками по 150+ символов длинной и функциями по 100+ строк.

S>>3. Могли бы вы, для симметрии, привести фрагмент своего кода с кастами, дабы проиллюстрировать как должен выглядеть нормально написанный вами код?


M>ЗЫ, хотя, вот, лови:

M>#include <iostream>
M>#include <iomanip>
M>#include <fstream>
...
M>#include <random>

Список инклюдов доставляет. Неприятный такой звоночек.

M>int main( int argc, char* argv[] )

M>{
M> UMBA_USED(argc);
M> UMBA_USED(argv);

Выглядит так, как будто вы 30 лет назад программировать учились. Я про UBMA_USED для аргументов функции, на которые забили.

M> if (w32.size()>10)

M> {
M> auto mid = w32.size()/2;
M> std::shuffle(w32.begin()+ (std::ptrdiff_t)1u, w32.begin()+(std::ptrdiff_t)mid, g);
M> std::shuffle(w32.begin()+(std::ptrdiff_t)mid, w32.end() -(std::ptrdiff_t)2u , g);
M> }
M> else
M> {
M> std::shuffle(w32.begin()+(std::ptrdiff_t)1, w32.end()-(std::ptrdiff_t)2, g);
M> }

Я, наверное, чего-то глобально не понимаю, но зачем это все?

Вот, по мотивам вашего кода минималистичный пример:
#include <algorithm>
#include <string>
#include <vector>
#include <random>

int main()
{
    std::mt19937 g{ std::random_device{}() };

    std::vector< std::string > words;

    for( auto & w : words )
    {
        auto w32 = w;
        if( w32.size() > 10u )
        {
            const auto mid = static_cast<std::ptrdiff_t>( w32.size() / 2 );
            std::shuffle( w32.begin() + 1, w32.begin() + mid, g );
            std::shuffle( w32.begin() + mid, w32.end() - 2, g );
        }
    }
}


Компилируем:
tmp\rsdn_cpp_20230729>cl -EHsc -WX -Wall -std:c++17 t1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.36.32532 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

t1.cpp
Microsoft (R) Incremental Linker Version 14.36.32532.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:t1.exe
t1.obj

Все. Никакого обилия кастов, не говоря уже про Си-шные касты.

Такое ощущение, что вы даже не дали себе труда подумать о том, что происходит. Вы явно используете литерал беззнакового типа, но вам-то нужен знаковый std::ptrdiff_t, поэтому вы недолго думая херачите Си-шный каст и получаете угребищный (std::ptrdiff_t)1u там, где достаточно всего лишь обычной единички.