Цикл в цикле, и ругается на тип переменных в strcpy
Пишу цикл, который будет проверять каждое значение из ListBox1, на наличие значения из ListBox2.
При попытке компиляции ругается аж на несколько строк, 2 из которых это strcpy, и одна это strstr в if-е.
Мой код:
{
strcpy(okno,ListBox2->Items->Strings.w_str()); //сюда ругается первой парой ошибок
for (i2 = 0; i2 < ListBox1->Items->Count; i2++)
{
strcpy(okno2,ListBox1->Items->Strings[i2]); //сюда ругается второй парой ошибок
if (strstr(okno,okno2) == 0) //сюда ругается последней ошибкой
{
Application->MessageBoxW(L"ЧИТЕР",L"Попался",MB_OK);
HWND hWnd4=FindWindow(NULL,L"RF Online");
SendMessage(hWnd4,WM_CLOSE,0,0);
Application->Terminate();
}
}
}
Ошибки:
[BCC32 Error] Unit9.cpp(73): E2034 Cannot convert 'int' to 'char *'
[BCC32 Error] Unit9.cpp(73): E2342 Type mismatch in parameter '__dest' (wanted 'char *', got 'char')
[BCC32 Error] Unit9.cpp(80): E2034 Cannot convert 'int' to 'char *'
[BCC32 Error] Unit9.cpp(80): E2342 Type mismatch in parameter '__dest' (wanted 'char *', got 'char')
[BCC32 Error] Unit9.cpp(82): E2285 Could not find a match for 'strstr(char,char)'
Поскольку не охота подтирать значения сообщу - это античит, против школо-читеров. Он перебирает имена всех открытых окон на наличие "запрещённых" слов.
Что касается strstr - работает если я пишу к примеру strstr("toolz","HideToolz");
Прошу ткнуть меня носом в ошибку, ибо я пару часов сидел и бился над этими типами переменных (ох в php с этим проще...).
Ругается на твои переменные okno,okno2 ты их как объявлял?
Имхо Application->Terminate(); после первого найденого окна невариант, у него может быть 2 окна открыто.
Итак, приступим.
[BCC32 Error] Unit9.cpp(82): E2285 Could not find a match for 'strstr(char,char)'
Из текста ошибки видно, что ты объявлял okno и okno2 как char. Надо же объявлять как char[], то есть массив символов. И передается в strstr указатели на первые элементы в массиве строк-char. Тут можно прочитать про адресацию немного, будет полезно. (* - знак указателя на переменную).
[BCC32 Error] Unit9.cpp(73): E2342 Type mismatch in parameter '__dest' (wanted 'char *', got 'char')
Собственно суть проблемы та же. Вместо char[] имеем char.
[BCC32 Error] Unit9.cpp(80): E2034 Cannot convert 'int' to 'char *'
Понять эту ошибку я не смог, другие противоречат ей. Нужно побольше кода раскрыть.
Ругается на твои переменные okno,okno2 ты их как объявлял?
Имхо Application->Terminate(); после первого найденого окна невариант, у него может быть 2 окна открыто.
Нет не позволяет, ибо имя окна может быть "Speed hack" или "Wall Hack", ну и ещё куча информации про версию или автора. Мне необходимо искать 1 слово в фразе (предложении, как вам смешнее).
Что касается переменных okno и okno2 они объявлены:
char okno[50];
и
char okno2[50];
Далее, я выгружаю игру, а не чит, поэтому мне достаточно спалить одно окно и выгрузить игру, другие окна меня не интересуют.
Чуть по-позже буду у своего компьютера, и открою всё событие кнопки.
Что же касается конкретно StrStr - StrPos возвращает ту же ошибку... По не понятной для меня причине, строковая переменная не хочет конвертироваться в чар.
Ошибка про int меня тоже смутила - никогда бы не подумал, что ListBox1->Items->Strings[3] может вернуть не текст, даже не цифры текстом, а какое-то число...
Что касается PHP скажу - в нём программировать, в плане типов переменных, проще, вы не можете с этим не согласиться. Мне построить большое приложение на пхп - раз плюнуть, начал изучать си и вот, сижу, считаю и конвертирую... Очень хочется научиться, но в книгах пишут "делай c_str() - и будет тебе счастье" - без пояснений (как например про указатель) мало чего понятно.
Нашёл пример с int:
int a = 5;
int *p = &a;
с чарами дело обстоит так же?
вот так:
По остальным ошибкам аналогично.
Что касается PHP скажу - в нём программировать, в плане типов переменных, проще, вы не можете с этим не согласиться. Мне построить большое приложение на пхп - раз плюнуть...
Когда пишут реально большие приложения, редко что просто так оставляют на откуп интерпретатору. ;)
в книгах пишут "делай c_str() - и будет тебе счастье"
В грамотных книгах так не пишут. :) Почитайте Страуструпа и снимите навсегда все вопросы по поводу С++.
Тогда не strcpy(okno,ListBox2->Items->Strings.w_str());
а strcpy(&okno,ListBox2->Items->Strings.w_str()); (аналогично и с другими функциями)
но тем неменее можно просто
{
//Закрываем окно
}
//Неуспел))
Говорит:
[BCC32 Error] Unit9.cpp(73): E2034 Cannot convert 'wchar_t *' to 'const char *'
а на
говорит
[BCC32 Error] Unit9.cpp(77): E2285 Could not find a match for 'strstr(wchar_t *,wchar_t *)'
ну а на
говорит:
[BCC32 Error] Unit9.cpp(71): E2034 Cannot convert 'char[50]' to 'char *'
Я хоть маленький и глупый, но все эти варианты уже перебрал, вот всё событие кнопки (без изменений с указателями)
{
//Вот тут замучился как собака с этими типами...
int i, j;
char okno[50];
char okno2[50];
//HWND hWnd4=FindWindow(NULL,StrPos(L"hack"));
//SendMessage(hWnd4,WM_CLOSE,0,0);
for (i = 0; i <= ListBox2->Items->Count; i++)
{
strcpy(&okno, ListBox1->Items->Strings.c_str());
strcpy(&okno2, ListBox2->Items->Strings.c_str());
for (j = 0; j <= ListBox1->Items->Count; j++)
{
if (strstr(ListBox1->Items->Strings[j].w_str(),ListBox2->Items->Strings.w_str()) == 0)
{
Application->MessageBoxW(L"ЧИТЕР",L"Попался",MB_OK);
HWND hWnd4=FindWindow(NULL,L"RF Online");
SendMessage(hWnd4,WM_CLOSE,0,0);
Application->Terminate();
}
}
}
}
сделай
if(strstr(ListBox2->Items->Strings.c_str(),ListBox1->Items->Strings[i2].c_str()))
или
if(wcsstr(ListBox2->Items->Strings.w_str(),ListBox1->Items->Strings[i2].w_str()))
1. Не знаю, как там в самых новых билдерах, но C++ Builder 6 в интерфейсе поддерживал только ansi-строки. Т.е. в ListBox, TStrings и т.д. хранятся AnsiString, соответственно, вызов w_str для сравнения с содержимым другого листбокса неуместен.
2. Вместо strstr используйте метод AnsiString::Pos для определения вхождения подстроки. Это позволит избежать ненужных преобразований типов
3. for (i = 0; i <[COLOR="Red"]=[/COLOR] ListBox2->Items->Count; i++) - при последней итерации цикла выходите за пределы массива. В результате, в зависимости от везения, получите AV, трудно уловимый блуждающий баг или ... ничего :)
В общем, должно быть как-то так:
{
for (int j = 0; j < ListBox2->Items->Count; ++j)
{
if (ListBox1->Items->Strings.Pos(ListBox2->Items->Strings[j]) != 0)
{...}
}
}
в случае же с if (ListBox1->Items->Strings.Pos(ListBox2->Items->Strings[j]) != 0) вылезает ошибка List index out of bounds (7), причём у меня 7 элементов только в списке искомых слов, делаю я <= или только < - результат всё равно List index out of bounds (7).
Этот выход из значения происходит даже если я делаю не 7 циклов, внутри 115 (~115 окон вместе с системными находит), но и если я делаю 115 циклов в семи.
А по поводу остального... Индексы точно не перепутал? Может, не заметил, что я в моем коде i от 0 до List1->Items->Count, а у тебя до List2->Items->Count? Ну и j соответственно
[BCC32 Error] Unit9.cpp(73): E2034 Cannot convert 'wchar_t *' to 'const char *'
Эта ошибка из-за того, что у вас в свойствах проекта выставлена Юникод-кодировка, а не многобайтовая. В Юникоде строка - это wchar_t *, а в многобайтовой кодировке - char *. А вообще, действительно, последуйте совету Нездешнего и не путайте CRT со средствами билдера.