Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы со сравнением строк 
:(
    Опции темы
Welemir
Дата 4.10.2011, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



Ночи доброй.Хоть убей,а не работает.Этот код должен проверять,есть ли среди дочерних окон конкретного родителя нужный мне родитель ) ( Он отмечен в переменной NeededClass).Собственно,не работает сравнение строк,хотя строки идентичны!! Просьба помочь мне:


Код


#include <stdio.h>
#include <conio.h>
#include <Windows.h>

char ParentClass[100] = {'\0'};
char NeededClass[100] = "SomeNeededClass";
HWND ParentHandle = NULL;

  BOOL CALLBACK callfunc(HWND hwnd,LPARAM lParam) {
                       


     if(!hwnd) {

     printf("%s\n", "Error! handle of child is empty!");
     exit(0);
               }


           
           ParentHandle = GetParent(hwnd);
           GetClassName(ParentHandle,ParentClass,sizeof(ParentClass));

           if (ParentClass == NeededClass) {

           MessageBox(NULL,"oO","Oo",NULL);
           printf("%s","Got it!\n");
             
           }

           printf("%s\n",ParentClass);

          
       

     return true;



 } 



int main() {

    HWND main_window = FindWindow("SomeParentClass",NULL);

    if(!main_window) { 

        printf("%s","Error! Parent window not exists!");
        _getch();
        exit(0);

    }  

    EnumChildWindows(main_window,(WNDENUMPROC)callfunc,0);  


    _getch();
    return 0;



}




Знаю,что есть и другие варианты,но интересует именно работоспособность этого,т.к. на нём у меня будет всё завязано...Раз уж столько парился,то хоть причину надо найти. smile 

Среда программирования: Visual Studio

Это сообщение отредактировал(а) Welemir - 4.10.2011, 00:57
PM MAIL   Вверх
volatile
Дата 4.10.2011, 02:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Welemir @  4.10.2011,  00:57 Найти цитируемый пост)
         if (ParentClass == NeededClass) {

Вы здесь сравниваете не строки, а указатели на строки. А поскольку это разные строки, то результат всегда будет false.

Сравинвать нужно как-то так:
Код

if (0==strcmp( ParentClass, NeededClass)) {
   ...

PM MAIL   Вверх
GremlinProg
Дата 4.10.2011, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 4.10.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Конечно жестокое сравнение и ТС необходимо для начала почитать книжки по Си


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Welemir
Дата 4.10.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



   Вроде понял...не совсем догнал,что за PCHAR они возвращают(какой-то новый тип для указателей на чары),но ведь указатель на строку это PCHAR* тогда(как и char*),а здесь я получаю char[]...А книжки - это да,покупать буду,ибо у нас таких нет...
   P.S. Если бы это был УКАЗАТЕЛЬ,то вам не кажется,что его для начала разыменовать надо ?...иначе вывелись бы просто адреса или я чего-то тут не понимаю ?

Например:

Код


int main() {

 char *test1;
 char *test2;

  test1 = "hi";
  test2 = "hi";
  

  if(test1 == test2) {


      printf("stroki ravni");
      
  }



    _getch();
    return 0;



}




Если бы я сравнивал адреса,то они бы отличались.


Это сообщение отредактировал(а) Welemir - 4.10.2011, 16:45
PM MAIL   Вверх
math64
Дата 4.10.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В твоём примере компилятор соптимизировал: объединил две строки "hi" в одну. Кстати, присваивать строковую константу char* не рекмендуется, например Linux помещает их в сегмент памяти защищённый от записи.
Код

const char* p1 = "hi";
const char* p2 = "hi";
char array1[] = "hi";
char array2[] = "hi";
printf("p1=%p %s", p1, p1);
printf("p2=%p %s", p2, p2);
printf("p1=%p %s", array1, array1);
printf("array2=%p %s", array2, array2);
printf("strcmp(array1,array2)=%d\n", strcmp(array1,array2));
printf("(array1==array2)=%d\n", array1==array2);
printf("strcmp(array1,p1)=%d\n", strcmp(array1,p1));
printf("(array1==p1)=%d\n", array1==p1);
printf("strcmp(p1,p2)=%d\n", strcmp(array1,p1));
printf("(p1==p2)=%d\n", p1==p2);

PM   Вверх
Welemir
Дата 5.10.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



Спасибо за подсказки,повторил тут указатели _))))) (почему-то я упорно верил,что char* = строка = массив символов).Примерчик облегчил мою жизнь smile :
Но если это указатели,то проверка такого типа должна канать:

Код

if (*ParentClass == *NeededClass)


Ведь тут сравниваются именно значения,а не указатели на них как в прошлый раз);

Кстати,в прототипе указано,что функция принимает указатель  LPSTR на буфер.Привёл к LPSTR,ошибка несоответствия типов  пропала,но та же пустота.Сравнивая строки,а не разыменованные указатели,всё работает.Ведь работают же проверки такого вида:

Код

char *test = "test";
char *test2 = "test";

if (*test == *test2) { MessageBox(NULL,"stroki ravni","stroki ravni",NULL);


Где я теперь ошибся ?



Это сообщение отредактировал(а) Welemir - 5.10.2011, 01:19
PM MAIL   Вверх
Welemir
Дата 5.10.2011, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



Цитата(math64 @  4.10.2011,  19:11 Найти цитируемый пост)
Кстати, присваивать строковую константу char* не рекмендуется, например Linux помещает их в сегмент памяти защищённый от записи.


Эм,с Линуксами дел иметь я точно не буду...

PM MAIL   Вверх
math64
Дата 5.10.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(Welemir @  5.10.2011,  00:43 Найти цитируемый пост)
Где я теперь ошибся ?

if (*test == *test2) эквивалентно if (test[0] == test2[0]) т.е. сравниваются только первые символы строки
Цитата(Welemir @  5.10.2011,  01:20 Найти цитируемый пост)
Эм,с Линуксами дел иметь я точно не буду...

Рекомендация относится не только к Linux - но в Linux проще найти ошибку
Код

char*p1 = "hi";
char*p2 = "hi"; // Компилятор соптимизировал - p1 и p2 указывают на одну и ту же строку 
p1[0] = 'H'; // В Linux сразу будет ошибка записи в память, защищённую от записи
printf("p1=%s\n", p1);
printf("p2=%s\n", p2);
// В Windows будет непонятно, почему распечатывается "Hi"
printf("hi=%s\n", "hi");



Это сообщение отредактировал(а) math64 - 5.10.2011, 08:00
PM   Вверх
Welemir
Дата 5.10.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



мм,вот в чем дело.Теперь ясно почему проверка на этакое *равенство строк* сработала = ).Теперь тему точно можно закрывать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.