Pages

Tuesday, September 22, 2009

WAZE


Вот Вам WAZE. Карта строится "анонимно" - каждый водитель как-то там обновляет карту по интернету и получает обновления сам от таких же водителей как и он сам. В мае уже была выпущена iPhone и Android версия для США. Сейчас появились демо для Symbian и для Windows Mobile.

Saturday, September 19, 2009

MEDION GoPal P4635


На IFA 2009 Medion представили новый навигационный прибор - MEDION GoPal P4635. Говорят, что возможно голосовое управление. Есть также и встроенный GSM модуль. NavTech Traffic - TMC улучшенное NavTech. И так далее в стиле MEDION - слабый процессор, мало памяти,... вполне бюджетный прибор. Но програмное обеспечение доджно быть супер. Если, конечно, сможет на таком железе работать.

Archos 5 Android


Archos 5 Android - Андроидный таблет PC. Имеет полный HTML браузер. Экран 4.8 дюйма. 3G не поддерживается. Но есть WiFi и Bluetooth. Есть и GPS. Даже навигация с 3D Landmarks.

Mio Moov M300 и M400



Два новых навигационных прибора от Mio - M300 и M400. Просто и дешево. По-моему, так и должно быть.

Навигационный система и телеприемник "в одном флаконе" от SONY


Sony NV-U75 это навигационная система и телеприемник вместе. Экран 4.5 дюйма. 8MB памяти для карт. Выпустили для Японии. Я думал, что любая навигационная система обязана имет трех-мерную графику.

Числа, биты и битовые операции

Вообщем-то случайно наткнулся на эту статью: "Numbers, bits and bit operations"
Эту тему мне раз 5 только в школе объясняли. Но учительница математики, при полном уважении к ней, была очень далека от комьютера и все, что она преподавала, воспринималось как гимнастика для ума, а не что-то для практического применения.
Потом я сто раз читал книги по ассемблеру - все как у моей учительницы - классическое объяснение этого вопроса на русском языке абсолютно скучно, не дает каких-то аналогий, ассоциаций для лучшего запоминания и понимания.
Статью "Numbers, bits and bit operations" автор и начал-то с шутки, Но и шутку понять можно, если хотя бы слышал о двоичной системе исчисления - "В мире живут 10 типов людей - те кто понимает двоичную систему исчисления и тех, кто не понимает".

Friday, September 18, 2009

Windows Mobiel 6.5. Новый билд

Появился новый билд (23049) Microsoft Windows Mobile 6.5 - много багов и проблем починено, увеличены чек-боксы и радио-кнопки, улучшено скроллирование и так далее. HTC, Samsung,...получили этот апдейт и обновляют свои телефоны



HTC Leo


HTC Leo было, наверное, самой гарячей темой на технологических сайтах в интернете на прошлой неделе. И все это слухи, утечки информации, домыслы и фантазии. Были опубликованы фотографии и техническая спецификация.
А начался этот бум сплетен, кажется, на польском сайте PDAClub. И, вроде как, HTC потребовали убрать фотографии - все как в супер-пиар компании.
Коротко - 4-ч дюймовый емкостный экран (capacitive multitouch screen), 1MHz процессор, 512 MB флэш память, 320 MB оперативная память, 5 мегапиксел камера (а кто говорит и 12) и так далее. Сайт ai.rs содержит много информации об этом телефоне.

Все это работает под управлением Microsoft Windows 6.5. Установлен новый TouchFlo 3D, ... Вообщем, это новый "HTC флагман", high-end девайс.

Новый Navigon с емкостным экраном


На IFA 2009 Navigon объявил о выпуске очередного навигационного устройства с 5-ти дюймовым емкостным экраном и реальным 3-х мерным видом 11 европейских городов - Navigon 8410 и 8450.
http://www.navigon.com/site/int/en/press/archive/2009/568

Wednesday, September 16, 2009

Гречка с капустой

Вот так сейчас бывает:
#include <iostream>

void Test()
{
System::Console::WriteLine("In Test");
}

void Out()
{
std::cout << "out" << std::endl;
}

int main()
{
void (*pTest)() = &Test;
(*pTest)();

void (__clrcall *pTest2)() = &Test;
(*pTest2)();

Test();

Out();
}
C++ и C# вместе в одном cpp-файле. Такой файл компиллировать с флагом /clr нужно. В Visual Studio есть шаблон для новых проэктов - Empty CLR project. Если его выбрать, то в настройках проэкта это флаг (/clr) уже будет установлен.

Saturday, September 12, 2009

Тип size_t

Это стандартный тип в С++, который используется в функциях работающих с блоками памяти. size_t всегда объявляется как безнаковое целое число (unsigned int). Такое объявление позволяет использовать один и тот же код на разных платформах.
Если бы функция sizeof() возвращала бы integer, который всегда 4 байта, то на 64-битной платформе, где адрес 64-битный приглось бы писать новые функции.
CPlusPlus.com говорит об этом типе здесь.

