Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цикл в цикле, и ругается на тип переменных в strcpy

66K
29 января 2011 года
Oskaria
5 / / 29.01.2011
Ситуация такая:

Пишу цикл, который будет проверять каждое значение из ListBox1, на наличие значения из ListBox2.

При попытке компиляции ругается аж на несколько строк, 2 из которых это strcpy, и одна это strstr в if-е.

Мой код:
Код:
for (i = 0; i < ListBox2->Items->Count; i++)
{
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 с этим проще...).
277
29 января 2011 года
arrjj
1.7K / / 26.01.2011
А if(ListBox2->Items->Strings==ListBox1->Items->Strings[i2]) религия не позволяет?
Ругается на твои переменные okno,okno2 ты их как объявлял?
Имхо Application->Terminate(); после первого найденого окна невариант, у него может быть 2 окна открыто.
33K
29 января 2011 года
hivewarrior
205 / / 16.11.2010
Тысяча первое подтверждение того, что пхп развращает умы юных программистов.

Итак, приступим.
[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 *'
Понять эту ошибку я не смог, другие противоречат ей. Нужно побольше кода раскрыть.
66K
29 января 2011 года
Oskaria
5 / / 29.01.2011
Цитата: arrjj
А if(ListBox2->Items->Strings==ListBox1->Items->Strings[i2]) религия не позволяет?
Ругается на твои переменные 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;
с чарами дело обстоит так же?

278
29 января 2011 года
Alexander92
1.1K / / 04.08.2008
Кто работал с билдером вплотную - ответьте на такой вопрос: в MS VC++, как и полагается, имя массива считается указателем на нулевой элемент, в билдере это сохраняется? Просто вообще говоря, чтобы никогда не натыкаться на подобные ошибки, лучше писать вместо
 
Код:
strcpy(okno,ListBox2->Items->Strings.w_str());

вот так:
 
Код:
strcpy(&okno[0], ListBox2->Items->Strings.w_str());


По остальным ошибкам аналогично.

Цитата:

Что касается PHP скажу - в нём программировать, в плане типов переменных, проще, вы не можете с этим не согласиться. Мне построить большое приложение на пхп - раз плюнуть...


Когда пишут реально большие приложения, редко что просто так оставляют на откуп интерпретатору. ;)

Цитата:

в книгах пишут "делай c_str() - и будет тебе счастье"


В грамотных книгах так не пишут. :) Почитайте Страуструпа и снимите навсегда все вопросы по поводу С++.

277
29 января 2011 года
arrjj
1.7K / / 26.01.2011
>>char okno[50];

Тогда не strcpy(okno,ListBox2->Items->Strings.w_str());
а strcpy(&okno,ListBox2->Items->Strings.w_str()); (аналогично и с другими функциями)

но тем неменее можно просто
 
Код:
if(strstr(ListBox2->Items->Strings.w_str(),ListBox1->Items->Strings[i2].w_str()))
{
//Закрываем окно
}


//Неуспел))
66K
29 января 2011 года
Oskaria
5 / / 29.01.2011
На:
 
Код:
strcpy(&okno[0], ListBox2->Items->Strings.w_str());

Говорит:
[BCC32 Error] Unit9.cpp(73): E2034 Cannot convert 'wchar_t *' to 'const char *'

а на
 
Код:
if(strstr(ListBox2->Items->Strings.w_str(),ListBox1->Items->Strings[i2].w_str()))

говорит
[BCC32 Error] Unit9.cpp(77): E2285 Could not find a match for 'strstr(wchar_t *,wchar_t *)'

ну а на
 
Код:
strcpy(&okno, ListBox1->Items->Strings.c_str()); (без [0])

говорит:
[BCC32 Error] Unit9.cpp(71): E2034 Cannot convert 'char[50]' to 'char *'


Я хоть маленький и глупый, но все эти варианты уже перебрал, вот всё событие кнопки (без изменений с указателями)

Код:
void __fastcall TForm9::Button1Click(TObject *Sender)
{
//Вот тут замучился как собака с этими типами...
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();
                          }
                 }
}

}
277
29 января 2011 года
arrjj
1.7K / / 26.01.2011
вместо if(strstr(ListBox2->Items->Strings.w_str(),ListBox1->Items->Strings[i2].w_str()))
сделай
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()))
535
29 января 2011 года
Нездешний
537 / / 17.01.2008
2 Oskaria
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 i = 0; i < ListBox1->Items->Count; ++i)
{
    for (int j = 0; j < ListBox2->Items->Count; ++j)
    {
        if (ListBox1->Items->Strings.Pos(ListBox2->Items->Strings[j]) != 0)
        {...}
    }
}
66K
29 января 2011 года
Oskaria
5 / / 29.01.2011
в случае с wcsstr() я не могу понять, что возвращает эта функция... весь выход if воспринимает как true...
в случае же с 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 циклов в семи.
535
29 января 2011 года
Нездешний
537 / / 17.01.2008
[QUOTE=Oskaria]в случае с wcsstr() я не могу понять, что возвращает эта функция[/QUOTE]"Если ничто другое не помогает, прочтите же, наконец, инструкцию!" (с)

А по поводу остального... Индексы точно не перепутал? Может, не заметил, что я в моем коде i от 0 до List1->Items->Count, а у тебя до List2->Items->Count? Ну и j соответственно
66K
29 января 2011 года
Oskaria
5 / / 29.01.2011
А не важно, как бы я не ставил ошибка одна и та же...
278
30 января 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата:

[BCC32 Error] Unit9.cpp(73): E2034 Cannot convert 'wchar_t *' to 'const char *'


Эта ошибка из-за того, что у вас в свойствах проекта выставлена Юникод-кодировка, а не многобайтовая. В Юникоде строка - это wchar_t *, а в многобайтовой кодировке - char *. А вообще, действительно, последуйте совету Нездешнего и не путайте CRT со средствами билдера.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог