На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Аварийное завершение программы при отрисовке образцов iml-значков

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3
RSS
Аварийное завершение программы при отрисовке образцов iml-значков
 
Здравствуйте!

Символ _Z9strmyncpyPcPKc реализован в библиотеке mapacces. Поэтому, если мы производим предварительную подгрузку этой библиотеки с помощью LD_PRELOAD, линковщик находит данный символ (в выводе команды ldd отсутствует строка undefined symbol с данным символом).

Поскольку при работе программы возникает сообщение об отсутствии этого символа, вероятно некорректно линкуется библиотека mapacces (хотя присланный Вами фрагмент памяти программы говорит о том, что она подгружена).

Для того, чтобы воспроизвести одинаковое поведение, мы немного модифицировали предыдущий фрагмент кода.
Теперь он выводит образцы всех объектов из классификатора для карт Ногинска и Shape из состава ГИС Оператор SE (классификаторы обеих карт ссылаются на библиотеку shape.iml64):
Код
#include <assert.h>
#include <iostream>

#include <QImage>

#include "mapapi.h"

void PaintObject(HMAP mapHandle, HRSC rscHandle, HOBJ objectHandle, int rscObjectNumber)
{
  // Получить номер функции отображения и параметры из классификатора
  long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscObjectNumber);
  assert(rscObjectFunctionNumber);
  std::cout << "rsc object function number: " << rscObjectFunctionNumber << std::endl;

  char* rscObjectParameters = (char*)mapGetRscObjectParameters(rscHandle, rscObjectNumber);
  assert(rscObjectParameters);

  // Запросить параметры палитры карты (для отображения объекта)
  COLORREF palette[256];
  long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle);
  mapGetSitePalette(mapHandle, mapHandle, palette, colorCount);

  // Выделить память для отрисовки объекта
  const int ICON_SIZE = 32;
  XIMAGEDESC ximageDesc;
  ximageDesc.Width = ICON_SIZE;
  ximageDesc.Height = ICON_SIZE;
  ximageDesc.Depth = 32;
  ximageDesc.CellSize = ximageDesc.Depth / 8;
  ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;

  char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
  ximageDesc.Point = paintMemory;
  assert(paintMemory);

  // Отрисовать образец объекта
  RECT rectDraw;
  rectDraw.left = 0;
  rectDraw.top = 0;
  rectDraw.right = ICON_SIZE;
  rectDraw.bottom = ICON_SIZE;

  char *objectText = NULL;
  long objectLocal = mapObjectLocal(objectHandle);
  long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber,
                                                       rscObjectParameters, colorCount, palette, objectText, objectLocal);
  assert(isPainted);

  // Вывести картинку в файл
  QImage image((uchar*)(ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_RGB32);
  image.save("/tmp/out.png");
}

int main()
{
  // Открыть карту
  HMAP mapHandle = mapOpenData("/usr/Operator11/Data/Shape/shape.sitx");
  //  HMAP mapHandle = mapOpenData("/usr/Operator11/Data/Noginsk/Noginsk.sit");
  assert(mapHandle);

  // Получить классификатор
  HRSC rscHandle = mapGetRscIdent(mapHandle, mapHandle);
  assert(rscHandle);

  // Создать объект в памяти
  HOBJ objectHandle = mapCreateObject(mapHandle);
  assert(objectHandle);

  // Отрисовать объекты из классификатора
  for (int rscObjectNumber = 1; rscObjectNumber <= mapGetRscObjectCount(rscHandle); rscObjectNumber++)
  {
    std::cout << "current object number: " << rscObjectNumber << std::endl;
    PaintObject(mapHandle, rscHandle, objectHandle, rscObjectNumber);
  }

  mapFreeObject(objectHandle);
  mapCloseData(mapHandle);
  mapCloseMapAccess();

  return 0;
}
Библиотека libqdmapacces.so из состава ГИС Конструктор при этом линкуется статически:
Код
INCLUDEPATH += /usr/share/qt4/include
LIBS += -lqdmapacces

SOURCES += \
  main.cpp
Мы протестировали корректное выполнение этого кода для отрисовки значков объектов данных карт на сертифицированной версии ГИС Конструктор.
Пожалуйста, попробуйте запустить данное приложение. Спасибо!
 
Цитата
Александр Савелов написал:
Пожалуйста, попробуйте запустить данное приложение. Спасибо!
Добрый день, спасибо. Попробовал запустить этот пример. Отработало без падений.
Попробую в ближайшее время провести другие эксперименты.
Страницы: Пред. 1 2 3
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности