Ответы пользователя по тегу C++
  • Изменяет функция аргументы! Это как?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А с чего Вы взяли, что указатель не передаётся? Для C варианты char s[] и char *s синтаксически эквивалентны.
    Ответ написан
    Комментировать
  • Как исправить ошибку при компилировании C++ (error C4430: missing type specifier)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не задан тип возвращаемого значения функции CToolhelp::CreateSnapshot
    По умолчанию C подставляет int, С++ выдаёт ошибку.
    Ответ написан
    4 комментария
  • Как вернуть указатель в начало?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Жуть. Три года расстрела через повешение за такой код. realloc на каждый символ, обнуление указателя без освобождения памяти, постоянное индексное обращение при переборе строки - кол с минусом.

    А ошибка очень простая - запись символа производится в word[j], соответственно на втором слове j начинается не с нуля. Вам ещё повезло, что программа не пытается записать символы поверх кода или в чужую область.

    bool checkString(char **text, char *separator, int num_str) {
      char *str, *cur, *word;
      int len;
        for (int i = 0; i < num_str; i++, text++) {    
            str = cur = *text;
            while (*cur) {
                if (strchr(separator, *cur)) {
                    len = cur-str;
                    word = malloc(len+1);
                    strncpy(word, str, len);
                    puts(word);
                    free(word);
                    str = cur;
                }
                cur++;
            }
            puts(str);
        }
        return true;
    }
    Ответ написан
  • Как устранить коллизии?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Как правило, хэши такого типа используются для сокращения пространства прямого поиска, то есть взяв, скажем, восьмибитный хэш (256 значений) можно уже искать не по всему списку значений, а по одному из 256 подсписков, содержащих только значения с одинаковым хэшем.
    То есть каждая ячейка таблицы HashTable должна содержать вектор значений с одинаковым хэшем. Сначала вычисляется хэш от искомой строки, затем идёт перебор соответствующего вектора и прямое сравнение каждого его элемента с искомой строкой.
    Ответ написан
    Комментировать
  • Скачать библиотеки для с++ в Linux?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    windows.h для Linux? Нет, скопировать его конечно можно, но что будете делать дальше? h-файлы это только описатели типов и заголовки функций, сами функции для windows.h реализованы по большей части в WinAPI, которого под Linux само собой нету.
    Если хотите портировать программу, то разбирайтесь со всеми нестандартными типами данных и вызовами функций, ищите их аналоги под Linux и подключайте соответствующие h-файлы и библиотеки.
    Ответ написан
    Комментировать
  • C++ SFTP клиент/сервер как реализовать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Через ProFTPD не устроит? Или надо обязательно построить свой велосипед? Тогда берёте описание стандарта и вперёд. Через WinInet доступны сокеты, их хватит, чтобы SFTP реализовать.
    Ответ написан
    3 комментария
  • Как решаются задачи на вероятность?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Конкретно для этой задачи алгоритм простой. На каждом шаге:
    Выигрыш (выход из леса) - одна дорога из трёх:
    W = 1/3
    Проигрыш (разбойники)- две дороги из трёх * вероятность встретить разбойников:
    L = 2p/3
    Остался в игре - две дороги из трёх * вероятность не встретить разбойников:
    G = 2(1-p)/3
    Соответственно, для i-го шага:
    Wi = 1/3*G(i-1)
    Li = 2p/3*G(i-1)
    Соотношение
    Wi/Li = (1/3)/(2p/3) = 1/(2p)
    не зависит от i, а значит для
    SUMi=1..N(Wi)/SUMi=0..N(Li) = 1/(2p)
    для любого N
    Таким образом, общая вероятность выигрыша
    PW = W/(W+L) = 1/(1+2p)

    Ну а читать - теорию вероятности и комбинаторику.
    Ответ написан
    Комментировать
  • Можно ли так работать с указателями в C++?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    new[0] - ведёт к неопределённому поведению указателя при разыменовании.
    А если используете new[(unsigned short)-1], то где гарантия, что поток будет короче 65536 символов?
    Если работаете с потоком - ищите по возможности алгоритмы потоковой обработки, позволяющие считывать данные посимвольно или фиксированными блоками.
    Если будете работать с файлами, то можно предварительно запросить длину файла.
    Ответ написан
    6 комментариев
  • Древовидное меню. Как выбрать сначала предков, потом потомков?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Переходите на структуру Nested Set. В этом случае выборка в нужном порядке делается сортировкой по левому ключу.
    Ответ написан
    1 комментарий
  • Накладывается ли копилефт на протокол mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    MySQL имеет лицензию GPL. Значит, если не используете в своём продукте исходный код MySQL и не линкуете его статические библиотеки, то можете использовать любую лицензию.
    Ответ написан
    Комментировать
  • Как в с++ правильно вставить переменную в строку sql запроса?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Приведите строки явно к AnsiString:
    myQuery->SQL->Text = (AnsiString)"SELECT  f_department.CODE, f_department.NAME FROM f_department LEFT JOIN l_modules_22_department ON l_modules_22_department.CODE_2 = f_department.CODE WHERE l_modules_22_department.CODE_1 = '"
        + depBlock[i].moduleCode + (AnsiString)"'";
    Ответ написан
    Комментировать
  • Как решить данную задачу?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Удалять надо по кругу, то есть для {1, 2, 3, 4, 5}
    Пропускаем первого, удаляем второго - {1, 3, 4, 5}
    Пропускаем следующего (3), удаляем (4) - {1, 3, 5}
    Пропускаем следующего (5), переходим на следующий круг, удаляем (1) - {3, 5}
    Пропускаем следующего (3), удаляем (5) - {3}
    Ответ написан
    Комментировать
  • На чем можно писать программы под Windows?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для начала определитесь, действительно ли нужно функциональное программирование. Если да, то C/C++/C#/Delphi и прочие императивные языки не подойдут.
    Ответ написан
    Комментировать
  • Как написать программу с одномерными массивами в С++Builder?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вариант первый - фантастический.
    1. Придумать алгоритм решения задачи
    2. Взять среду разработки C++
    3. Написать программу, реализующую алгоритм
    4. Скомпилировать программу
    5. Проверить работу программы
    6. Если программа работает неправильно - внести исправления и перейти к шагу 4.

    Вариант второй - реальный:
    1. Перейти на сайт freelansim.ru
    2. Разместить заказ
    3. Договориться о стоимости
    4. Оплатить заказ и получить решение.
    Ответ написан
  • Как распарсить json из строки (boost)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вместо std::ifstream использовать std::istringstream
    Ответ написан
    Комментировать
  • Почему при динамическом копировании символов, остается лишняя память?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Мда..., эффективность вашего алгоритма ниже плинтуса.
    char *escapeString(char *str) {
        char *result, *temp;
        int i;
        temp = malloc(strlen(str)*2+1);
        i = 0;
        while (*str) {
            switch(*str) {
                case '\n':
                    temp[i++] = '\\';
                    temp[i++] = 'n';
                    break;
                case '\r':
                    temp[i++] = '\\';
                    temp[i++] = 'r';
                    break;
                case ':':
                case '$':
                case '\\':
                    temp[i++] = '\\';
                default:
                    temp[i++] = *str;
            }
            str++;
        }
        temp[i] = 0;
        result = malloc(i+1);
        strcpy(result, temp);
        free(temp);
        return result;
    }

    А причина ошибки у вас простая, s - символ, а strcat объединяет строки. Разница в том, что в конце строки обязан стоять символ '\x00'. Поскольку память резервировалась в стеке, то по адресу (&s) находится символ, а по адресу (&s+1) - начинается переменная i. При i = 1 strcat по адресу &s читает строку "C\x01\x00", при i =2 - "O\x02\x00" и т.д.
    Ответ написан
  • Как наиболее эффективно проверить вхождение последовательности в массиве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если надо проверить именно на непрерывную последовательность - то это поиск подстроки на алфавите x,y,z,...
    Ответ написан
    Комментировать
  • Java - тормозит, а Cи - нет?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Самый лучший способ найти ошибку - запустить пошаговый режим отладки и смотреть, как изменяются значения переменных на каждом шаге. Скорее всего, массив изначально заполняется неправильно.
    P.S. И ещё, "количество массивов" в вашей программе - всегда 1. Меняется только размер (количество элементов) массива.
    Ответ написан
    Комментировать