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

ishi

Известный
493
110
это проверка на то что "слово" есть в строчке "какое то слово" ?
Не совсем. Это для поиска в буфере, содержимое которого может не соответствовать строчному типу: на конце может не быть нуля, а сами символы могут не соответствовать кодировке искомого. Короче говоря: поиск в бинарном файле.


чем strstr не устраивает?
Не хочет искать дальше первого \0
 

ishi

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

ALF

Известный
Проверенный
320
537
Обновляю запрос.
В 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 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
в отладчике посмотри
 

_Vine_

Активный
154
57
Обновляю запрос.
В 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 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
У тебя 3 ошибки в коде.
C++:
char* yo = static_cast<char*>(temp) + strlen(what) + 1;
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
C++:
while (iterator <= whereSize)
Тут должен быть оператор <, а не <=, ибо так ты будешь сверять символы включая терминальный ноль, а это приведет к неправильному результату
И перед return -1 ты забыл освобождать выделенную память temp
То есть твоя функция должна выглядеть так
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);
    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++;
    }
    free(temp);
    return -1;
}

И вообще, можно было бы реализовать функцию и без промежуточного буфера temp, не знаю зачем ты это сделал.
Или вовсе использовать strstr, раз уже используешь strcmp.
C++:
int findstring(const char *str1, const char *str2) {
    int str1_len = strlen(str1);
    int str2_len = strlen(str2);
    for (int i = 0; i < str1_len; i++) {
        bool compare = true;
        for (int k = 0; i < str2_len; k++) {
            if (str1[i + k] != str2[k]) {
                compare = false;
                break;
            }
        }
        if (compare)
            return i;
    }
    return -1;
}
 

enziweee

Участник
28
32
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?

C++:
for (int i = 0; i < MAX_PLAYERS; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;

            if (pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (!pRemotePed->IsDead() || !pLocalPed->IsDead())
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector);

                        SAMP::CVector pRemoteSecondBoneVector;
                        pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector);

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                        CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated);
                        CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated);

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }
Eu-xFuZUfxU.jpg
 

rraggerr

проверенный какой-то
1,626
846
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?

C++:
for (int i = 0; i < MAX_PLAYERS; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;

            if (pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (!pRemotePed->IsDead() || !pLocalPed->IsDead())
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector);

                        SAMP::CVector pRemoteSecondBoneVector;
                        pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector);

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                        CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated);
                        CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated);

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }
Eu-xFuZUfxU.jpg
попробуй добавить проверку на
if (CalcScreenCoors)
и на
GetBonePosition
и еще у тебя ошибки, кароче на
C++:
if (pLocalPed->IsDead())
return;
for (int i = 0; i <= 1000; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;
if (pPlayerPool && pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (pRemotePed && pLocalPed && !pRemotePed->IsDead() )
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        if (!pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector))
continue;

                        SAMP::CVector pRemoteSecondBoneVector;
                       if (!pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector))
                           continue;

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                       if (!CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated))
                           continue;
                       if (CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated))
                           continue;

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }
 

Шурик

Активный
216
42
YgD18WcOiuQ.jpg


C++:
// Возникает ошибка

string data;
CHAR szBuffer[1024];
strcpy(szBuffer, "{\"hash\":\"475d03f623908a13b6d8171221119a77\"}");
data += szBuffer;

// Не возникает ошибка

string data;
CHAR szBuffer[1024];
strcpy(szBuffer, "TEST");
data += szBuffer;

Хелп
 

Stiopko

Известный
Проверенный
307
218
YgD18WcOiuQ.jpg


C++:
// Возникает ошибка

string data;
CHAR szBuffer[1024];
strcpy(szBuffer, "{\"hash\":\"475d03f623908a13b6d8171221119a77\"}");
data += szBuffer;

// Не возникает ошибка

string data;
CHAR szBuffer[1024];
strcpy(szBuffer, "TEST");
data += szBuffer;

Хелп
Попробуй заменить CHAR на char

все норм робит

33723
 

Шурик

Активный
216
42
Попробуй заменить CHAR на char

все норм робит

Разницы никакой, ошибка также останется (проверено уже давно).
LszezczgoVE.jpg

Какой толк проверять компиляцию если ошибка появляется при запуске? Скомпилировать и я могу...
 

Stiopko

Известный
Проверенный
307
218
Разницы никакой, ошибка также останется (проверено уже давно).
LszezczgoVE.jpg

Какой толк проверять компиляцию если ошибка появляется при запуске? Скомпилировать и я могу...
Оно скомпилировалось и выполнилось и вывело строку