• C# Как создать структуру с полем типа массив?

    petermzg
    @petermzg
    Самый лучший программист
    [StructLayout(LayoutKind.Sequential)]
            public unsafe struct PLUGININFO
            {              
                public fixed byte name[101];      
                public fixed byte describe[201];
                public short version;
    
                // либо
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 101)]
                public string name;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 201)]
                public string describe;
    
                public short version;
            }
    Ответ написан
    1 комментарий
  • Как изменить тип параметра в унаследованном методе C#?

    Nipheris
    @Nipheris Куратор тега C#
    То, что вы просите, невозможно сделать по одной простой причине. Наследование в .NET бывает только "настоящее", т.е. когда устанавливается отношение is-a. Ваш MyTCPStream не может быть Stream-ом, если не реализует метод Read (Byte[], Int32, Int32). Спросите себя - что произойдёт, если я скастю объект MyTCPStream к Stream, и попытаюсь вызвать Read(Byte[]...)?

    Вы конечно можете в теле метода бросить InvalidOperationException, но это однозначно признак неверно выбранной абстракции. Лично я не понимаю, зачем вам мог понадобиться TCPStream, из которого вы читаете не байты, а символы.

    Для реализации процесса чтения более сложных объектов (а символ это более сложная штука, т.к. его представление в потоке зависит от кодировки) в дотнете есть TextReader и его наследники. Было бы хорошо, если б вы описали изначальную задачу - возможно мы посоветуем вам что-то полезное, а не странные хаки.
    Ответ написан
    3 комментария
  • C++. Отношения наследования в ООП. Что чему соответствует?

    MrNexeon
    @MrNexeon
    1. is-a - наследование

    class Car : public Vehicle {
     // автомобиль является транспортом
    };

    2. has-a - отношение типа "композиция"

    class Car {
     Engine v8; // автомобиль имеет (содержит) двигатель
    };

    3. uses-a - отношение типа "агрегация"

    class Driver {
     Car* myCar; // водитель использует автомобиль
    };

    4. is-like-a

    class Square : public Figure;
    class Rectangle : public Figure;
    // квадрат и прямоугольник похожи по свойствам, но это разные фигуры


    5. is-implemented-as-a

    class Engine { // абстракция
    public:
     virtual void start() = 0;
    protected:
     float power;
    };
    
    class V8 : public Engine { // реализация
     virtual void start() {
      // wroom wroom
     }
    };
    
    // Двигатель ДВС реализован как 8-ми цилиндровый двигатель V-конфигурации
    Ответ написан
    Комментировать
  • Как лучше называть переменные и функции?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Самое главное правило - чтобы в данном контексте сразу было понятно, что означает переменная. Чем ближе к английскому, тем лучше (порядок слов сохранять). Есть всего пару основных правил:
    - главное слово в названии - это существительное или прилагательное
    - булевые могут иметь префикс is_... (но не isnot_...)
    - артикли не использовать

    Не нужно дублировать смысл, который и так понятен из контекста. Если у нас, скажем, метод parse_html(), то внутри него вместо html_nodes можно писать просто nodes.
    Ответ написан
    1 комментарий
  • Как писать много кода, оставляя его простым, как в начале?

    jamakasi666
    @jamakasi666
    Просто IT'шник.
    1) Документируй
    2) Абстрагируйся всегда максимально
    3) Пиши классы по принципу "черного ящика"
    4) Один класс решает одну конкретную задачу, не стоит городить комбайны.
    Ответ написан
    5 комментариев
  • Как писать много кода, оставляя его простым, как в начале?

    @karminski
    Senior React.JS Developer
    Я стараю придерживаться простого совета: один метод - одно действие. Т.е. каждый метод класса должен выполнять строго одну функцию. Число строк одного метода - не более 20.
    Ответ написан
    7 комментариев
  • Лямбда Callback из Pthread?

    @Skapix
    jew on 1/8
    1) стоит инициализировать Arg: Arg* arg = new Arg;
    Не забудьте удалить его в конце использования ( как понимаю в threadFunction).
    2) Используйте std::function<void()> вместо c-style функции, чтобы избежать лишних проблем с удалением лямбды.
    Ответ написан
    2 комментария
  • Как сделать авто обновление программы c++?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    "Как сделать, что при запуске программы, автоматом сравнивались версии без скачивания version.txt, и если версии не совпадают, выскакивает сообщение "Обновите программу, принужденно" при этом не давая дальше пользоваться ней, потом при нажатии на ок, что бы программа сама скачала Launcher.exe, и заменила место той старой, и потом запустилась."

    Добавить на сайт API для вывода актуальной версии в удобном формате.
    Добавить в запуск программы обращение к вашему сайту за новой версией.
    Добавить в запуск программы запрет на дальнейшее использование, если известно что есть новая версия.
    Добавить в программу сообщение "Обновите программу" с кнопкой OK, по которой будет скачиваться и запускаться Launcher.exe, который будет обновлять старую программу и запускать ее.

    Все просто.
    Ответ написан
    Комментировать
  • OpenMP проверка четности потока, как?

    15432
    @15432
    Системный программист ^_^
    1) ваши for (i = thread;i < threads;i += threads) ничего не делают и эквивалентны int i = thread;
    2) когда вы печатаете массив целиком, потоки могут печатать значения в произвольном порядке. выводите на печать номер треда, который печатает это значение

    3) не сразу заметил. переменные, описанные вне pragma omp - общие для всех потоков. в итоге переменная с номером потока оказывается перезаписанной другим потоком. и к моменту сравнения в переменной уже будет значение чужого потока.

    int main()
    {
      int thread;
      int table[8] = { 0 };
      omp_set_num_threads(8);
    #pragma omp parallel private(thread)//всё, что дальше в скобках - будет запущено в 8 потоках одновременно
      { //потоки могут получать управление в произвольном порядке
        thread = omp_get_thread_num(); //каждый поток получает свой номер
        if (thread%2 ==0)  //четные потоки записывают в табличку единицу
            table[thread] = 1;
    #pragma omp critical //критическая секция в один момент времени может выполняться только одним потоком
        {               //это необходимо, чтобы печать из разных потоков не перемешивалась
            std::cout << "Hello, I am thread no " << thread << std::endl;
            std::cout << "My table value is" << table[thread] << std::endl;
        }               //потоки проходят секцию также в произвольной очередности
      }
    }
    Ответ написан
    3 комментария
  • Почему неправильно считывается системное время?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    https://msdn.microsoft.com/en-us/library/1f4c8f33.aspx

    Все дело в том, что функция time() возвращает UTC метку времени. То есть, время по Гринвичу.
    Тебе надо сделать корректировку на свой часовой пояс для получения локального времени.

    Посмотри пример по этой ссылке:
    en.cppreference.com/w/cpp/chrono/c/gmtime
    Ответ написан
    Комментировать
  • Почему неправильно считывается системное время?

    alsopub
    @alsopub
    Разница, видимо, на часовой пояс.
    Посмотрите пример тут - all-ht.ru/inf/prog/c/func/gmtime.html
    Тут дополнительно применяется gmtime() для учета часового пояса.
    Ответ написан
    1 комментарий
  • Непонятный вывод на экран результатов нескольких последовательных ин(де)крементаций?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Постинкрмент (i++) отличается от преинкремента тем, что возвращает значение, которое было до инкремента, изменяя значение самой переменной. Это хорошо видно в примере на С++. Семантика в языках одинакова.

    Для перевода в восьмиричный вид можно воспользоваться методом Integer.toOctalString(int);
    Ответ написан
    3 комментария
  • Есть ли аналог str.charCodeAt(index) для С++?

    Adamos
    @Adamos
    "Для С++" - это слишком расплывчато.
    Если речь об однобайтных строках (char[], char* или std::string) - то str[idx] будет тем самым нужным вам значением.
    Но только в том случае, если содержимое в однобайтной же кодировке.
    А если там, скажем, utf-8 - то тут вы вряд ли обойдетесь без соответствующей библиотеки.
    Ответ написан
  • C++11, C++14. Использование auto - признак дурного тона?

    @Mace_UA
    Нет, это не признак дурного тона. Auto -- замечательная фича, позволяющая сделать код более читабельным. Но, как и практически любая хорошая фича C++, она может сделать вам только хуже, если применять её без надобности там, где она не нужна. Поэтому поддерживаю уже высказанное здесь мнение
    если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать.


    При объявлениях функций auto в качестве типа возвращаемого значения вы так просто не напишете. Это должны быть инлайн функции. Как правило, такая потребность может встретиться разве что при написании шаблонов, которые реализуются прямо в хедере и для методов в которых порой вывести тип возвращаемого значения без auto крайне тяжело. Если вы школьник и не так давно программируете, на ближайшее время вообще забудьте про такую возможность. Она вам не нужна. А для разработчиков всяких хитроумных шаблонных библиотек это может быть очень даже полезной фичей.

    И ещё один аргумент за использование auto при определении переменных. Большинство современных IDE нормально справляются с тем, чтобы сообщить вам тип переменной, когда вы просто наводите мышкой на её имя, даже если она объявлена как auto. Это во многих случаях смягчает негативные стороны использования auto, если таковые вообще имели место в данном куске кода.

    А для более "продвинутых" программистов рекомендую к прочтению вот эту статью Герба Саттера. Всё прекрасно разложил по полочкам насчёт использования auto и объяснил, почему это в большинстве случаев не так страшно, как некоторым кажется на первый взгляд. Конечно, предложенная в конце идиома "almost always auto" спорная, C++ это всё-таки не джаваскрипт. Но остальное написано очень разумно.
    Ответ написан
    Комментировать
  • C++11, C++14. Использование auto - признак дурного тона?

    Nipheris
    @Nipheris Куратор тега C++
    Такие дельные советы тут...

    А правило проще некуда: если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать. Пример, где использование auto отлично подходит - итераторы:
    std::list<int> items;
    auto i = items.cbegin();

    Во второй строке четко написано - items.cbegin - константный итератор по items, бегущий с начала списка. Мне этого более чем достаточно. Указание типа std::list<int>::const_iterator мне никакой новой информации не принесет. Тем более, т.к. итераторы от разных контейнеров несовместимы, то мне нужно еще и сразу знать, по какому конкретно списку у меня итератор - я опять-таки посмотрю на items.cbegin, а не на тип.

    А вот auto в объявлениях функций/методов и правда ни к чему. Его, кстати, даже не сразу там разрешили использовать (только в C++14). Причина тому вновь читабельность - чтобы понять, что возращает функция, нужно прочесть ее текст как минимум до первого return, а лучше - полностью. Единственный сценарий, где без auto не обойтись при указании возвращаемого типа - это стрелочная нотация с decltype, но я думаю вы не скоро с ней столкнетесь.
    Ответ написан
    Комментировать
  • В чем разница объявления (указатели и переменные)?

    @MiiNiPaa
    1) Создаётся одна переменная типа int в автоматической памяти с именем i. Значение i не определено.
    2) Синтаксическая ошибка, возможно вы имели в виду int* i;? В таком случае создаётся переменная типа int* в автоматической памяти с именем i. Значение i не определено.
    3) Синтаксическая ошибка, возможно вы имели в виду int* i = new int;? таком случае создаётся переменная типа int* в автоматической памяти с именем i. Затем создаётся переменная типа int в динамической памяти, и i присваивается адрес этой свежесозданной переменной.
    4) Синтаксическая ошибка. Понятия не имею что подразумевалось.
    Ответ написан
    Комментировать
  • Как читабильнее или правильнее писать тернарную операцию в return, если в двух случаях будут возвращены массивы?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    IMHO тернарный оператор полезен тогда, когда он пишется в одну строку.
    В противном случае проще, полезнее и нагляднее использовать обычный if.
    Ответ написан
    Комментировать