Задать вопрос
  • Как убрать кавычки при перетаскивании файла в консоль?

    Zoominger
    @Zoominger
    System Integrator
    Никак. Это штатное поведение системы, чтобы избежать ошибки, если в пути есть пробелы, иначе консольные (и не только) приложения могут вести себя непредсказуемо.
    Ответ написан
    1 комментарий
  • Насколько мой код читабелен?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    С ходу же:
    try
    {
        if (from > to)
            throw "Incorrect couple 'from - to' for generating random numbers";
    }
    catch (const char *message)
    {
        std::cerr << message << '\n';
        exit(1);
    }
    Зачем нужен такой изврат, если вы ловите исключение сразу же? Чем хуже
    if (from > to)
    {
        std::cerr << message << '\n';
        exit(1);
    }


    bool init(IntList1D &list, int number)
    {
        if (list == nullptr || *list == nullptr)
        {
            if (list == nullptr)
                list = new IntList1D_element *;
            *list = new IntList1D_element(number);
            return true;
        }
        return false;
    }
    Чем меньше глубина вложенности, тем лучше. Ранний выход из функции лучше, чем выход в самом конце. Сравните
    bool init(IntList1D &list, int number)
    {
        if (is_initialized(list))
        {
            return false;  
        }
        if (list == nullptr)
        {
            list = new IntList1D_element *;
        }
        *list = new IntList1D_element(number);
        return true;
    }


    bool is_inited(const IntList1D list)
    {
        if (list == nullptr || *list == nullptr)
            return false;
        else
            return true;
    }
    Здесь и название функции кривоватое и чересчур усложнена сама функция.
    bool is_initialized(const IntList1D list)
    {
        return (list != nullptr && *list != nullptr)
    }

    Не соблюдаете единый стайлгайд. В некоторых местах одиночные строки после if взяты в фигурные скобки, в некоторых нет. Выберите один какой-либо стиль и придерживайтесь его. (Hint: добавлять строки гораздо проще, если всегда используются фигурные скобки).
    Ответ написан
    7 комментариев
  • Насколько мой код читабелен?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Еще комментарии. Это же С++, а не С?

    Вместо набора функций, которые возвращают и принимают IntList1D, стоит завести класс, который содержит в себе указатель на начало списка. У этого класса должны быть методы initalize, is_initialized, pushBack, и т.д. Это сократит код немного и сделает его гораздо более логичным.

    Тип элемента списка вы объявляете как приватный класс-член в классе списка, и он не будет засорять пространство имен пользователей вашей библиотеки. Им о нем вообще знать не надо, они хотят в ваш список класть int и получать назад int.

    Далее, вы пишите контейнер, в идеале его стоит сделать по образу и подобию стандартных контейнеров. С итераторами и т.д. Чтобы с ними было можно работать точно также. Но, если не потянете, то хоть обзовите методы также, как у стандартных (push_back(), empty(), см std::vector, например).

    Стек и очередь могут или наследоваться от списка, или (так наверное понятнее будет) держать внутри себя экземпляр списка.

    Потом, часть функций называется частично большими буквами, частично строчными. Это вообще зачем? APPEND_FRONT_Link? Соблюдайте единый стиль хотябы в одном названии. Если они отличаются от appendFront тем, что они не предназначены для пользователей библиотек, ну так это как раз аргумент в пользу использования классов. Делаете эту функцию приватным методом. И такие обычно называются с суффиксом Impl (от implementation) - appendFrontImpl.

    И вообще чисто большими буквами обычно обзывают макросы, ну или константы на худой конец. Возьмите за основу какой-то стандартный стиль и предерживайтесь его.
    Ответ написан
    Комментировать
  • Насколько мой код читабелен?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Это все конечно очень хорошо, но в репе лежат симлинки вместо файлов. Так что пока оценка -10/10 - достигнут предельный радиус кривизны рук.
    Ответ написан
    3 комментария
  • Можно ли восстановить данные с SSD?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Можно ли восстановить данные с SSD?

    Да, но не самостоятельно.
    Как SATAFIRM 11 отображаются SSD построенные на основе контроллера Phison PS311. Это происходит из-за того, что у диска повреждена микропрограмма.

    Также возможен ремонт таких дисков посредством запуска Preformat (часто с уменьшением объёма), но это как достаточно неразумное занятие в целом (накопитель снова подведёт), так и противопоказанное вам - при ремонте содержимое теряется безвозвратно.

    Восстановить данные с такого ССД возможно, для этого надо загрузить лоадер, который загрузит диск в технологическом режиме. В нём можно создать "сырой" образ памяти, представляющий собой кашу из данных без трансляции. Транслятор в таком случае строится виртуально и используется при чтении.

    За всем этим нужно обращаться к специалисту с оборудованием и опытом. Если вы в Москве, будем рады помочь, контакты есть у меня в профиле.
    Если нет и пересылка не подходит, то выбирайте специализирующуюся на восстановлении данных компанию поблизости.

    GoodRam CX400

    Отдельно добавлю, что сильно откладывать не стоит. В подобных SSD используется память далеко не самого высокого качества. Через полтора-два месяца без нормального использования диска заряд в её ячейках может начать утекать, после чего все файлы начнут сильнее и сильнее покрываться "дырками". Так что оптимальным вариантом будет заняться этим вопросом в ближайшие недели, максимум - месяц.

    - P.S. -
    Не сообразил добавить это сразу, но ваш ССД - уже третий на Тостере с такой проблемой за последние 10 дней :-/
    Ответ написан
    5 комментариев
  • Почему не вызывается конструктор класса?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Вы как-то неправильно понимаете C++.
    У вас написано:

    Queue()
    {
    head = NULL;
    tail = NULL;
    len = 0;
    head->info.set_number(0);
    }


    head = НИКУДА
    НИКУДА -> info.set_number(0);

    Естественно, что обращение в НИКУДА ведет неопределенному поведению программы, которое выражается в падении.
    Ответ написан
    Комментировать
  • Что значит эта ошибка?

    Adamos
    @Adamos
    Есть такое старое мудрое правило: если переменных больше трех, их нужно называть осмысленно, потому что человек за ними уследить уже не способен. И получается вот такая хрень:
    for (int k = 0; k < 10; k++) {
            for (int a = 0; a < 10; a++) {
              for (int b = 0; b < 10; b++) {
                for (int r = 0; r < 10; r++) {
                  for (int p = 0; p < 10; p++) {
                    for (int s = 0; s < 10; s++) {
                      for (int k = 0; k < 10; k++) {
    Ответ написан
    6 комментариев
  • В чём ошибка кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!((ceil(y)) % 2 && ...

    Поставьте скобки вокруг ... % 2

    Приоритет операций такой, что сначала вычислится 2 && ... и потом вы на этот bool попытаетесь поделить с остатком.

    И вообще, ваш код невозможно читать. Слишком много скобок. Во-первых, введите 4 переменные и посчитайте в них floor/ceil от x/y. Удалите очевидно лишние скобки.

    Потом вместо !(a%2) лучше писать (a % 2 == 0), а то с вашим количеством скобок вообще непонятно, к чему ! относится.
    Ответ написан
    5 комментариев
  • Почему char - 1 байт, а символьный литерал ('A') - 4?

    @Mercury13
    Программист на «си с крестами» и не только
    А теперь скажу правильный ответ.
    В Си символьный литерал имеет тип int и потому его sizeof 4 байта.
    В Си++ у него тип char и 1 байт. Потому те, кто создавал CPP-файл, проблемы не видели. Очевидно, связано с перегрузкой функций: как-то не хочется, чтобы в foo('A') вызывалась версия для int.
    #include <stdio.h>
    
    int main()
    {
        int sz = sizeof('A');  // латинское
        printf("sz = %d\n", sz);
        return 0;
    }

    Си: 4
    Си++: 1

    При написании char test='A' на стеке будет 1 байт (+выравнивание). Здесь Си, грубо говоря, проводит преобразование типа — прямо при компиляции. Если написать char test=L'Й', сообщит, что преобразование при компиляции ushort→char обрежет результат с 1049 до 25.
    Ответ написан
    Комментировать
  • Как пeредать const char* в c++ фунцию из c#?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Ответ написан
    Комментировать
  • Почему максимальный размер объекта std::string равен 4611686018427387897?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот просто создатели библиотеки захардкодили именно это число.
    Эта конструкция возвращает разные значения, в зависимости от компилятора, разрядности, опреационной системы.

    Это 2^62-7. Почему 2^62? Может, в силу каких-то причин в вашей системе нельзя адресовать больше 62 бит. Может, система 2 бита для чего-то использует. Почему -7? Надо еще где-то хранить длину, надо оставить место для нулевого символа в конце и надо оставить нетронутым индекс std::string::npos - это значение используется для обозначения "несуществующего индекса". Конкретное значение зависит от того, что там программисты стандартной библиотеки сделали.

    В любом случае, это значение на много-много порядков больше любой практически возможной длины строки. Ну не сможете вы выделить 4 экзобайта памяти.
    Ответ написан
    Комментировать
  • Нужно понять что значит код и что выведется на экран?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Запустите и посмотрите: https://www.onlinegdb.com/online_c++_compiler. Попробуйте поменять по одному символу и смотреть, что происходит с выводом. Так вы поймете, что именно выводится, а потом чуть чуть знания C и вы поймете, почему так происходит.
    Ответ написан
    4 комментария
  • Почему программа может использовать больше динамической памяти, чем выделил `malloc()`?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что C не контролирует использование памяти программой. Любой контроль на совести разработчика.
    Ответ написан
    5 комментариев
  • Как использовать одно состояние переменных заголовочного файла в нескольких исходных файлах программы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я так понял, проблема именно с глобальными переменными?

    В хедере объявляете переменную как extern, в одном c файле определяете ее с инициализацией без extern - тогда все работает.
    Ответ написан
    Комментировать
  • Как располагаются в памяти элементы массива обьектов класса?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Объекты в C++ имеют постоянный размер, известный на этапе компиляции и равный sizeof(экземпляр)

    Утверждение:
    объект класса может содержать и вектор ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.

    неверно, так как вектор хранит свои данные не в своем экземпляре, а туда, куда их засунет аллокатор (обычно засовывает на кучу).

    Утверждение:
    [объект класса] и шаблонным может быть ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.

    неверно, так как все шаблоны конкретизируются на этапе компиляции.

    Следовательно, объекты класса сидят в массиве друг за дружкой, имеют фиксированный размер, и по ним можно ползать указателем, сдвигая его на этот размер.
    Ответ написан
    Комментировать
  • Как вынести определение конструктора шаблонного класса(вариативного) вне него?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо так:
    template<typename ...Args>
    UniformBuffer<Args...>::UniformBuffer(Args... arg)
    { 
    //код
    }


    У вас шаблоном является сам класс, а не его методы.
    Ответ написан
    2 комментария
  • Как применять высшую математику?

    @12rbah
    Как применять высшую математику?

    Если вы хотите использовать математику для создания/редактирования движков
    вам стоит посмотреть эту книгу "Джейсон Грегори: Игровой движок. Программирование и внутреннее устройство"
    Ответ написан
    1 комментарий
  • Как удалить свои комментарии на хабре?

    pragmatik
    @pragmatik Куратор тега Хабр
    Комментарии не нарушающие правила сайта могут быть удалены только вместе с учетной записью. Такой подход призван мотивировать пользователей думать перед тем, как что-либо написать.
    Ответ написан
    1 комментарий
  • Как вызвать функцию в зависимости от полученного числа, без использования условных операторов?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Засунуть адреса функций в массив, выбирать функцию по индексу.

    С синтаксисом предлагаю разобраться самостоятельно.
    Ответ написан
    4 комментария
  • Где то слышал что префиксный инкремент работает быстрее чем постфиксный. Это так?

    @res2001
    Developer, ex-admin
    Не замерял скорость. И даже не смотрел в дизасемблере реализацию.
    Но предлагаю просто разложить обе операции на примитивные ассемблерные инструкции (где нет инкремента, данные хранятся в памяти, а считаются в регистрах). Примерно так будет в псевдокоде:
    int preinc(int i) {
      mov r1, [i];
      add r1, 1;
      mov [i], r1;
      return r1;
    }
    int postinc(int i) {
      mov r1, [i];
      mov r2, r1;
      add r2, 1;
      mov [i], r2;
      return r1;
    }

    Видно, что у постфиксного варианта на одну операцию больше, чем у префиксного. А так же постфиксный использует 2 регистра, тогда как префиксный 1.
    Логика работы префиксного проще и понятней. Так что используйте по умолчанию всегда префиксный. И только тогда когда действительно необходимо постфиксный.

    А теперь представьте, что операция производится не надо встроенным типом, а надо классом. В этом случае дополнительные затраты могут быть гораздо существенней.
    Ответ написан
    2 комментария