HP GCC и C++

Изображение пользователя Serguei_Tarassov.

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

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

Предположим, вы установили пакет в каталог 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.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
Да Автор: Serguei_Tarassov
Без printf Автор: Serguei_Tarassov
Ждём. Автор: AtH
Пусть Автор: Serguei_Tarassov
Вроде бы Автор: Serguei_Tarassov
ASCII Автор: Serguei_Tarassov
Нет Автор: AtH
сайт hpgcc.org Автор: Alex (не проверено)
Меcто на SF Автор: Serguei_Tarassov
Так там только Автор: Alexav1000
Разве? Автор: Serguei_Tarassov