Как reference counting чуть было не заставил поверить меня в мистику

January 15th, 2008 Begemot Posted in Программирование

Вчера вечером была написанна функция. Сегодня утром DialogBloks похерил мне весь файл, файл был восстановлен с архива, функция востановленна с аськи\почты. Но одно но – она не работала!, не работал не первый, ни второй вариант, всего было написанно три, третий работал но я проверил его только в конце. Функция простая как две копейки, берем строку, получаем ее внутренний буфер и отдаем винапи для изменения.

Обьявление функции:

void BegUtils::StrMakeLowerUniversal(wxString & data)

Первый

CharLower( data.GetWriteBuf(data.Length()) );

data.UngetWriteBuf();

и второй нерабочий вариант тела

wxStringBuffer buf(data, data.length()+1);

CharLower(buf);

Вчера работало – сегодня нет, классика 🙂

 

Оказалось все дело в контексте вызова – вот так работает

wxString data=_("NTnt НТнт öffnen вікно привет Donnée rápido test");

BegUtils::StrMakeLowerUniversal(data);

wxMessageBox(data);

А вот так уже нет

wxString data1=_("NTnt НТнт öffnen вікно привет Donnée rápido test");

wxString data(data1);

BegUtils::StrMakeLowerUniversal(data);

wxMessageBox(data);

Все оказалось прозаично, оптимизация строк, reference counting и разделямый внутренний буфер. Подробности обьяснять не буду – сам толком не понимаю, а ляпнуть что-нибудь и выглядеть дураком не хочется:) Зато дам вариант функции который работает и который я юзаю.

 

void

BegUtils::StrMakeLowerUniversal(wxString & data)

{

  #ifdef __WIN32__

      int len=data.length()+1;

      wxChar * buf = new wxChar[len];

      wxStrcpy(buf, data.c_str());

      CharLower(buf);

      data=buf;

      delete [] buf;

#else

      data.MakeLower();

#endif

}

 

Кстати это функция преобразования строки к нижнему регистру, которая работает со сторой на любом языке, а не только с латинскими сиволами как стандартная MakeLower. Но только под MSW.

Related:

2 Responses to “Как reference counting чуть было не заставил поверить меня в мистику”

  1. Отправил им насчет визуальных багов:
    http://www.kirix.com/forums/viewtopic.php?f=15&t=600
    Обещают написать новый wxToolBar =)

  2. […] уже как-то писал про "мистику" . Вот сегодня еще наткнулся на интересные грабли. […]