Попробуй заменить CHAR на char![]()
C++:// Возникает ошибка string data; CHAR szBuffer[1024]; strcpy(szBuffer, "{\"hash\":\"475d03f623908a13b6d8171221119a77\"}"); data += szBuffer; // Не возникает ошибка string data; CHAR szBuffer[1024]; strcpy(szBuffer, "TEST"); data += szBuffer;
Хелп
Разницы никакой, ошибка также останется (проверено уже давно).
Оно скомпилировалось и выполнилось и вывело строкуРазницы никакой, ошибка также останется (проверено уже давно).
![]()
Какой толк проверять компиляцию если ошибка появляется при запуске? Скомпилировать и я могу...
Уже всё, решил проблемуОно скомпилировалось и выполнилось и вывело строку
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
В моём случае, строка может быть слеплена с другими символами, и если скопировав её не оградить нулём, strcmp может принять следующий символ за её продолжение, и выдать 1 вместо 0, даже если константа меньшего размера, что с одной стороны и логично, ведь он выдаёт 1, а значит первое больше, но с другой стороны мне этого совершенно не нужно, и хватит сравнения того числа символов, что получено как искомая строка.И вообще, можно было бы реализовать функцию и без промежуточного буфера temp
Он не ищет дальше первого нуля. В моём случае пришлось бы обрабатывать каждый ноль, а это геморрой, на мой взглядstrstr
А вот тут действительно не подумал, спасибо.Тут должен быть оператор <, а не <=, ибо так ты будешь сверять символы включая терминальный ноль
Постыдненько получилось. Спасибо, тоже не подумал.И перед return -1 ты забыл освобождать выделенную память temp
Обновляю запрос.
В yo была утечка, исправив слепил это:
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые <10 вызовов в первом, реже - во втором цикле вызовов.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; }
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
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;
}
Скорее всего проблема в том, что здесь всегда будет результат 4 (8) при компиляции в x32 (x64).sizeof(*myStr)
Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылетСкорее всего проблема в том, что здесь всегда будет результат 4 (8) при компиляции в x32 (x64).
Лучше используй std::string.
Используй отладчик при возникновении проблем.Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылет
Используй отладчик при возникновении проблем.
![]()
Гайд - Интегрированная отладка asi/sf/dll плагинов в игре с помощью Visual Studio
прив Многие ли из вас знают, что с помощью Visual Studio можно отлаживать плагины прямо в игре и что делается это очень просто? Нет, блять, нихуя вы не знаете! Но я вас научу. Берём студию и проект своего плагина, идём в конфигурацию проекта на страницу "Debugging" (Отладка) и ставим такие...blast.hk