qt — & quot; место чтения нарушения доступа 0x00000000 & quot; GDAL WKT Переполнение стека

Я работаю на ГИС-системе и использую базу данных для хранения координат. Я читаю координаты из базы данных с помощью QT API. Я получаю координаты из базы данных в формате WKT (Хорошо известный текст). Далее я пытаюсь построить типы GDAL (OGRGeometry) из WKT. Геометрия является абстрактным классом, а Point наследует Geometry. Я пытаюсь использовать функцию, специально для Point. И когда я отлаживаю, есть ошибка в последнем столбце. Ошибка «» Место чтения нарушения доступа 0x00000000 «»

`QString qsWKT = model.data(model.index(0, 0)).toString();
std::string temp(qpszWKT.toStdString());
char* pszWkt = (char*)temp.c_str();
OGRGeometry* new_geom;
OGRErr err = OGRGeometryFactory::createFromWkt(&pszWkt, NULL, &new_geom);
if(new_geom->getGeometryName() == "Point") { qDebug() << "good";}`

-1

Решение

Согласно документы о OGRGeometryFactory::createFromWkt (найдено с помощью Google), ваш new_geom «будет НЕДЕЙСТВИТЕЛЕН, если метод потерпит неудачу».

Теперь, если вы получаете возвращаемое значение OGRERR_NONE но и это NULLТогда есть несколько возможностей:

  1. Код, в котором вы проверили возвращаемое значение, неверен (не показан в вопросе).
  2. В библиотеке есть ошибка.
  3. Есть некоторая недокументированная ситуация ошибки, где вы получаете комбинацию этого NULL но также OGRERR_NONE возвращаемое значение

Что бы это ни было, вы все равно должны проверить, что NULLи интерпретировать это как неопределенную ошибку.


Тогда возникает вопрос, почему вы получаете ошибку. Я предлагаю вам добавить эти отладочные отпечатки:

qDebug() << "qsWKT:" << qsWKT;
qDebug() << "hexdump:" << QByteArray(pszWKT).toHex();

Затем посмотрите на них и попытайтесь выяснить, есть ли у вас некоторые из них:

  • просто неверный формат WKT
  • неожиданный пробел (используйте QString::trimmed() или даже QString::simplified() чинить)
  • несоответствие кодировки текста исходным данным до их преобразования в QString UTF16
  • несоответствие кодировки текста при конвертации из QString в std::string

WKT, вероятно, должен быть 7-битным ASCII, поэтому, если этот шестнадцатеричный дамп показывает какие-либо значения, >= 0x80, тогда вы точно знаете, что у вас есть проблема с кодировкой или повреждением данных.

2

Другие решения


По вопросам рекламы [email protected]