Ответы пользователя по тегу C++
  • Почему не изменяются значения в Структуре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void CheckPressedKey(char** area, char** area_buf, int row, int col)
    {
      struct Ships ships;

    Структура ships -- автоматическая, существует на стеке только во время выполнения этой функции, создаётся (с неопределёнными значениями полей) при входе в неё и исчезает при выходе.
    Если ты хотел, чтобы она сохранялась между вызовами этой функции, нужно было добавить static: static struct Ships ships;. С этим изменением будет работать так как ты задумал, но наличие статических переменных в функциях -- не очень хорошая практика. Обычно лучшим решением является передача таких данных в функцию как параметра, например:
    void CheckPressedKey(char** area, char** area_buf, int row, int col, struct Ships *ships)
    Ответ написан
    1 комментарий
  • Не получается выводить символы в консоль с++. ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    printf("%c", 26);
    Вместо этой записи должно вывестись
    ->

    Кто сказал?
    ASCII код 26 не имеет однозначного графического представления.
    Ответ написан
    2 комментария
  • Как в gcc сохранять объектные файлы(в другой папке)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в gcc сохранять объектные файлы

    Опция -o -- путь к результату, препроцессирования/компиляции/линковки. Научи свой Makefile подставлять правильный путь в эту опцию.
    Ты скажешь "а у меня 100500 исходных файлов компилируется разом". Ответ -- а не надо так делать. Компилятор всё равно вызывается каждый раз новый. Напиши правило компилирующее один файл в нужный каталог -- и выполни его по разу для каждого исходника. Например так:
    NAME = calc
    
    SRC = main.c \
      parser.c \
      ft_lib/ft_atoi.c \
      ft_lib/ft_putchar.c \
      ft_lib/ft_putnbr.c
    
    BUILDDIR=build
    OBJ = $(addprefix $(BUILDDIR)/,$(subst /,_,$(patsubst %.c,%.o,$(SRC))))
    
    FLAGS = #-Wall -Wextra -Werror
    
    all: $(NAME)
    
    $(NAME): $(OBJ)
      gcc $(OBJ) -o $(NAME)
    
    define CC_RULE =
    $(BUILDDIR)/$(subst /,_,$(patsubst %c,%o,$(SOURCE))): $(SOURCE)
      gcc $(FLAGS) -c $< -o $@
    endef
    
    $(foreach SOURCE,$(SRC),$(eval $(call CC_RULE,$(SOURCE))))
    
    clean:
      rm -f $(OBJ)
    
    fclean:
      rm -f $(NAME)
    
    re: fclean all


    Смотри: я сделал список объектников из $(SRC), написал генератор CC_RULE, который для любого исходника генерирует правило компиляции его в объектник под $(BUILDDIR) и вызвал его для всех исходников в $(SRC).

    Это забавное развлечение, но гораздо практичнее воспользоваться существующей системой сборки: autotools/CMake/...
    Ответ написан
    4 комментария
  • Как поправить обработчик исключений?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Падает после окончания/записи char элемента на long long элементе..

    Ты бы показал, что твоя программа печатает когда падает. И заодно в фильтре адрес напечатал бы, а то непонятно, может у тебя начало long long в одной странице, а окончание -- в другой?
    Ответ написан
  • Как разобраться в конструкторах класса и инициализации переменных в ней, в чем различие?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли какая-то разница?

    Разница в том, что инициализация bool full = false; выполняется для любого конструктора, у которого поле full не перечислено в списке инициализации.
    Конечное состояние конструируемого объекта одинаково в обоих случаях.

    И почему так конструктор не работает:

    Потому что у класса Token отсутствует конструктор по умолчанию.
    Ответ написан
    5 комментариев
  • Как сделать корректный вывод измененной регуляркой строки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В вывод попадают просто звездочки, она должна менять на звезды ссыкли типа www.expamp.com, http(s)://example.com, и email ы.

    Ну так а что? Первые два класса эта регулярка меняет, в e-mail адресах последняя .+$ матчит строку до конца. Как написано -- так и работает.
    Ответ написан
    Комментировать
  • Как исправить передачу массива в поток?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int *array = new int[mSize];
    ...
    HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)a,&array,0,&tid);
    ...
    int a(int *array)

    В вызове CreateThread надо заменить &array на array, потому что переменная array -- не массив, а указатель.
    Ответ написан
    1 комментарий
  • На правильном ли я пути к удалению ненужных функций из памяти во время выполнения кода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    первый вопрос: можно и нужно ли после этого вызывать delete, чтобы передать очищенную память в пользование ОС?

    Если ты заглянешь в стандарт С++, в место определяющее оператор delete, то увидишь, что его можно вызывать только для памяти выделенной new. Поскольку память под код функций ты не выделял через new, то и delete вызывать нельзя.

    Что будет, если создать что-то вроде продвинутого singleton, который будет динамически выделять память для класса при запуске, а после выполнения функций можно будет вызвать функцию, которая просто сотрёт класс и отпустит память?

    В принципе это можно реализовать. Но приведённая реализация даже близко не делает того, что ты ожидаешь.
    Сначала может показаться, что она работает. Память, правда, возвращаться в ОС не будет. Потом ты может быть заметишь, что код тоже остаётся на месте. Потом ты может быть заметишь, что программа иногда падает из-за NULL-пойнтера в каком-то другом объекте. Короче, если ты сможешь это отладить, у тебя прибавится знаний в том, как всё устроено на уровне ассемблера. Если не сможешь, то твою программу ждут чудесные падения, а тебя -- не менее чудесные баг-репорты.
    Ответ написан
  • Доступ к приватным полям через арифметику указателей?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можете, пожалуйста, объяснить как точно все это устроено в памяти?

    Обычно это устроено так, что поля идут одно за другим в памяти. Но кроме размера у полей есть выравнивание. Например, uint32_t выравнивается на 4 байта, а uint64_t -- на 8. Поэтому между идущими подряд полями разного типа могут быть дырки.
    В приведённом примере double -- поле с наибольшим выравниванием, выравнивание объекта будет на 8, поле c будет по смещению 0 в объекте, поле d -- по смещению 8, а поле i -- по смещению 16. Если иметь это в виду, то игры с указателями приобретают смысл.

    Текст задания: все поля этого класса закрытые, ваша задача реализовать несколько функций, которые дают полный доступ к этим полям (см. шаблон кода), несмотря на то, что они закрытые.

    Пожалуйста, никогда так не делай.
    Ответ написан
    Комментировать
  • Как отличить tcp segment data от остальных данных в pcap пакете?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как можно отличить tcp segment data от bgp протокола,

    BGP передаётся внутри TCP соединения. Поэтому все данные проходящие по соединению -- это BGP. Но поскольку это TCP и данные передаются сегментами, размер которых не связан со структурой данных, в TCP сегментах могут быть как целые сообщения BGP, так и части. На картинке видны два сообщения BGP: одно целое, общей длиной 0xa1, с 0x17c по 0x21с, и начало следующего, общей длиной 0xa0, с 0x21d и до конца TCP-сегмента. В следующем TCP-сегменте, соответственно, будет продолжение этого сообщения.

    как узнать длину

    Посмотреть в определение протокола, увидеть поля marker и length, использовать их?
    Ответ написан
  • Как найти часто встречающиеся тексте последовательности?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С помощью чего можно решить эту задачу?

    С помощью массива std::hashmap<std::string, size_t>, по одному для последовательности каждой длины?
    Ответ написан
    3 комментария
  • Как изменять память процесса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    у меня не меняется значение в калькуляторе, то есть если у него становится 40, то у меня все равно остается на 20.

    Значит ты нашёл неправильный адрес. Try something else!
    Ответ написан
    3 комментария
  • Почему при смене цвета текста в printf цвет не меняется, а попадают символы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при первом запуске клиента,цвет меняется, запускаю второй клиент, у него уже просто символы

    Потому что это скорее всего две консоли с разными настройками терминалов. Интерпертация esc-кодов, их удаление из выводимого потока и смена цвета -- это функция терминала.
    Ответ написан
    Комментировать
  • Как работает наследование полей у шаблонного класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как работает наследование полей у шаблонного класса?

    Наследование работает так же как и у не-шаблонного класса, а поиск имён -- по-другому.

    Почему не получается неявно найти, что head и tail это поля базового класса?

    Потому что имена head и tail не являются именами, которые могут быть использованы в определении шаблона -- они не T, не являются зависимыми и не определены в видимых из определения шаблона неймспейсах.

    (соответственно, пофиксить можно не только написав myList<T>::head, но и this->head, оба эти изменения делают имя head зависимым [от параметра шаблона]).

    Это правило поиска имён отличается от правил поиска имён в обычных классах, которое включает в себя родительские классы.
    Ответ написан
    2 комментария
  • Как узнать, по какому адресу загружена библиотека и какой её размер в байтах, что бы можно было сделать memmove?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Да, я предполагаю, что это идиотизм какой-то, но всё же, как?

    Для этого надо как минимум разобраться, что библиотека представляет собой в памяти, и понять, что это детали не уровня "C++", а уровня "ОС".
    После этого можно посмотреть на то, как загружаются ELF (или PE, или что там в твоей ОС), что такое сегменты и что такое динамические релокации. После этого уже можно будет понять, что отдельно друг от друга сегменты библиотеки двигать нет смысла (потому что относительные ссылки между ними не помечены релокациями), а всё целиком имеет смысл двигать только если после перемещения обновлять места динамических релокаций.
    Ответ написан
    Комментировать
  • Неправильно разделяет слова?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert

    for (int i = 0; i < 255; i++)
          {
            if(f(buff[i]))

    лабуда со словом "материале"

    ты анализируешь строку побайтно, поэтому и лабуда. Анализируй посимвольно, с учётом кодировки, т.е. продвигайся вперёд не на один байт, а на 1 байт и все последующие байты со старшими битами равными 10:

    for (int i = 0; i < 255;)
          {  
            if(f(buff[i]))
            {
              ....
              i++;
            } else {
              do
                str += buff[i++];
              while ((buff[i] & 0xc0) == 0x80);
            }
          }
    Ответ написан
  • Почему при каждом выполнении программы постоянно разыне результаты шифрования DES3?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при каждом выполнении разные результаты.
    CBlocks getKeys(const std::string &key) {
        auto keys = explode_s(";", key);
        if (keys.size() < 3) {
            throw std::invalid_argument("size of keys has to be equal 3");
        }
    
        DES_cblock Key1;
        DES_cblock Key2;
        DES_cblock Key3;
        strncpy((char*) Key1, keys[0].c_str(), keys[0].size());
        strncpy((char*) Key2, keys[1].c_str(), keys[1].size());
        strncpy((char*) Key3, keys[2].c_str(), keys[2].size());
    
        return CBlocks(Key1, Key2, Key3);
    }

    так а чего удивительного, если ты неизвестно куда свои ключи в этой функции копируешь?
    Ответ написан
  • Как создать независимый процесс?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (a == 1) {
            CreateProcess(szFileName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
            WaitForSingleObject(pi.hProcess, INFINITE);
            ...
        }
        ...
        return 0;

    запускается новый процесс но если его закрыть то закрывается и родитель.

    Ну так ты ровно это и написал: родитель запускает процесс и ждёт его завершения, а после этого завершается сам. Хочешь другого поведения -- пиши другое поведение.
    Ответ написан
    3 комментария
  • Как прочитать заголовок PCAP пакета c/c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    IP адреса Source и Destination выводятся одинаковыми

    Из man inet_ntoa:

    The string is returned in a statically allocated buffer,
    which subsequent calls will overwrite.


    С вот таким изменением твой код у меня работает как ожидалось:
    printf("src address: %s ",  inet_ntoa(ip->ip_src));
    printf("dest address: %s\n",  inet_ntoa(ip->ip_dst));


    Подозреваю, что совсем левые IP могут лезть из не-IP кадров. Проверяй поле протокола в ethernet заголовке перед тем как начинать разбор IP-заголовка.
    Ответ написан
  • Почему "идентификатор не определён"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Потому что p, p1 и p2 -- локальные для блока if (flak == 0), и за его пределами не существуют.
    См.
    Ответ написан
    Комментировать