Win32: Формат вызова функций

Что происходит при вызове функций из програм на C/C++? Я о том, что в функцию нужно передать параметры, получить возвращаемое значение.
В общем-то, большинство программистов не хотять знать такие подробности. Мне в нескольких критических ситуациях пришлось разбираться с этим вопросом. Например, имея только DLL экспортирующий класс, я умудрился создать объект этого класса и вызвать из него функцию.
Я не академик, но имею академический склероз и каждый раз забываю технические детали, которыми пользуюсь не часто. Если опишу то, что помню сейчас о форматах вызова функций на Win32 платформе, то, если понадобиться снова, буду знать, где искать.

Процесс вызова функций для Win32 можно описать так:
1. Все параметры функций выравниваются до 4 байт и размещаются либо на стеке, либо в регистрах.
2. Процесс выполнения программы переходит в вызываемую функцию.
3. В начале функции созраняются в стеке регистры ESI, EDI, EBX, EBP. Это стандартное начало и его называют проголом функции.
4. Выполняется сама функция и ее возвращаемое значение заносится в регистр EAX.
5. Восстанавливаются регистры ESI, EDI, EBX, EBP из стека. Эта часть называется эпилогом функции.
6. Параметры функции удаляются из стека. Эту операцию называют очисткой стека (stack cleanup).

Для программиста на С, C++ или Basic, код для всех этих 6 названных пунктов «пишет» компилятор.
Только иногда, если мы, например, разрабатываем DLL или пишем математический код на C, или пытаемся оптимизировать нашу программу, мы задаем иногда что-то типа __cdecl, __stdcall или __fastcall в определении функций. Просто потому, что так написано в книге или статье, даже не задумываясь и не запоминая.
Если посмотреть на самую главную функцию WinMain, то и перед ее именем стоит WINAPI. Но мало кому интересно зачем это нужно.

Сделаем маленький шажок в глубь – рассмотрим форматы вызова функций на Win32 платформе.
Формат вызова – это мой свободный перевод ангийского Calling Convention. Буквальный перевод, наверное, соглашение вызова. Просто моему уху это не приятно. Хоть я не удивлюсь, если в университетах используют именно такой перевод – абсолютно точно и абсолютно непонятно.
Итак, разберемся с __cdecl, __stdcall, WINAPI, __fastcall и Thiscall. Первые 4 термина уже упоминались, а Thiscall... и по названию понятно, что речь о классах на C++.

__cdecl
Этот формат (соглашение) принято по умолчанию для C/C++ програм – если явно не указан формат вызова функции, то подразумевается именно этот __cdecl:
1. Параметры передаются в функцию справа налево – заталкиваются в стек в порядке справа налево.
2. Вызываемая программа очищает стек после выполнения кода функции.
Формат вызова определяет и так называемое декорирование имени функции (name decorating), в случае __cdecl впереди к имени функции добавляется символ подчеркивания ‘_’.Например, для функции объявленной как:
int Sum(int x, int y);

компилятор создаст новое имя: _Sum.
Вот простая програмка, которая все покажет:
int __cdecl Sum(int x, int y);

int main()
{
int a = Sum(1, 2);
return 0;
}

int Sum(int x, int y)
{
return x + y;
}
Если поставить точку останова в строке с вызовом функции и перейти в окно дизассеблирования, то все видно:

А вот и сама функция:

Здесь видно и пролог и эпилог и очистку стека. Правда у функции оказалось имя Sum – это «обман зрения» для тех, кто дебагирует? MSDN утверждает, что символ подчеркивания должен быть в начале имени функции.
Наверное, так и есть. Проверить можно используя утилиту dumpbin:
>dumpbin /disasm main.obj

А тут уже все, как утверждает MSDN:

Ключ компилятора /Gd указывает использовать __cdecl формат вызова функций.
MSDN в разделе Visual C++ дает информацию об этом формате на этой странице:
http://msdn.microsoft.com/en-us/library/zkwh89ks.aspx

__stdcall
Этот формат (соглашение) используется для вызова Win32 API. Формат WINAPI обозначает то же самое – в файле windef.h можно найти:
#define WINAPI      __stdcall
Компилятору можно задать ключ /Gz и все функции, у которых явно не определен формат вызова будут сгенерированы как __stdcall:
1. Параметры заносятся в стек в порядке справа налево.
2. Стек очищается самой вызываемой функцией.
3. К имени функции вначале добавляется символ подчеркивания ‘_‘, и в конце символ @ и число байт в стеке (то есть _Sum@8 для нашего примера).
Стек очищается самой вызываемой функцией, то есть размер выполняемого файла (executable) меньше, чем в случае __cdecl, где стек очищается вызывающей программой и поэтому код очистки генерируется для каждого вызова функции.
Этот формат жестко указывает размер стека и поэтому он неприменим для функций с переменным числом параметров таких как printf.
Вот описание этого формата в MSDN:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

