Ответы пользователя по тегу C++
  • "Нечитаемый" код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

    Этот цикл работает неправильно, потому что выход из него происходит по воле случая, в зависимости от мусора, оказавшегося перед строкой, на которую указывает pchar.

    for(; *pchar; ++length, ++pchar);

    Делать так (писать цикл с пустым телом и точкой с запятой на той же строке) не стоит, потому что легко не заметить эту точку с запятой или её отсутствие.

    for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

    Так делать (писать тело цикла в его поле для условия выхода, равно как и писать его в последнем поле) не стоит, потому что всему своё место, а ошибку в этом цикле ты уже допустил.
    Ответ написан
    7 комментариев
  • Как сравнить 2 введенных слова?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (strcmp(name1, name2) == 1)

    man strcmp
    The strcmp() and strncmp() functions return an integer less than,
           equal to, or greater than zero if s1 (or the first n bytes thereof)
           is found, respectively, to be less than, to match, or be greater than
           s2.

    Для проверки на равенство должно быть
    if (strcmp(name1.c_str(), name2.c_str()) == 0)
    Ответ написан
    2 комментария
  • Как управлять кэшем процессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть программа - она выполняет математические операции. ОЗУ занимает очень много. Больше 25 Гб. Но есть запас ОЗУ.
    Когда в кэш процессора данные подгрузились - операции выполняются быстро.

    Я тоже хочу кэш процессора больше 25ГБ, но в твоём случае кэш процессора точно ни при чём.

    Вопрос - что делать с кэшем?

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

    Если хочется застолбить массив в физической памяти -- смотреть на VirtualLock.
    Ответ написан
    5 комментариев
  • Почему компиляция кода заканчивается с ошибкой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хотя большинство этих пакетов установлено, они почему-то не определяются.

    Чтобы они определялись должны быть установлены соответствующие -dev пакеты (т.е., например, чтобы определялся libpcsclite должен быть установлен libpcsclite-dev).
    Ответ написан
  • Как увидеть входные параметры ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть исходный код на Си, который вызывает функцию на ассемблере, но передаваемые аргументы как получить,

    Гуглить словосочетание "имя целевой процессорной архитектуры" + ABI.
    Например: x86_64 abi, x86 abi, arm64 abi...
    В найденном документе искать раздел "parameter passing", "function calling" или с похожим по смыслу названием.
    Ответ написан
    2 комментария
  • Почему программа вылетает при попытке выделить память с помощью new?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Используй valgrind, он тебе покажет, где ты обращаешься мимо выделенной памяти или используешь неинициализированные переменные.
    Ответ написан
    1 комментарий
  • Массивы char в c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему выходит ошибка (error C2131) при использование в rev_list[n]?

    Потому что n -- не константа.
    Попробуй так, что ли:
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    
    using namespace std;
    
    int main() {
        char list[] = "asdf";
        const int n = sizeof(list);
        char rev_list[n];
        
        cout << rev_list;
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Как изменить вектор внутри map c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мне нужно обратиться к вектору по его ключу и изменить размер. Как мне это сделать?
    map<string, vector<string>> SOURCE;

    SOURCE["key"].resize(new_size);
    Ответ написан
  • Как писать makefile?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как бы Вы написали в makefile если бы у Вас имелось 0.c 1.c 2.c 3.h? Заголовочник 3.h для всех исходников


    OBJS := 0.o 1.o 2.o                     # список объектников, который нам понадобится в двух местах
    all: exe                                # традиционно сборка всего называется all. all зависит от единственного файла: exe
    exe: $(OBJS)                            # файл exe зависит от объектникоа
            $(CC) $(LDFLAGS) -o $@ $^       # чтобы собрать exe -- вызвать компилятор, передать ему LDFLAGS, выводить в $@ (т.е. в exe), на вход брать $^ (т.е. всё от чего зависит $@)
    %.o: %.c 3.h                            # объектники зависят от исходников с таким же именем, а так же от 3.h
            $(CC) -c $(CFLAGS) -o $@ $<     # чтобы собрать объектник -- вызвать компилятор с ключом -c, передать ему CFLAGS, выводить в $@ (т.е. в %.o), компилировать $< (т.е. %.с с тем же именем)
    clean:                                  # традиционно очистка всего называется clean
            -rm -f $(OBJS) exe              # для очистки удалить объектники и exe
    .PHONY: all clean                       # all и clean -- это не файлы
    Ответ написан
    1 комментарий
  • Почему при выводе блока с таблицой выбивает ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    struct tableI
    {
      char* name[4];
      float doctor[100];
      float bunk[100];
    } tableI;
    ...
      struct tableI a;
    ...
      get_name(a.name[0]);

    Почему при выводе блока с таблицой выбивает ошибку?

    Потому что ты вызываешь get_name с неинициализированным указателем a.name[...]. Чтобы это место заработало, надо каким-нибудь образом выделить память для a.name[...]. Например таким:

    struct tableI
    {
      char name[4][100];
      float doctor[100];
      float bunk[100];
    } tableI;
    Ответ написан
    3 комментария
  • Почему не работает функция strcpy?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    strcpy(A[i+1].firstName, A[i].firstName);
    ...
    A[i].age = A[i+1].age;

    суть конкретно этого куска задачи — удаление строки с данным(делаю путем переприсваивания на следующую строку и уменьшением количества строк на единицу)

    strcpy копирует второй аргумент в первый, как оператор присваивания.
    Ответ написан
    Комментировать
  • Это одно и тоже с точки зрения стандарта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Казалось бы, в обоих случаях у нас вызов конструктора,

    А вот и нет. A a(); -- это объявление функции a, без параметров, возвращающей значение типа A.


    И получаем странную ошибку при компиляции:
    ssd1306_128x32_i2c_test.ino:50:3: error: request for member 'f' in 'a', which is of non-class type 'A()'

    В сообщении об ошибке об этом явно написано.
    Ответ написан
  • Как зашифровать пакет на C/C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть две машины, подключенные через маршрутизатор.
    написать драйвер устанавливающий соединение, обмен ключами и шифрование всех пакетов между машинами

    Читать про IPsec. Драйвер не нужен.

    на каком уровне OSI

    IPsec работает на сетевом (3-м) уровне.
    Ответ написан
    Комментировать
  • Почему программа ломается при освобождении памяти?

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

    Потому что во время работы кто-то вылез за пределы выделенной памяти и перезаписал служебную информацию в куче. Простейший способ отладить это -- запуском программы под valgrind.
    Но в этом вопросе всё проще:

    char *response = new char[line.size()];
      std::strcpy(response, line.c_str());


    Должно быть char *response = new char[line.size() + 1];
    Ответ написан
    1 комментарий
  • C++ Прояснить что происходит. Как это работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Весь код считает сколько символов с строке введены пользователем

    Сколько разных символов.

    set<char> c(text.begin(), text.end()); // (std::)set<char> -- это множество (без повторений) символов.
                                           // с -- это имя переменной.
                                           // Конструктор множества с двумя итераторами добавляет во множество
                                           // все объекты между этими итераторами. Т.е. все буквы из строки text.
      int col = c.size();  // про c -- см. выше. std::set::size возвращает размер множества.

    Подробнее про std::set.
    Ответ написан
    Комментировать
  • Как работает scanf в плюсах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мне надо в цикле на каждой итерации запрашивать ввод строки.
    cin » s1
    позволяет это сделать, а
    scanf("%255[^\n]", s1)
    только 1 раз.

    А вот такой scanf -- позволяет это сделать сколько угодно раз:
    scanf("%255[^\n]\n", s1);
    А вот такой позволяет ввести строку заранее неизвестной длины:
    char *p;
    scanf("%m[^\n]\n", &p);
    Ответ написан
    Комментировать
  • Как передать указатель на функцию и сохранить в другой указатель на функцию, c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void (* func())

    Это какая-то ерунда (а именно, функция, возвращающая void *), а не указатель на функцию. Указатель на функцию выглядит так:
    void (*func)()
    Ответ написан
    Комментировать
  • С++. при возвращении массива string::c_str() происходит что-то не понятное?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В онлайн компиляторе все норм

    lol.

    Я в твой код комментариев добавил, для ясности:

    char *  readLine() {
      std::string line = "";
      ...
      std::cout<< (char *)line.c_str()<<"\n"; // Response    - все норм
      return (char *)(line.c_str());
      // в этот момент line уничтожается, и вместе с ним становятся недействительными
      // указатели полученные функцией c_str()
    }

    Возвращай std::string, не мудри.
    Ответ написан
  • Как работают функции sleep?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как работают функции sleep

    Вообще есть два основных подхода -- busy wait (ожидание в цикле) и scheduler-based (с использованием планировщика). Который из них используется зависит от контекста и возможностей окружения: бывают контектсты, в которых планировщик недоступен (например, обработчик аппаратного прерывания в ядре ОС), бывает кооперативная многозадачность, при которой планировщик не может гарантировать, что процесс возобновит выполнение через заданное время, бывают задержки настолько маленькие, что обращение к планировщику не имеет смысла. В этих случаях используют busy wait. При наличии вытесняющей многозадачности и таймеров высокой точности для достаточно длинных задержек можно использовать планировщик. В ядре linux используются оба эти подхода.
    Ответ написан
    Комментировать
  • При создании экземпляра класса в методе и воз ращение происходит ошибка?

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

    Socket* Socket::accept() {
                /*    ГДЕ то тут инициализирую   this->address = str_addr; // 127.0.0.1
               */
                return new Socket(client_sock_id);  
      }
      // ВЫЗЫВАЮ ЗДЕСЬ
      Socket *c = s.accept();
    // с->getAddress()// выходят русские буквы МММ....-штук под 100 или больше

    надеюсь что я что-то не правильно делаю.

    Ты задаёшь вопрос о поведении кода, но не показываешь сам код. Откуда нам знать, что это за класс Socket, что это за str_addr и как ты выводишь в том месте, где выходят русские буквы?
    Исправь сначала это.
    Ответ написан
    Комментировать