Грабли с временными переменными

December 15th, 2008 Begemot

Я уже как-то писал про "мистику" . Вот сегодня еще наткнулся на интересные грабли. Задача такая есть юникодная строка надо конвертить ее в UTF8, получить указатель на то что получилось и дальше обработать. Если писать так

void foo(const char * data)

{

   int len=strlen(data);

   //работаем с указателем data

}

wxString str(wxT("sometext"));

foo(str.ToUTF8().data());

Все работает отлично. Если попытатся это реализовать прямо в коде

wxString str(wxT("sometext"));

const char *  cp=str.ToUTF8().data();

int len=strlen(cp);

//работаем с указателем data

То начинает бардак. Оно не работает, cp указывает на мусор, но если поставить брейкпоинт на 3 строчку и посмотреть в watch окне значение str.ToUTF8(), то после этого все хорошо, и cp указывает куда надо и длина правильно считается. Мистика:)

Если я правильно понимаю то дело во временности буфера возвращяемого ToUTF8(). В первом случаем он видимо уничтожается после выхода из функции, поэтому в теле функции указательно возвразщаемый data() валиден. Во втором wxCharBuffer уничтожается сразу же (?) и указатель кривой, но дебагер его как-то возвращяет в жизни…. – кто силен в теории с++ подскажите в чем дело грамотно:)

Вообщем что бы обойти это приходится писать вот такой код:

wxString str(wxT("sometext"));

const wxCharBuffer tcb=str.ToUTF8();

const char *  cp=tcb.data();

int len=strlen(cp);

//работаем с указателем data

Это работает!


Пара ссылок

December 14th, 2008 Begemot

Google в клюве принес пару ссылок в копилку, делюсь:


Сюрпризы sqlite CURRENT_TIMESTAMP

December 13th, 2008 Begemot

Думаете достаточно просто определить стобец как

created TIMESTAMP not null default CURRENT_TIMESTAMP,

и забыть про него. В смысле не задавать значения этого поля при вставке, мол sqlite сама туда добавит текущее время? Напрасно 🙂

SQLite действительно сама занесет в него текущее время при вставке строки, но это будет время в UTC, без учета вашего смещения. В таком случае читать его надо как

SELECT datetime(created, 'localtime') FROM my_table; 

вместо обычного

SELECT created FROM my_table;

Но я думаю что лучше сразу правильно писать в дб, указывая значения для этого столбца как datetime(‘now’, ‘localtime’). В коде использованием SqliteDatabaseLayer, это будет выглядеть примерно так

PreparedStatement* pStatement = db->PrepareStatement(wxT(“INSERT INTO log (created, title) VALUES (datetime(‘now’, ‘localtime’), ?);”));

Больше про функции работы с датой в sqlite.

 

 


hex2bin and bin2hex c++ functions

December 11th, 2008 Begemot

Написал тут себе пару функций для перевода массива байт в hex строку и наоборот.  Особого отношения к wxWidgets не имеют, да и сами фунции конечно тривиальные, но может кому съэкономит час работы (а может и два!) работы, а это в наше нелегкое кризисное время, не мало 🙂

[sourcecode language=”cpp”]
#include
#include
using namespace std;

std::vector hex2bin(const TCHAR * hexstring)
{
std::vector v;
int ind=-1;
bool first=true;
TCHAR c, b;
while(hexstring[++ind])
{
c=hexstring[ind];
if( (c>47) &amp;&amp; (c<58)) c-=48; else if ( (c>64) &amp;&amp; (c<71)) c-=65-10; else if ( (c>96) &amp;&amp; (c<103)) c-=97-10; else continue; if (first) b=c<<4; else v.push_back(static_cast(b+c));

first=!first;
}
return v;
}

//bufferlen should be at least len*2+1 or len*3 if separator is set
int bin2hex(unsigned char *data, int len, TCHAR *buffer, int bufferlen, TCHAR separator)
{
assert( ((separator==0) &amp;&amp; (bufferlen>len*2)) || (separator &amp;&amp; (bufferlen>len*3-1)));
if (((separator==0) &amp;&amp; (bufferlen0) buffer[0]=0;
return 0;
}

const TCHAR hex[]={_T(‘0’), _T(‘1’), _T(‘2’), _T(‘3’), _T(‘4’), _T(‘5’), _T(‘6’),
_T(‘7’), _T(‘8’), _T(‘9’), _T(‘a’), _T(‘b’), _T(‘c’), _T(‘d’), _T(‘e’), _T(‘f’)};

int ind=-1;
while(len>0)
{
buffer[++ind] = hex[*data >> 4];
buffer[++ind] = hex[*data &amp; 0x0F];
if (separator!=0) buffer[++ind] = separator;
++data; –len;
}
if (separator!=0) –ind;
buffer[++ind]=0;
return ind; // count TCHAR without end \0
}[/sourcecode]


Codelite альтернатива Code::Block

November 23rd, 2008 Begemot

Видели Codelite? CodeLite is a powerful open-source, cross platform IDE for the C/C++ programming languages 

Я еще не ставил, весь в делах, только скачал пока. Но судя по скриншотам на сайте и демки, выглядит более чем приятно. Аж не верится:) Неужели она на самом деле окажется вполне рабочей.