__fastcall
Этот формат указывает компилятору расположить (когда это возможно) параметры функции в регистрах, а не в стеке. Характеристики этого формата вызова следующие:
1. Первые два параметра должны быть 32-битными или короче. Они размещаются в регистрах ECX и EDX. Остальные параметры заталкиваются в стек справа налево.
2. Стек очищается вызываемой функцией.
3. К имени функции вначале добавляется символ @ и в конце символ @ и число байт в стеке (для нашего примера @Sum@8).
Ключ /Gr включает __fastcall формат для вызова функций.
Вот, что говорит об этом формате вызова MSDN:
http://msdn.microsoft.com/en-us/library/6xa169sk.aspx

__thiscall
И по названию понятно, что этот формат применяется по умолчанию для функций-членов С++ класса (кроме тех, что имеют переменное число параметров). Основные характеристики этого формата следующие:
1. Параметры передаются справа налево и размещаются в стеке.
2. This размешается в регистре ECX.
3. Очистка стека выполняется вызываемой функцией.
Если функция-член класса имеет переменное число параметров, то используется формат __cdecl и this заносится в стек последним.
MSDN о __thiscall:
http://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx

Вот так все просто. Сложно не забыть. Поэтому хорошо, если есть возможность "подсмотреть" в те моменты, когда эта информация нужна.

В MSND есть еще описания для naked («голых») функций – тех, для которых не нужно писать пролога и эпилога. Например если функция на встроенном ассемблере. Есть и формат вызова для managed code (управляемый код) - __clrcall. Есть описания уже устаревших форматов - __pascal, __fortran, __syscall.

Friday, September 11, 2009

Motorola CLIQ


Motorola аннонсировала новый телефон - Motorola CLIQ. В октябре прошлого года этот проэкт назывался Морисон. Мотороловцы грозились выпустить этот свой первый андроидный телефон к апрелю. Они тогда полностью отказались от Symbian. Сказали, что и с Microsoft на телефонах дружить не будут - мол, не сработала эта стратегия. Ходят слухи, что на этот раз они 70 миллионов на маркетинг выделяют. Посмотрим.

Saturday, September 5, 2009

Новый TomTom



Я думал, что у TomTom в этом году все силы ушли на iPhone. Но вот начинается выстака в Берлине, IFA 2009, и TomTom демонстрирует новые модели и новый юзер интерфейс.

IFA 2009


IFA 2009 - выставка в Берлине. Проходит с 4 по 9 сентября. Раньше я о такой выставке не слышал. Не знаю, может, это аналог выставки в Лас Вегас, потому что тоже о консьюмерс электроникс. И, кажется, телефоны сейчас самая консьюмерная электроника. Во всяком случае на сайте выставки первый обзор посвящен iPhone и дальше следут остальные производители. Подробнее здесь.

Friday, September 4, 2009

Наглый импорт класса из DLL

На CodeProject есть очень старая статья "Using classes exported from a DLL using LoadLibrary"
Все так и работает - если есть только DLL и файл-заголовок, то можно создать объект класса и вызывать его методы.
Сама программа будет выглядеть так:
#include <Windows.h>
#include <cstdio>
#include "test_dll.h"

typedef void (WINAPI * PCTOR) ();
typedef int (WINAPI * PADD)(int, int);

int main()
{
HMODULE hLib = ::LoadLibraryW(L"test_dll.dll");
if (hLib == NULL)
return 0 ;

CCalc* pCalc = (CCalc*)malloc(sizeof(CCalc));
if (pCalc != NULL)
{
PCTOR pCtor = (PCTOR)GetProcAddress(hLib, "??0CCalc@@QAE@XZ");
if (pCtor != NULL)
{
__asm { MOV ECX, pCalc }
pCtor();
}

PADD pAdd = (PADD) GetProcAddress (hLib, "?Add@CCalc@@QAEHHH@Z");
if (pAdd != NULL)
{
__asm { MOV ECX, pCalc }
int nSum = pAdd (15, 10);

printf ("sum = %d\n", nSum);
}

free(pCalc);
}

FreeLibrary(hLib);
return 0;
}

Класс CCalc в данном примере очень простой:
#ifdef TEST_DLL_EXPORTS
#define TEST_DLL_API __declspec(dllexport)
#else
#define TEST_DLL_API __declspec(dllimport)
#endif

class TEST_DLL_API CCalc
{
public:
CCalc();
int Add(int x, int y);
};