• Почему не изменяются значения в Структуре?

    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 в одной странице, а окончание -- в другой?
    Ответ написан
  • Как вывести результат сложения в Nasm (MACOS, 64bit)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сделать так, чтобы оно выводило число?

    Перевести число в строковую форму и эту строковую форму выводить. Системный вызов write выводит байты как есть.
    "как"? -- например, в цикле беря остаток от деления на 10 (или какое ты хочешь основание системы счисления), прибавляя к остатку '0' (или 'a' - 10, если он 10 или больше) и записывая результат в буфер, начиная с конца. Типа того:
    mov rbx, 10
        mov rsi, str + 20
    l1:
        mov rdx, 0
        idiv rbx
        add dl, '0'
        mov byte [rsi], dl
        add rsi, -1
        test rax, rax
        jnz l1
    ; rsi + 1 указывает на начало строки
    ; длина строки -- str + 20 - rsi
    Ответ написан
    Комментировать
  • Как определить время выполнения адресации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Задача в такой постановке не имеет решения и скорее всего не имеет смысла.
    Попробуй для начала ответить, время чего именно ты хочешь замерить.
    Я подозреваю, что ты хочешь сравнить скорость выполнения конкретной программы написанной с использованием того или иного метода адресации. Если это так, то это понятная задача, но не стоит называть её "определением времени выполнения адресации". Для её решения можно воспользоваться счётчиком тактов если он есть в твоём процессоре. Если нет -- можно воспользоваться внешним таймером.
    Ответ написан
    6 комментариев
  • Как разобраться в конструкторах класса и инициализации переменных в ней, в чем различие?

    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
    scanf_s("%[^/n]s", b.book_name);
    printf_s("Enter the price and quantity\n"); // Не появляется далее это.

    Не появляется, потому что у тебя в предыдущей строке ерунда написана.
    Ответ написан
  • Как исправить передачу массива в поток?

    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
    char *grps[] = {""};
    Но получается так, что в grps храниться только первая gr, а последующие не записываются.

    Ты понимаешь, что у тебя в массиве grps -- один единственный элемент, и запись всех элементов после первого происходит мимо этого массива, куда-то на стек, портя другие данные?

    grps[k] = new char[8];
    ...
    String^ st = gcnew String("");

    А если твой вопрос не про С, то поправь теги.
    Ответ написан
    6 комментариев
  • На правильном ли я пути к удалению ненужных функций из памяти во время выполнения кода?

    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. Если иметь это в виду, то игры с указателями приобретают смысл.

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

    Пожалуйста, никогда так не делай.
    Ответ написан
    Комментировать
  • Как определить, что пойдет за mpls header в pcap пакете?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я смотрел и RFC, и IANA - везде расшифровываются только 0-15 значения для lable. При том, что label принимает значения от 0 до 1048575. И у меня в wireshark попадаются значения явно больше 15.

    Стоит прочитать описание MPLS, чтобы понять, что метки назначаются маршрутизаторами динамически, а 0-15 -- это зарезервированные значения.

    Так вот как определить, что считать после MPLS Header?

    Нет такой задачи. Если ты -- LSR, то ты принимаешь решение о маршрутизации на основании метки и информации полученной ранее от других маршрутизаторов через LDP.
    Ответ написан
  • Как узнать адрес сети для BGP протокола?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите, как в wireshark определить адрес сети и маску узла назначения?

    Посмотреть в RFC, понять, как связаны поля NLRI и атрибуты NEXT_HOP в сообщении UPDATE.
    Ответ написан
    3 комментария
  • Как отличить 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
    Как вывести массив данных?

    Перевести каждое число в строковое представление и вывести строки на экран.

    Есть код, который пока что только складывает

    А если посмотреть внимательно, то не только складывает, но и что-то переводит и что-то печатает.
    Ответ написан
  • Можно ли сделать коммит между старыми двумя коммитами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    могу я впихнуть например коммит D между коммитами А и B? чтобы получилось так:

    Можешь, с помощью git rebase. Сложность впихивания напрямую зависит от того, насколько много общих строчек изменяют D, B и C. Если они полностью независимы, git rebase сделает всё сам, если нет -- прийдётся разрешать конфликты.
    Ответ написан
    Комментировать
  • Задачка на фортране, где тут мб ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    s=0
        p=1
        do i=1, n
            p=p*((x**(2*i+1))/(4*(i**2)-1))
            s=s+p
        end do

    ошибка в вычислении p: во-первых не нужно умножать очередное значение на предыдущее, а во-вторых ряд в задании знакопеременный, а у тебя -- нет.
    Поправленный код.
    Ответ написан
    1 комментарий
  • Как добавить мнимую единицу на языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как добавить мнимую единицу?

    complex_t I = {0., 1.};
    Ответ написан
    Комментировать