Откуда она взялась, в таком серьозном состоянии, вроде не такой просто проект что можно за пару месяцев написать.

Open source,  GPL, Windows\Linux\MAC OS, как я понял заточена под работу с wxWidgets. Написана на ней же, исходники доступны – сами будете виноваты если не скачаете.

Кто первый потестить, отписывайтесь:)


Основы Управления Памятью

November 18th, 2008 Begemot

В связи глобальной расхлебаностью и, как следствие, черепашьими темпами перевода мной книги. Родилась мысль переводить и выкладывать маленькими кусочками, все таки мелкие проекты гораздо легче довести. Итак первая часть 15 главы.

 

Глава 15. Управление памятью, отладка приложения и проверка ошибок

 

Read the rest of this entry »

Posted in Учебники | Tags:
Comments Off on Основы Управления Памятью


Еще один неплохой туториал

November 16th, 2008 Begemot

Попался на глаза еще один wxWidgets tutorial, на английском, вроде неплохой, для новичков точно пойдет.

Posted in Учебники
Comments Off on Еще один неплохой туториал


Исключаем контрол из tab order’a

November 12th, 2008 Begemot

Минус в том что контрол надо субкласить, плюс в том что это работает:)

[sourcecode language=”cpp”]
h:
bool SetAllowSetFocusFromKbd(bool allow=true)
{
bool t=AllowSetFocusFromKbd;
AllowSetFocusFromKbd=allow;
return t;
};

bool GetAllowSetFocusFromKbd() const
{return AllowSetFocusFromKbd;};

virtual void SetFocusFromKbd();

private:
bool AllowSetFocusFromKbd;

cpp:
void CMyClass::SetFocusFromKbd()
{
if (AllowSetFocusFromKbd)
BaseClass::SetFocusFromKbd();
else
Navigate();
}
[/sourcecode]

 

Спасибо мудрецам c форума шадонета за наводку

Posted in Программирование | Tags: ,
Comments Off on Исключаем контрол из tab order’a


Open source синхронизация файлов

November 4th, 2008 Begemot

В самом начале знакомства с wxWidgets я хотел найти хорошее опен соурс приложение, что бы посмотреть как народ пишет код, какие использует техники, фокусы, трюк.

Тогда мне это не удалось, по крайней мере не удалось найти специфическое для моих целей. Недавно на глаза попалась FreeFileSyn – довольно приятная утилита для синхронизации файлов.

Это чуть ли не первый open source проект на wxWidgets из виденных мной, который производит впечетление нормального продукта, а не просто подделки. А ведь все что нужно это нормальный интерфей и несколько иконок – секрет прост:)

Исходники, конечно не мне судить, но кажется что хорошие – так что качайте, смотрите и перенимайте опыт.

Posted in Учебники
Comments Off on Open source синхронизация файлов


Я очень, очень не доволен меню и тулбаром!

October 30th, 2008 Begemot

Ужасть просто как недоволен 🙂 Про меню я уже писал частично, сейчас будет вторая серия – буду отрыватся по полной, возможна даже нецензурная лексика:)

1. Хреновое выравнивание, посмотрите что происходит с шоткатом F2 в обоих случаях

menu_shortcut

2. Опять же хреновое выравнивае, но уже для чекбоксов. Почему его тянет на лево?

checkbox

3. Стоковые названия\шоткаты для меню – классная задумка. Но посколько, под виндой шоткаты принято обозначать как ctrl+v, а wxWidgets использует ctrlv, то ради унификации интерфейса приходится жертвовать ими и прописывать все название и комбинации жестко.

4. Для тулбара можно указать две иконки, обычную и вторую для задисейбленного состояние. Для меню только одну. Можно указать одну и там и там, полагаясь на автоматическое создание задисейбленного изображения, но алгоритмы получения второй иконки у них разные – в результате фигня.

menu_toolbar_disable

5. тулбар вообще делает задисейбленную иконку крайне загадочно. Как будет выглядеть иконка, зависит от того какая идет перед ним, установленна ли вторая иконка для предществующей иконки и похоже еще от чего-то. Видите разницу, на рисунке сверху и на двух тут, три варианта…

toolbar_disable

6. wxMenu автоматически обрабатывает все шоткаты в меню и похоже это нельзя отключить, и это проблема:(

7. А это тулбар под вистой

toolbar_vista

Пока все что удалось вспомнить. И как они его там тестируют… ? Страшно представить, что же там будет под юкнисом то. Хотя может это только у меня дар и другие не замечают, может мне в тестеры пойти ?:)

Зато wxWidgets позволяет использовать png для иконок, а вот для дельфей такого нету, сегодня народ жаловался:)

Следует отметить что я использую wxAUI, и тулбар соответвенно, от его. Может с родным было бы лучше, надо проверить.

Да, вы главное не подумайте что я сильно расстроен wxWidgets, так просто пар спускаю:) А вообще ничего, можно пользоватся, творить. Я вот даже до беты дописался. так что не все так плохо! 🙂