1

Тема: Помилка при роботі з wxString

Намагаюся відсортувати масив слів за визначеним користувачем параметром.

wxArrayString strings;
strings.Sort(compare_clean_string);

int MainFrame::compare_clean_string(wxString& first,
                                    wxString& second)
{
    wxRegEx re("\W");
    wxString clean_first, clean_second;
    clean_first = re.ReplaceAll(&first, wxT(""));
    clean_second = re.ReplaceAll(&second, wxT(""));
    return clean_first.CmpNoCase(clean_second);
}

Видає ось таку помилку:

error: 'operator=' is a private member of 'wxString'
    clean_first = re.ReplaceAll(&first, wxT(""));
    ~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2 Востаннє редагувалося wander (06.09.2023 16:21:28)

Re: Помилка при роботі з wxString

А, що ви намагаєтесь присвоїти змінним clean_first, clean_second?

https://docs.wxwidgets.org/3.0/classwx_reg_ex.html#aeda59d47a50f59511a9b5b14aa847ac2 написав:
int /* << */ wxRegEx::ReplaceAll(...)

Return number of matches replaced (maybe 0 if none found) or -1 on error.

Можливо вам ось цей метод потрібен:

wxString wxRegEx::GetMatch(const wxString& text, size_t index = 0) const

3

Re: Помилка при роботі з wxString

wander написав:

А, що ви намагаєтесь присвоїти змінним clean_first, clean_second?

https://docs.wxwidgets.org/3.0/classwx_reg_ex.html#aeda59d47a50f59511a9b5b14aa847ac2 написав:
int /* << */ wxRegEx::ReplaceAll(...)

Return number of matches replaced (maybe 0 if none found) or -1 on error.

Вам швидше ось цей метод потрібен:

wxString wxRegEx::GetMatch(const wxString& text, size_t index = 0) const

Мені треба «очистити» слова від символів на зразок апострофу,
щоб сортування було відповідно до абетки.
Якщо цього не зробити, слово «м'яч» буде йти попереду слова «матч», наприклад.
Тому я хочу прибрати все зайве регексом звідти, а тоді порівняти слова.

4

Re: Помилка при роботі з wxString

Vitaliy_Danmer написав:

Мені треба «очистити» слова від символів на зразок апострофу,
щоб сортування було відповідно до абетки.
Якщо цього не зробити, слово «м'яч» буде йти попереду слова «матч», наприклад.
Тому я хочу прибрати все зайве регексом звідти, а тоді порівняти слова.

Спробуйте так:

wxRegEx re("[^\w ]");
wxString clean_first(first), clean_second(second);
re.ReplaceAll(&clean_first, wxT(""));
re.ReplaceAll(&clean_second, wxT(""));

(не тестував)

5

Re: Помилка при роботі з wxString

wander написав:
Vitaliy_Danmer написав:

Мені треба «очистити» слова від символів на зразок апострофу,
щоб сортування було відповідно до абетки.
Якщо цього не зробити, слово «м'яч» буде йти попереду слова «матч», наприклад.
Тому я хочу прибрати все зайве регексом звідти, а тоді порівняти слова.

Спробуйте так:

wxRegEx re("[^\w ]");
wxString clean_first(first), clean_second(second);
re.ReplaceAll(&clean_first, wxT(""));
re.ReplaceAll(&clean_second, wxT(""));

(не тестував)

Я зробив ось так:

    wxRegEx re("\W");
    re.ReplaceAll(&first, wxT(""));
    re.ReplaceAll(&second, wxT(""));
    return first.CmpNoCase(second);

Як я розумію, там проміжні змінні не обов'язково робити.
Обидві версії працюють, але не так як треба:).
Тобто ще немає бажаного сортування за абеткою, якусь деталь проґавив, певно.

6

Re: Помилка при роботі з wxString

Сортування не виходило, бо функція порівняння (wxarraystring.Sort(функція порівняння))
написана була від початку для звичайного числового масиву, а не для текстового wxarraystring.
Окрім того обидві змінні, що порівнюються, мають бути константами.
Зрештою, використав рідний sort з С++ algorithm з відповідною функцією порівняння, і все вийшло як треба.