Задать вопрос
  • Регулярное выражение dd.mm.yyyy на С?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Максимально упрощённый пример с использованием библиотеки PCRE
    #include <stdio.h>
    #include <string.h>
    #include <pcre.h>
    
    #define DATE_SIZE 11
    
    int main(int argc, char* argv[]) {
      pcre *pattern;
      const char *error_str;
      int error_offset;
      int matches[1];
    
      pattern = pcre_compile("^\\d{2}\\.\\d{2}\\.\\d{4}$", 0, &error_str, &error_offset, NULL);
    
      if(pattern == NULL) {
        printf("Could not compile: %s\n", error_str);
        return 1;
      }
    
      char str[DATE_SIZE];
      fgets(str, DATE_SIZE, stdin);
    
      int r = pcre_exec(pattern, NULL, str,  strlen(str), 0, 0, matches, 1);
    
      pcre_free(pattern);
    
      if (r < 0)
        puts("Invalid date");
      else
        puts("Valid date");
    
      return EXIT_SUCCESS;
    }
    Ответ написан
    Комментировать
  • Зачем и когда нужно использовать указатели в C++?

    RabraBabr
    @RabraBabr
    Ну что же. попробуем в указатели.
    Когда то давно, когда деревья были высокими, а трава сочнее и зеленее, на одной красивой планете - да можно было и без указателей. Автоматические переменные неплохо работали в стеке (ага иди гугли про стек и какой он маленький и про знаменитый его оверфлоу). В общем ответь на вопрос, много ли этого стека? Стало все не так романтично, объемы данных росли программы усложнялись , а программист ручками в куче (ага гугли про кучу) с помощью malloc'а выделял память. А что бы он знал где он выделяет память нужны указатели (ну как адрес квартиры - где проживают переменные Ивановы?). вот указатели в общем этот адрес и хранят. Только выяснилось, что программист плохо ручками память выделяет. Например в 20 метровую однушку он может захотеть поселить табор из 300 закарпатских цыган. И согласись получится неприятность.

    Вот в c++ память выделяется new и delete - это операторы такие. Сами посчитают сколько цыган куда и адресок вернут, а когда надо всех ненужных выселят. Только лучше и веселее не стало, память всегда течет, а указатели всегда висят. А где там в какой квартире Ивановы, а где Петровы вообще не понять И куда тот табор делся? А может и не делся.

    Оппа у нас же в c++ парадигма ООП и классы (гуглим классы). А в классах всегда конструктор и деструктор (гуглим), и они вызываются автоматически когда объект (экземпляр класса) создается и когда уничтожается. Так может new положим в конструктор, а delete в деструктор? И назовем все это хозяйство std::auto_ptr. И пусть он сам за памятью следит, а программиста будем бить по рукам за ручное выделение памяти

    Беда, печаль однако. Лучше жить не стало. и виной тому конструктор копирования (вот опять гуглим). Тогда придумали семантику перемещения r-value ссылки и кучу новых умных указателей вот просвещайся https://ru.cppreference.com/w/cpp/memory
    Если пройдешь по ссылке то увидишь много новых и интересных слов например аллокаторы или неинициализированные хранилища.

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

    @lil_Toady
    Автор заметил что вывод разный, то что он сам направил вывод в файл он в курсе :)

    Узнать пишем ли мы в терминал можно так:
    isatty(fileno(stdout));

    istty находится в io.h, а fileno в stdio.h

    И ls, действительно смотрит если вывод в терминал - то в одну строку, иначе - в несколько:
    https://github.com/coreutils/coreutils/blob/master...
    Ответ написан
    Комментировать
  • Где найти такие книги по ИБ, которые я хочу?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    Рыдаль...

    Может, как говорит в таких случаях Рональд Макдональд - перейти в службу доставки? Доспех, даже самый крутой, не делает пейзанина рыцарем. Дистрибутив Kali не сделает чайника хакером.

    В технологии поиска уязвимостей ничего принципиального не изменилось со времен Кевина Митника. И главное оружие здесь - моск.

    Сначала поисковиками пользоваться научитесь, искать необходимую информацию. 75% работы ИБ-шника - это поиск чего-то где-то по каким-то критериям. С чего Вы решили, что за Вас будет кто-то работать?
    Ответ написан
  • Площадка, где ищут разработчиков, готовых работать за еду?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Добро пожаловать: https://bugreports.qt.io/ . У нас куча багов и фич, за которые вам не будут платить :)
    Ответ написан
    Комментировать
  • Где хранится размер памяти, которая выделена указателю?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Начнем вот с этого: CppCon 2015: Andrei Alexandrescu “std::allocator I...

    На самом низком уровне память выделяется страницами или блоками. Принцип выделения зависит от особенностей организации ОС и самого железа. Освобождается память в точном соответствии с тем, как она была выделена.
    И обычный пользователь C++ этого ничего не видит.

    Оператор ::new является точкой обращения к аллокатору памяти процесса. К какому именно аллокатору идет обращение - как правило неизвестно. Это может быть dlmalloc, mimalloc или jemalloc. Их много и перечислять можно долго. Это может быть и самостоятельно созданный по мотивам доклада Александреску аллокатор.
    Каждый аллокатор, маркируя память как выделенную и передавая ее пользователю, каким-либо образом оформляет сервисную информацию о выделенном участке. Сервисная информация может храниться в заголовке, в памяти прямо перед отдаваемым пользователю адресом, может храниться в хвосте передаваемого пользователю участка памяти, а может храниться в совершенно отдельном пространстве памяти - в сервисном разделе.

    К чему это все. К тому что полностью точного ответа на твой вопрос дать не получится. Если бы в вопросе фигурировал конкретный аллокатор, то ответить можно было бы. Сейчас же ответить можно только что размер переданного пользователю блока памяти хранится в специальной сервисной информации, к которой и обращается функция освобождения памяти (не ::delete).
    Ответ написан
    1 комментарий
  • Как вывести string в label?

    Zoominger
    @Zoominger
    System Integrator
    Юзайте QString, а не сишные строки, зачем вы вообще в stdString конвертите?
    Ответ написан
    Комментировать
  • Как число с плавающей точкой преобразовать в half float в 16 формат?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как можно уместить 1.7754 в 3f 1a?

    0x3f 0x1a -- это знак == 0, порядок == 0xf, мантисса == 0x31a. Нормализованное значение мантиссы == 1 + 0x31a / 1024 = 1.7754. Порядок 0xf после вычитания bias == 15 превращается в 0, что соответствует множителю 1. Всё.

    Как число с плавающей точкой преобразовать в half float в 16 формат

    Примерно так:
    0) обработать специальные случаи (например 0 представляется как 0).
    1) взять модуль, запомнить знак исходного числа.
    2) нормализовать, т.е выделить множитель вида 2^N, чтобы осталась нормализованная мантисса в диапазоне [1, 2). К N прибавить 15 -- это значение порядка.
    3) отнять 1 от нормализованной мантиссы, результат умножить на 1024 -- это значение мантиссы float16.
    4) сдвинуть значение порядка влево на 10, сделать побитовое или с мантиссой float16, установить старший бит, если число было отрицательным.

    Для -3.4805 получаем:
    3.4805 = 2^1 * 1.7402 ; N = 1, M = 1024 * 0.7402 = 0x2f6 ;
    0x8000 | ((1 + 15) << 10) | 0x2f6 = 0x8000 | 0x4000 | 0x2f6 = 0xc2f6
    Ответ написан
    1 комментарий
  • Сначала С, а потом С++?

    myjcom
    @myjcom Куратор тега C++
    Вопрос довольно короток. Есть ли смысл изучать сначала С, а потом С++?

    Ответ тоже довольно короток.
    Чем лучше программист знает С, тем труднее будет для него при программировании на С++ отойти от
    стиля программирования на С.

    Для изучения С++ не обязательно знать С. Программирование на С способствует усвоению приемов и
    даже трюков, которые при программировании на С++ становятся просто ненужными.

    Бьерн Страуструп. Язык программирования С++.

    Нотабене

    Тем не менее, хорошие программы на языке С по сути являются
    программами на С++. Например, все программы из классического описания С (K&R) являются
    программами на С++. В процессе изучения С++ будет полезен опыт работы с любым языком со
    статическими типами.

    Ответ написан
    1 комментарий
  • Вопросы про язык Си?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    1. Массив целых чисел
    2. Массив целых чисел
    3. Массив целых чисел
    4. Массив целых чисел (если пятёрки всё-таки запятой отделены, а не точкой)
    5. Целое число

    Уверен, это есть в любом учебнике.
    Ответ написан
    Комментировать
  • Реальные задачи по программированию?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    когда ты даже понятия не имеешь, что будешь делать в свой первый рабочий день в качестве программиста

    5cf3dead2c58f367198538.png
    Может кто предложит хотя бы приближенные к реале задачи?

    Напишите web-сервер и браузер.
    Ответ написан
    Комментировать
  • Реальные задачи по программированию?

    opium
    @opium
    Просто люблю качественно работать
    Напишите программу для себя, та которая вам нужна
    Ответ написан
    Комментировать
  • Как создать указатель на функцию main?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int main(void)
    {
        int (*pmain)(void) = main;
    }


    например int* func;

    Это указатель на int, а не на функцию.
    Ответ написан
    Комментировать
  • Как правильно закрыть окно?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Как-то так
    #include <QApplication>
    #include <QMessageBox>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QMainWindow mainWindow;
    
        auto res = QMessageBox::question(&mainWindow, QMainWindow::tr("Just in case"),
                                         QMainWindow::tr("Are you sure?"));
        if (res == QMessageBox::Yes) {
            mainWindow.show();
            return a.exec();
        } else {
            return -1;
        }
    }

    Смысл в том, что у вас первое окно -- это модальный диалог (наследник QDialog, допустим). У него есть метод exec обычно, который возвращает результат (например согласился пользователь или нет). На основании результата и решайте, что делать дальше: показать окно или выйти из программы.
    Ответ написан
    Комментировать
  • Что почитать по C++?

    GavriKos
    @GavriKos
    Советую почитать выдачу поиска хотя бы по тостеру.
    Ответ написан
    Комментировать
  • Перегрузка функций с unsigned параметром и обычным?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Стандартом определены правила вывода типа для числового литерала из самого литерала. Также в стандарте определен формат представления числового литерала.
    Согласно этим правилам и этому формату, 5 будет являться числовым литералом с типом int.
    Если бы ты написал 5u, то тип бы уже был unsigned int. А если бы ты написал 5lu, то тип бы уже был unsigned long int.
    Ответ написан
    Комментировать
  • Как вывести элементы матрицы, которые находятся ниже главной диагонали?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int **matrix = (int**)malloc(matrix_size * sizeof(int));

    Должно стать
    int **matrix = (int**)malloc(matrix_size * sizeof(int *));

    потому что ты выделяешь массив указателей, а не массив целых чисел, а sizeof(int) вполне может быть не равно sizeof(int *).

    for (int i = 0; i < matrix_size; ++i)
        {
            for (int j = 0; j < matrix_size; ++j)
            {
                if(i > j)
                {
                    arr[i] = matrix[i][j];
                }
            }
        }


    Должно стать
    counter = 0;
        for (int i = 0; i < matrix_size; ++i)
        {
            for (int j = 0; j < matrix_size; ++j)
            {
                if(i > j)
                {
                    arr[counter++] = matrix[i][j];
                }
            }
        }


    потому что иначе все элементы находящиеся в одной строке matrix ты складываешь в один и тот же элемент массива arr.
    Ответ написан
    Комментировать
  • Как получить дробное число при делении 1 на 1?

    myjcom
    @myjcom Куратор тега C++
    Смотря что нужно.
    #include <iostream>
    #include <iomanip>
    #include <cstdlib>
    
    int main()
    {
      int a = 9;
      int b = 4;
      std::div_t result = div(a, b);
      std::cout << result.quot << " " << result.rem << std::endl;
      // Наверное это
      std::cout.precision(1);
      std::cout << std::fixed << static_cast<double>(a) / b << std::endl;
    }
    Ответ написан
    Комментировать
  • Как исправить ошибку в коде c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Замени head = malloc(sizeof(struct Node)) на head = new Node.
    Потому что malloc тебе конструктор std::string внутри data_list не вызовет.
    И не вставляй код картинками.
    Ответ написан
    Комментировать