Если условие, код не выполняет код правильно - PullRequest
0 голосов
/ 19 мая 2011

Этот код берет строку из диалогового окна и сравнивает ее с данными в списке, и, если успешно, устанавливает выбор элемента из списка. У меня проблема с if, он работает, если я только ищу первый элемент, если я пытаюсь найти любой другой, он просто игнорирует условие if и идет до конца списка.

void CMFC1Dlg::OnBnClickedButton6()
{ 
    CString variable;
    cautare.GetWindowTextA(variable);
    variable = variable.MakeLower(); 

    if(variable!="")
    {
        list<Contact*>::iterator seek;
        bool flag = TRUE;
        int i = 0 ;
        while(flag)
        {
             seek = agenda.first_element();

                if( ((CString)((*seek)->getLastName().c_str())).MakeLower() == variable  || 
                    ((CString)((*seek)->getFirstName().c_str())).MakeLower() == variable || 
                    ((CString)((*seek)->getFirstAndLastName().c_str())).MakeLower() == variable ||
                    ((CString)((*seek)->getLastAndFirstName().c_str())).MakeLower() == variable)
                {
                    contactsVariable.SetCurSel(i);
                    this->OnLbnSelchangeList1();
                    flag=FALSE;
                }

                advance(seek,i);
                i++;
                if (i == agenda.list_size())
                {
                    flag = FALSE;
                }

        }
    }
    else
        MessageBox("No text on input ", "Error", MB_ICONERROR | MB_OK);

    cautare.SetFocus();
    cautare.SetWindowTextA("");
}

Ответы [ 4 ]

4 голосов
/ 19 мая 2011

Вы устанавливаете seek = agenda.first_element(); в начале каждой итерации цикла while.Переместите этот оператор за пределы цикла, и он должен работать.

EDIT : Вам также нужно изменить вызов поиска, чтобы искать только 1, а не i, поскольку вы больше не бросаетерезультат предыдущего поиска.

2 голосов
/ 19 мая 2011

Поскольку вы перебираете список элементов, почему бы не использовать метод begin() и end() связанного списка. Таким образом, вы можете выполнять итерацию по каждому элементу и не нужно продвигать итератор в каждом цикле.

Код может выглядеть следующим образом

list<Contract*>::iterator seek = agenda.begin();
while (flag && (seek != agenda.end())) {
    // do the comparison
    seek++;
}
2 голосов
/ 19 мая 2011

Вы должны вывести seek = agenda.first_element(); из цикла while.

1 голос
/ 19 мая 2011

Вы сравниваете только первый ход элемента advance(seek,i);, например:

 while(flag)
 {
     seek = agenda.first_element();
     advance(seek,i);
     ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...