Как 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.
January 29th, 2008 at 12:29 am
Отправил им насчет визуальных багов:
http://www.kirix.com/forums/viewtopic.php?f=15&t=600
Обещают написать новый wxToolBar =)
December 15th, 2008 at 12:27 am
[…] уже как-то писал про "мистику" . Вот сегодня еще наткнулся на интересные грабли. […]