• Try-catch-throw. Как понять эту схему?

    @nirvimel
    Вы называете одним словом "ошибка" несколько совершенно различных вещей, не связанных между собой:
    1. Синтаксическая ошибка в исходном коде. "где в тип string вводится int и сообщается об ошибке" - это невозможно в принципе, так как ваш исходный код, в котором нарушено соответствие типов, не является валидной программой (все равно что оставить незакрытую скобку), компилятор не сможет скомпилировать из него никакой бинарный исполнимый файл просто потому, что видит бессмыслицу в таком исходнике.
    2. Исключительная ситуация (exception) во время выполнения. Она всегда предусмотрена кодером (этим она и отличается). Например я пишу функцию, которая должна делить одно число на другое, я предполагаю, что кто-то (типа меня же) может использовать эту функцию неправильно и передать ноль в качестве делителя. Я хочу, чтобы такому пользователю прилетел (по голове) exception, красноречиво сообщающий о том, что так делать не стоит. Для этого я пишу
      if (denominator == 0) { throw std::invalid_argument( "НЕ НАДО ТАК!" ); }
      . Теперь, если мне нужно выполнить какой-то кусок кода, в котором есть вызовы функций, из которых могут вылетать исключения, и я хочу как-то локализовать эту проблему и обезопасить от этого остальную программу, то я пишу
      try { divide(x, 0); } catch (const std::invalid_argument& e) { /* Я все понял, я так больше не буду. */ }
      .
    3. Undefined behavior - это результат не предусмотренной никем ситуации во время выполнения. Например, я заб(ы/и)л на то, что кто-то может передать ноль в мою функцию в качестве делителя и пишу int divide(int a, int b) { return a / b; }. И однажды это происходит, кто-то (да я же сам) передает туда ноль и... Что должно произойти в этой ситуации? Я не знаю, CPU не знает, компилятор об этом не позаботился, ОС тоже не знает, но на всякий случай она прихлопнет весь процесс целиком и (возможно) напишет в консоль что-то типа segmentation fault.
      А что, если я буду вызывать такую подозрительную функцию из блока try-catch? - Да ничего это не меняет. try-catch ловит только преднамеренно брошенные исключения в ситуации, когда возможность возникновения ошибки была предусмотрена кодером. try-catch ничем не может помочь против undefined behavior потому, что предусматривать возможные ошибки во время выполнения - это задача кодера, а не компилятора, который занимается только контролем соответствия типов и формальной корректности программы.


    Если вам не по душе концепция undefined behavior, то переходите на Java или .NET, там компиляторы сами добавляют все необходимые (и обходимые) проверки ценой снижения быстродействия вашей программы.
    Ответ написан
    3 комментария
  • Как воспринимает переменные С++?

    Как разные. Регистр символов учитывается.
    Ответ написан
    1 комментарий
  • Kак определить тип переменой в swift?

    @AntonGorb
    iOS Developer (Cherkassy)
    func setCookies() -> HTTPCookie? {
            let cookieProperties: [HTTPCookiePropertyKey : Any] = [HTTPCookiePropertyKey.name:   "PerfectCookie",
                                                                   HTTPCookiePropertyKey.value:  "Perfect is awesome",
                                                                   HTTPCookiePropertyKey.domain: "localhost",
                                                                   HTTPCookiePropertyKey.secure:  false]
            return  HTTPCookie(properties: cookieProperties)
        }
    Ответ написан
    Комментировать
  • Существуют ли правила подключения include-файлов в С++?

    15432
    @15432
    Системный программист ^_^
    Я в проектах делаю так:
    • в шапке .h файла #pragma once
    • в .h файле только описание класса - члены, методы, иногда структуры
    • инклюдим в .h другие .h только если этого требует описание класса
    • всё остальное необходимое для реализации инклюдим в .cpp
    Ответ написан
    3 комментария
  • Почему это моветон?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Алексей: Евгений Шатунов:
    Люди умеющие гуглить, но не понимающие, о чём речь, дают ответы! Каждый день на тостере!
    Они могут нагуглить статью, в которой говорится примерно о том же, о чём задан вопрос, но, увы, не вполне.
    И ни в статье, ни в ответах так и не появляется правильного ответа.
    А правильный ответ -- во второй, неочевидной части пункта стандарта, описывающего выражения (C89: 3.3:2, C99: 6.5:2):

    Between the previous and next sequence point an object shall have its stored value
    modified at most once by the evaluation of an expression. Furthermore, the prior value
    shall be read only to determine the value to be stored.


    Т.е. если объект модифицируется, то читать его можно с единственной целью -- для вычисления значения, которое будет в него записано. Код a[i] = i++; читает значение изменяемой переменной i с другой целью: доступ к элементу массива по индексу, результат которого не влияет на конечное значение i -- и этого достаточно, чтобы такой код попадал в категорию UB.
    Ответ написан
    7 комментариев
  • Сменить кодировку текста pdf

    PoCTo
    @PoCTo Автор вопроса
    Нашёл решение для моих случаев:
    gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER  -sOutputFile=output.pdf input.pdf

    После этого у output.pdf невероятным образом появляется верная кодировка.
    В Windows исполняемый файл должен называться gsw32c, gswin32c, или тоже gs.
    Ответ написан
    9 комментариев
  • Как вставить значение строки как аргумент функции?

    @Mercury13
    Программист на «си с крестами» и не только
    1. В строковой переменной или строковом буфере собрать тело команды, экранируя параметры, если это нужно.
    2. Если это обёрнутый string, преобразовать в const char* — и пошёл.
    std::string command;
    char data1 = 'F';
    char data2 = 'C';
    command = std::string("color ") + data1 + data2;
    system(command.c_str());
    Ответ написан
    1 комментарий
  • Особености функций malloc/calloc/new?

    @res2001
    Developer, ex-admin
    А вы документации не доверяете что ли?
    Забивает память нулями только calloc, о чем в доке написано.
    Проверено неоднократно.
    Чтоб проверить выделите массив intов, например побольше - несколько мегабайт, и ищите в нем не нулевые значения. Уверен, долго искать не придется.
    Ответ написан
    Комментировать
  • Где найти интересные задачи для изучения C++?

    longclaps
    @longclaps
    Q:
    Учусь читать по букварю. Практические упражнения там есть, но маловато. Хочется после каждой новой буквы ("о", "п", "р") прочесть 2-3 книги для закрепления материала, и не тривиальных, вроде "мама мыла раму", а что-то интересное, типа трёх мушкетёров. Есть ли такой ресурс?
    A:
    Нет.
    Ответ написан
    1 комментарий
  • Как UTF-8 помещается в char?

    TrueBers
    @TrueBers
    Гуглю за еду
    А никак не помещается.
    Потому что Си не поддерживает обработку строк в UTF-8. Для этого нужны сторонние библиотеки, которые умеют делать нормализацию, считать длину строки в абстрактных символах, а не кодпоинтах, и т. д. Поддержки этого всего у Си и C++ из коробки нет.
    Ну, вы можете, конечно, запихнуть UTF-8 поток в массив char'ов, но ни одна нативная функция для работы со строками не будет с ним работать правильно. Даже длину строки никогда не сможет посчитать.

    Поэтому, ответ прост: в C/C++ для работы с UTF8 используйте стороннюю библиотеку.
    И да, никогда не используйте wchar_t нигде, где не можете этого избежать, например, в апи сторонних библиотек. wchar_t это тупо костыль в дизайне языка, который признали даже создатели этих языков.
    Ответ написан
  • Работа с ДИНАМИЧЕСКИМ массивом структур,как?

    GavriKos
    @GavriKos
    Раз с++ в тегах - используйте std::vector.
    Ответ написан
    Комментировать
  • Есть ли разница между char* и char[число] при передаче аргументов функции?

    @alex-t
    Прогр. в команде rco.ru
    Проблема в том, что именно компилятор НЕ будет ругаться...
    Передавая (точно так же) массив ( process_array(array);) можно либо явно контролировать длину массива
    void process_array4 (char (&array)[4]) {
      for (int i = 0; i < 4; i++)
        array[i]++;
    }

    Либо написать функцию, которая скомпилируется с нужной длиной
    template <size_t N>
    void process_arrayN (char (&array)[N]) {
      for (int i = 0; i < N; i++)
        array[i]++;
    }
    Ответ написан
    Комментировать
  • Массив uint8_t [8] на переменную uint64_t?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    union {
      uint8_t  u8[8];
      uint64_t u64;
    } var;

    Или
    uint8_t var[8];
    *((uint64_t *)var);

    Или
    uint64_t var;
    ((uint_8 *)&var)[0];
    ((uint_8 *)&var)[7];
    Ответ написан
    5 комментариев
  • Как организовать работу с данными склада?

    MetaAbstract
    @MetaAbstract
    Архитектор информационных систем и баз данных. Ful
    1. составить бизнес-требования к системе
    2. написать ТЗ
    3. заказать проект системы

    А в целом возьмите 1С и не изобретайте велосипеды.
    Ответ написан
    2 комментария
  • Как на C++ узнать количество передаваемых аргументов?

    MrNexeon
    @MrNexeon
    Быстро и легко. Считаем с помощью вариативных шаблонов и оператора sizeof

    template <typename ... Args> int ArgsCount(Args ... args) {
        return sizeof...(args);
    }
    
    std::cout << ArgsCount(1, "hello", 2.f); // Вывод: 3
    Ответ написан
    Комментировать
  • Поиск одинаковых значений в 12 массивах. Как это сделать?

    maaGames
    @maaGames
    Погроммирую программы
    Если массивы можно модифицировать, то их следует отсортировать. После этого поиск становится тривиальным.
    Если отсортировать нельзя, то поиск тоже тривиален, но более долгий (для каждого значения в массиве придётся проверять все элементы всех остальных массивом).
    Ответ написан
    Комментировать
  • Пишут ли на Swift приложения, без использования Objective-C?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Сам я не разрабатываю ни для мака, ни на свифте, но вот тут пишут, что это вполне возможно, и делятся ссылками на туториалы.
    Ответ написан
    Комментировать
  • Как пропустить весь поток для того, чтобы можно было воспользоваться getchar()?

    @abcd0x00
    Запомни одно
    fflush(stdin);
    это полное фуфло от незнающих. В стандарте оно не определено, поэтому на разных компиляторах оно будет по-разному себя вести в итоге. В лучшем случае оно ничего не будет делать, в худшем - выдаст какой-нибудь мусор.

    Твоя проблема в том, что после ввода числа там сохраняется перевод строки (нажатый Enter) и вот его-то и надо прочитать.

    scanf("%d%*c", &a);

    А вообще, не надо использовать scanf() таким образом. Вместо этого надо сделать getline() на базе fgets() + sscanf() - и тогда всё будет работать точно.
    Ответ написан
    Комментировать
  • Как правильно очистить память при работе со стеком (ADT)?

    @Ariox41
    Рекомендую почитать про std::unique_ptr
    Вот вариант на c++11
    #include <memory>
    
    template<typename T>
    class Stack{
    public:
      Stack(std::size_t maxSize_): maxSize(maxSize_){}
    
      // Что происходит, когда стек пуст? Можно бросить исключение, или сделать как в std
      T pop(){
        // if (!tmp) throw ...
        auto tmp = std::move(head);
        // Обратите внимание, теперь head пуст
        head = std::move(tmp->next);
        // Теперь tmp->next пуст
        --size;
        return tmp->value;
      }
    
      bool push(T value){
        if (size+1 > maxSize)
          return false;
    
        // здесь может быть брошено исключение из-за нехватки памяти
        std::unique_ptr<Node> tmp(new Node(value));
    
        tmp->next = std::move(head);
        head = std::move(tmp);
        ++size;
        return true;
      }
    
    private:
      struct Node{
        T value;
        std::unique_ptr<Node> next = nullptr;
        Node(T value_) noexcept
          : value(value_)
        { }
      };
    
      std::unique_ptr<Node> head = nullptr;
      std::size_t maxSize;
      std::size_t size = 0;
    };
    Ответ написан
    Комментировать