HP 50g и C++

| рубрика «Калькуляторы» | автор st
Метки:

Пакет HPGCC для разработки программ калькуляторов серии HP 48, HP 49, HP 50g на языке Си может также с небольшими изменениями настроек использоваться для программирования на C++.

Вначале необходимо скачать и установить пакет для разработки (http://sourceforge.net/projects/hpgcc/). В него входят компиляторы GNU, библиотеки, заголовочные файлы, исходники и собственно простая среда разработки на базе Programmer Notepad.

Предположим, вы установили пакет в каталог C:\HPGCC. В корне лежит файл "Default_Makefile". Сделаем его резервную копию, затем запустим нашу среду (Start -- HPGCC 2.0 for Windows -- HPGCC Programmer's Notepad) и откроем в ней Default_Makefile-файл. Делаем замену .c на .cpp, а к опциям компилятора (строка 66, ARM_ELF_CFLAGS=...) добавляем -fno-rtti -fno-exceptions и сохраняем.

Создаем в среде новый файл, скопируем в него текст из примера "Hello, world!" (examples\hiworld.c). Сделаем небольшие изменения: обернем include главного заголовочного файла.

#ifdef __cplusplus
#define size_t long unsigned int
extern "C" {
#endif
#include <hpgcc49.h>    // the standard HP lib
#ifdef __cplusplus
}
#endif

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

Сохраняем файл под именем, например, hello2.cpp и жмем Ctrl+F7. Компиляция и сборка проходят успешно.

Теперь проверим "сиплюсплюснутость". Добавим перед основной функцией простенький класс.

class MyClass
{
public:
    MyClass() {}
    void SayHello()  { printf("Hello, World!"); }
};

Однако, попытка компоновки вызывает ошибку: не определены основные операторы работы с памятью в Си++: new и delete.

Это понятно, т.к. компоновать нужно с библиотеками типа libsupc++.a или libstdc++.a. Первая из них доступна на том же сайте HPGCC, но пока не входит в пакет и является неофициальной.

Тем не менее, разработчики подсказывают, что если просто руками добавить соответствующие операторы, то выделение памяти будет работать и в существующем пакете.

Добавляем операторы перед нашим классом. Полный текст программы будет выглядеть так.

#define TINY_PRINTF

#ifdef __cplusplus
#define size_t long unsigned int
extern "C" {
#endif
#include <hpgcc49.h>        // the standard HP lib
#ifdef __cplusplus
}
#endif

void * operator new(size_t size)
{
    void *ptr = malloc(size);
    return ptr;
}

void * operator new[](size_t size)
{
    void *ptr = malloc(size);
    return ptr;
}

void operator delete(void *p)
{
    free(p);
}


class MyClass
{
public:
    MyClass() {}
    void SayHello()  {printf("Hello, World!");}
};

int main(void)
{
    clear_screen();
    MyClass *hello = new MyClass();
    hello->SayHello();
    WAIT_CANCEL;  // loop until ON pressed
    delete hello;
}

После компиляции и компоновки в каталоге исходного файла должен появиться hello2.hp для выполнения на конечном устройстве.

Если физического устройства нет, можно воспользоваться мощным эмулятором ПМК серии HP-48/49/50 под названием Debug4x, детально показывающим даже внешний вид калькулятора. Его можно загрузить на сайте разработчиков (англ.яз.): http://www.debug4x.com. Эмулятор, кстати, написан на Delphi.