Другое С/С++ Вопрос - Ответ

ishi

Известный
493
110
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
И вообще, можно было бы реализовать функцию и без промежуточного буфера temp
В моём случае, строка может быть слеплена с другими символами, и если скопировав её не оградить нулём, strcmp может принять следующий символ за её продолжение, и выдать 1 вместо 0, даже если константа меньшего размера, что с одной стороны и логично, ведь он выдаёт 1, а значит первое больше, но с другой стороны мне этого совершенно не нужно, и хватит сравнения того числа символов, что получено как искомая строка.

Как раз для ограждения и нужен yo, как указатель на конец. У меня не вполне адекватно себя ведёт преобразование памяти ptrTo*, потому вместо инкремента имеющегося адреса я создал указатель. Мб я криворукий, но так хотя бы ошибки доступа мозг не выносят.

temp как раз служит хранилищем для строки, без доп буфера я не нашёл способ оградить байты нулём и сравнить с искомой строкой, ну а без нуля шо - описал выше.
Он не ищет дальше первого нуля. В моём случае пришлось бы обрабатывать каждый ноль, а это геморрой, на мой взгляд

Тут должен быть оператор <, а не <=, ибо так ты будешь сверять символы включая терминальный ноль
А вот тут действительно не подумал, спасибо.

И перед return -1 ты забыл освобождать выделенную память temp
Постыдненько получилось. Спасибо, тоже не подумал.
 

ishi

Известный
493
110
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = static_cast<char*>(temp) + strlen(what) + 1;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        *yo = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые <10 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.

Проблема решена.
temp с некоторой периодичностью складировал какой-то мусор на месте последнего-предпоследнего байта, из-за чего вместо нуля на конце или перед концом появлялся левый символ. Решено заполнением нулями перед каждым memcpy.
Всех откликнувшихся благодарю за потраченное на меня время.
 

CatKnight

Известный
148
54
Как можно при помощи СФ заблокировать камеру свою (т.е. чтобы нельзя было ей вращать вокруг персонажа)?
 

Stiopko

Известный
Проверенный
307
218
почему при втором запросе вылетает игра?
C++:
void AddToString(char** myStr, const char* sourse) {
    char* newStr;
    if (*myStr != nullptr) {
        if (sizeof(*myStr) >= strlen(*myStr) + strlen(sourse) + 1) {
            strcat(*myStr, sourse);
            return;
        }
        else {
            newStr = new char[strlen(*myStr) + strlen(sourse) + 1];
            strcpy(newStr, *myStr);
            strcat(newStr, sourse);
            delete[] * myStr;
        }
    }
    else {
        newStr = new char[strlen(sourse) + 1];
        strcpy(newStr, sourse);
    }
    *myStr = newStr;
}

const char* SendPost(const char* site, const char* file, char* data, char **mainBuf, bool* isError)
{
    if (*mainBuf == nullptr) AddToString(mainBuf, "");
    HINTERNET hSession = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (hSession != NULL)
    {
        HINTERNET hConnect = InternetConnectA(hSession, site, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
        if (hConnect != NULL)
        {
            HINTERNET hHttpRequest = HttpOpenRequestA(hConnect, "POST", file, NULL, NULL, 0, 0, 1);
            if (hHttpRequest != NULL)
            {
                char szReq[1024] = "", szBuffer[1025];
                DWORD dwByteRead = 0;
                BOOL bRead;

                if (*mainBuf != nullptr) mainBuf[0] = '\0';

                LPCSTR header;
                header = "Accept: *\/*";
                HttpAddRequestHeadersA(hHttpRequest, header, strlen(header), HTTP_ADDREQ_FLAG_ADD);
                header = "Content-Type: application/x-www-form-urlencoded";
                HttpAddRequestHeadersA(hHttpRequest, header, strlen(header), HTTP_ADDREQ_FLAG_ADD);
                if (HttpSendRequestA(hHttpRequest, NULL, 0, data, strlen(data))) {

                    while (true)
                    {
                        bRead = InternetReadFile(hHttpRequest,
                            szBuffer,
                            sizeof(szBuffer) - 1,
                            &dwByteRead);
                        if (bRead == FALSE || dwByteRead == 0)
                            break;
                        szBuffer[dwByteRead] = '\0';
                        AddToString(mainBuf, szBuffer);
                    }
                    if (isError != nullptr)* isError = false;
                }
                else if (isError != nullptr)* isError = true;
            }
            else if (isError != nullptr)* isError = true;
            InternetCloseHandle(hHttpRequest);
        }
        else if (isError != nullptr)* isError = true;
        InternetCloseHandle(hConnect);
    }
    else if (isError != nullptr)* isError = true;
    InternetCloseHandle(hSession);
    return *mainBuf;
}
 

Stiopko

Известный
Проверенный
307
218
Скорее всего проблема в том, что здесь всегда будет результат 4 (8) при компиляции в x32 (x64).
Лучше используй std::string.
Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылет
 

index

Известный
126
82
Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылет
Используй отладчик при возникновении проблем.
 

Stiopko

Известный
Проверенный
307
218
Используй отладчик при возникновении проблем.

Затупил, проблема была именно в sizeof(*myStr) . Чотко :good:
 

tlwsn

Известный
537
85
При компиляции вот такие ошибки, как можно починить?
34107
 

Stiopko

Известный
Проверенный
307
218
Что делать если вот такая ошибка, я предлагаю выкинуть комп в окно но моя вторая личность против
34141
 

Stiopko

Известный
Проверенный
307
218
код прикрепи где рисуешь
C++:
if (SUCCEEDED(SF->getRender()->BeginRender()))
        {
            ImGui_ImplDX9_NewFrame();
            ImGui_ImplWin32_NewFrame();
            ImGui::NewFrame();

            static bool bAimbot;
            ImGui::Begin("Test", NULL, ImVec2(300, -1), 1,
                ImGuiWindowFlags_NoCollapse |
                ImGuiWindowFlags_NoSavedSettings |
                ImGuiWindowFlags_NoResize);

            ImGui::Checkbox("Aimbot", &bAimbot);

            ImGui::End;

            ImGui::EndFrame();
            ImGui::Render();
            ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
            SF->getRender()->EndRender();
        }