Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
1

Неожиданное завершение программы

30.05.2019, 04:15. Показов 1311. Ответов 10

Author24 — интернет-сервис помощи студентам
Доброй ночи уважаемые форумчане.
Собственно опишу всё попорядку.
Перед тем как начну хотелось бы сказать, на С++ я практически и не писал никогда (потихоньку изучаю), поэтому не кидайте тапками.
Использую Qt Creator 4.9.0 на основе Qt 5.12.2 под MSVC 2017 64bit.
Начал писать программу для открытия формата *.shp и базы *.dbf. с помощью GDAL/OGR 2.3 , получения данных из формата и в будущем отрисовка (но это пока не важно).
Какие - то простые реализации в один класс и точку входа у меня получались ( допустим семантику по объекту получить ), но вот с такой структурой ничего не выходит. Программа запускается и по qDebug() ложится в одном из двух больших методов.
Вот структура проекта и код:
include
- configurationshape.h
- mapview.h
- openshapefile_and_get_data.h
- point_x_y.h
- shapeconf.h
src:
- configurationshape.cpp
- main.cpp
- mapview.cpp
- openshapefile_and_get_data.cpp
- point_x_y.cpp
- shapeconf.cpp

Собственно код:
configurationshape.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef CONFIGURATIONSHAPE_H
#define CONFIGURATIONSHAPE_H
#include <iostream>
 
#include "ogr_api.h"
#include "ogr_attrind.h"
 
class configurationshape
{
public:
    configurationshape( );
    ~configurationshape( );
 
    /* Рамка */
    double fMaxX;
    double fMaxY;
    double fMinX;
    double fMinY;
 
    /* Размеры карты */
    int sizeX;
    int sizeY;
 
    /* Имя слоя */
    std::string NameLayer;
 
    /* Имя драйвера */
    std::string NameDriver;
 
    /* Количество объектов */
    int NumObject;
 
    /* Тип геометрии */
    std::string TypeGeom;
};
 
#endif // CONFIGURATIONSHAPE_H
configurationshape.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "configurationshape.h"
 
configurationshape::configurationshape( )
{
 
}
 
configurationshape::~configurationshape( )
{
 
}
openshapefile_and_get_data.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef OPENSHAPEFILE_AND_GET_DATA_H
#define OPENSHAPEFILE_AND_GET_DATA_H
#include <QDebug>
 
#include "gdal.h"
#include "gdal_priv.h"
 
#include "ogr_api.h"
#include "ogr_attrind.h"
#include "ogr_core.h"
#include "ogrsf_frmts.h"
 
#include "configurationshape.h"
#include "shapeconf.h"
#include "point_x_y.h"
 
class point_X_Y;
class ShapeConf;
class configurationshape;
 
class OpenShapefile_and_get_data
{
private:
    const char* filenameSHP;
 
public:
    OpenShapefile_and_get_data( );
    ~OpenShapefile_and_get_data( );
 
    OGRErr err;
 
    /* Проверка на то, открыт ли файл */
    std::string isOpen( GDALDataset* data );
 
    /* Проверка векторный ли файл и если смысл его обрабатывать */
    std::string isVector ( GDALDataset* data );
 
    /* С учетом использования Меркартовской проекции */
    point_X_Y getX_Y( double lon, double lat, int height, int width );
 
    /* Тоже преобразование, но для рамки */
    double getX( double lon, int width );
    double getY( double lat, int height, int width );
 
    const char* get_filenameSHP(  );
    void set_filenameSHP( const char* filename );
    void Open_SHP_file( const char* pszFilename, configurationshape *c, ShapeConf *p );
 
    /* Получение:
     *              -   ограничительной рамки,
     *              -   размеров карты,
     *              -   имя слоя,
     *              -   имя драйвера,
     *              -   количества объектов,
     *              -   системы координат,
     *              -   типа геометрии
     */
    void GetConfigurationFromShapefile( GDALDataset *dataS, OGRLayer* dataL, configurationshape *c );
 
    /* Получение геометрии полигона */
    void GetGeometryPolygonFromShapefile( GDALDataset *dataS, OGRLayer* dataL, ShapeConf *p );
 
};
 
#endif // OPENSHAPEFILE_AND_GET_DATA_H
openshapefile_and_get_data.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include "openshapefile_and_get_data.h"
 
OpenShapefile_and_get_data::OpenShapefile_and_get_data( )
{
 
}
 
OpenShapefile_and_get_data::~OpenShapefile_and_get_data( )
{
 
}
 
std::string OpenShapefile_and_get_data::isOpen( GDALDataset *dataS )
{
    try
    {
        if ( !dataS )
        {
            throw dataS;
 
        } else
        {
            return "File be was opened!";
        }
 
    } catch ( ... )
    {
        return "Error opening file!";
    }
}
 
std::string OpenShapefile_and_get_data::isVector( GDALDataset *dataS )
{
    if ( dataS->GetRasterCount( ) == 0 && dataS->GetLayerCount( ) > 0 )
    {
        return "The data source has a vector data type and has " +
               std::to_string( dataS->GetLayerCount( ) ) +
               " layer(s)!";
 
    } else
    {
        return "The data source has a raster data type! Execution stopped!";
    }
}
 
point_X_Y OpenShapefile_and_get_data::getX_Y( double lon, double lat, int height, int width )
{
    point_X_Y p;
    double x = fmod( ( width * ( 180 + lon ) / 360 ), ( width + ( width / 2 ) ) );
    double PI = 3.14159265359;
    double latRad = lat * PI / 180;
    double mercN = log( tan( ( PI / 4 ) + ( latRad / 2 ) ) );
    double y = ( height / 2 ) - ( width * mercN / ( 2 * PI ) );
    p.X = x;
    p.Y = y;
    return p;
}
 
double OpenShapefile_and_get_data::getX( double lon, int width )
{
   double x = fmod( ( width * ( 180 + lon ) / 360 ), ( width + ( width / 2 ) ) );
   return x;
}
 
double OpenShapefile_and_get_data::getY(double lat, int height, int width)
{
    double PI = 3.14159265359;
    double latRad = lat * PI / 180;
    double mercN = log( tan( ( PI / 4 ) + ( latRad / 2 ) ) );
    double y = ( height / 2 ) - ( width * mercN / ( 2 * PI ) );
    return y;
}
 
const char *OpenShapefile_and_get_data::get_filenameSHP( )
{
    return filenameSHP;
}
 
void OpenShapefile_and_get_data::set_filenameSHP( const char *filename )
{
    filenameSHP = filename;
}
 
void OpenShapefile_and_get_data::Open_SHP_file( const char *pszFilename, configurationshape *c, ShapeConf *p )
{
    GDALAllRegister( );             /* Регистрация драйвера */
    GDALDataset* inDS = static_cast < GDALDataset * > ( GDALOpenEx ( pszFilename ,
                                                                     GDAL_OF_VECTOR ,
                                                                     nullptr,
                                                                     nullptr,
                                                                     nullptr ) );
 
    isOpen( inDS );                 // Проверка открытия файла
    isVector( inDS );               // Вектор или растр, если вектор, то выходим
 
    qDebug() << "norm";
    OGRLayer* nowLayer = nullptr;
    qDebug() << "norm";
    GetConfigurationFromShapefile( inDS, nowLayer, c );
    qDebug() << "norm";
    GetGeometryPolygonFromShapefile( inDS, nowLayer, p );
    qDebug() << "norm";
}
 
void OpenShapefile_and_get_data::GetConfigurationFromShapefile( GDALDataset *dataS, OGRLayer *dataL, configurationshape *c )
{
    OGRErr err;
    qDebug() << "norm1";
    /* Получение размеров карты ( высота/height - y и ширина/width - x) */
    c->sizeX = dataS->GetRasterXSize( );
    c->sizeY = dataS->GetRasterYSize( );
    qDebug() << "norm2";
 
    /* Получение ограничительной рамки и их преобразование в X и Y */
    OGREnvelope Envelope;
    qDebug() << "norm3";
    err = dataL ->GetExtent( &Envelope, true );
    qDebug() << err;
    qDebug() << "norm4";
    c->fMaxX = getX( Envelope.MaxX, c->sizeX );
    c->fMinX = getX( Envelope.MinX, c->sizeX );
    c->fMaxY = getY( Envelope.MaxY, c->sizeY, c->sizeX );
    c->fMinY = getY( Envelope.MinY, c->sizeY, c->sizeX );
    qDebug() << "norm5";
    /* Получение имя слоя */
    c->NameLayer = dataL->GetName( );
    qDebug() << "norm6";
    /* Получение имя драйвера */
    c->NameDriver = dataS->GetDriver( )->GetDescription( );
    qDebug() << "norm7";
    /* Получение количества объектов */
    c->NumObject = static_cast< int >( dataL->GetFeatureCount( ) ) ;
 
    qDebug() << "norm8";
    /* Получение типа геометрии */
    OGRFeatureDefn* dataFD = dataL->GetLayerDefn( );
    c->TypeGeom =  OGRGeometryTypeToName( OGR_FD_GetGeomType( dataFD ) );
    dataFD->DestroyFeatureDefn( dataFD );
}
 
void OpenShapefile_and_get_data::GetGeometryPolygonFromShapefile( GDALDataset *dataS, OGRLayer *dataL, ShapeConf *p )
{
    int sizeX = dataS->GetRasterXSize( );
    int sizeY = dataS->GetRasterYSize( );
 
    auto NumberOfFeatures = dataL->GetFeatureCount( true );
    dataL->ResetReading( );
    p->indf = static_cast< int > ( NumberOfFeatures );
    OGRFeature *poFeature;
    ShapeConf::PolygonFeature Polygon;
    OGRPoint ptTemp;
    for ( int i = 0; i < NumberOfFeatures; ++i )
    {
        poFeature = dataL->GetNextFeature( );
        OGRGeometry *poGeometry;
        poGeometry = poFeature ->GetGeometryRef();
 
        /* Семантика */
        for (int i = 0; i < poFeature->GetFieldCount(); ++i )
        {
            p->SemanticName.push_back( poFeature->GetDefnRef( )->GetFieldDefn( i )->GetNameRef( ) );
            p->SemanticValue.push_back( poFeature->GetFieldAsString( i ) );
        }
 
        if ( poGeometry != nullptr && wkbFlatten ( poGeometry ->getGeometryType() ) == wkbPolygon )
        {
            OGRPolygon *poPolygon = static_cast<OGRPolygon*> (poGeometry);
            Polygon.PolygonsOfFeature.resize(1);
            int NumberOfInnerRings = poPolygon ->getNumInteriorRings();
            OGRLinearRing *poExteriorRing = poPolygon ->getExteriorRing();
            Polygon.PolygonsOfFeature.at(0).Polygon.resize( static_cast< unsigned long long int >( NumberOfInnerRings+1 ) );
            Polygon.PolygonsOfFeature.at(0).Polygon.at(0).IsClockwised = poExteriorRing ->isClockwise();
            int NumberOfExteriorRingVertices = poExteriorRing ->getNumPoints();
            Polygon.PolygonsOfFeature.at(0).Polygon.at(0).RingString.resize( static_cast< unsigned long long int >( NumberOfExteriorRingVertices ));
            for ( int k = 0; k < NumberOfExteriorRingVertices; k++ )
            {
                poExteriorRing ->getPoint(k,&ptTemp);
                ShapeConf::MyPoint2D pt;
                point_X_Y pxy = getX_Y( ptTemp.getX( ), ptTemp.getY( ), sizeY, sizeX );
                pt.dX = pxy.X;
                pt.dY = pxy.Y;
                Polygon.PolygonsOfFeature.at(0).Polygon.at(0).RingString.at(static_cast< unsigned long long int >( k ) ) = pt;
            }
            for ( int h = 1; h <= NumberOfInnerRings; h++ )
            {
                OGRLinearRing *poInteriorRing = poPolygon ->getInteriorRing(h-1);
                Polygon.PolygonsOfFeature.at(0).Polygon.at( static_cast< unsigned long long int >( h ) ).IsClockwised = poInteriorRing ->isClockwise();
                int NumberOfInteriorRingVertices = poInteriorRing ->getNumPoints();
                Polygon.PolygonsOfFeature.at(0).Polygon.at( static_cast< unsigned long long int >( h ) ).RingString.resize( static_cast< unsigned long long int >( NumberOfInteriorRingVertices ) );
                for ( int k = 0; k < NumberOfInteriorRingVertices; k++ )
                {
                    poInteriorRing ->getPoint(k,&ptTemp);
                    ShapeConf::MyPoint2D pt;
                    point_X_Y pxy = getX_Y( ptTemp.getX( ), ptTemp.getY( ), sizeY, sizeX );
                    pt.dX = pxy.X;
                    pt.dY = pxy.Y;
                    Polygon.PolygonsOfFeature.at(0).Polygon.at( static_cast< unsigned long long int >( h ) ).RingString.at( static_cast< unsigned long long int >( k ) ) = pt;
                }
            }
                p->PolygonLayer.push_back( Polygon );
        }
        else if ( poGeometry != nullptr && wkbFlatten ( poGeometry ->getGeometryType() ) == wkbMultiPolygon )
        {
            OGRMultiPolygon *poMultiPolygon = static_cast<OGRMultiPolygon*> (poGeometry);
            int NumberOfGeometries = poMultiPolygon ->getNumGeometries();
            Polygon.PolygonsOfFeature.resize( static_cast< unsigned long long int >( NumberOfGeometries ) );
            for ( int j = 0; j < NumberOfGeometries; j++ )
            {
                OGRGeometry *poPolygonGeometry = poMultiPolygon ->getGeometryRef(j);
                OGRPolygon *poPolygon = static_cast<OGRPolygon*> (poPolygonGeometry);
                int NumberOfInnerRings = poPolygon ->getNumInteriorRings();
                OGRLinearRing *poExteriorRing = poPolygon ->getExteriorRing();
                Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.resize( static_cast< unsigned long long int >( NumberOfInnerRings+1 ) );
                Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at(0).IsClockwised = poExteriorRing ->isClockwise();
                int NumberOfExteriorRingVertices = poExteriorRing ->getNumPoints();
                Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at(0).RingString.resize( static_cast< unsigned long long int >( NumberOfExteriorRingVertices ) );
                for ( int k = 0; k < NumberOfExteriorRingVertices; k++ )
                {
                    poExteriorRing ->getPoint(k,&ptTemp);
                    ShapeConf::MyPoint2D pt;
                    point_X_Y pxy = getX_Y( ptTemp.getX( ), ptTemp.getY( ), sizeY, sizeX );
                    pt.dX = pxy.X;
                    pt.dY = pxy.Y;
                    Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at(0).RingString.at( static_cast< unsigned long long int >( k ) ) = pt;
                }
                for ( int h = 1; h <= NumberOfInnerRings; h++ )
                {
                    OGRLinearRing *poInteriorRing = poPolygon ->getInteriorRing(h-1);
                    Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at( static_cast< unsigned long long int >( h ) ).IsClockwised = poInteriorRing ->isClockwise();
                    int NumberOfInteriorRingVertices = poInteriorRing ->getNumPoints();
                    Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at( static_cast< unsigned long long int >( h ) ).RingString.resize( static_cast< unsigned long long int >( NumberOfInteriorRingVertices ) );
                    for ( int k = 0; k < NumberOfInteriorRingVertices; k++ )
                    {
                        poInteriorRing ->getPoint(k,&ptTemp);
                        ShapeConf::MyPoint2D pt;
                        point_X_Y pxy = getX_Y( ptTemp.getX( ), ptTemp.getY( ), sizeY, sizeX );
                        pt.dX = pxy.X;
                        pt.dY = pxy.Y;
                        Polygon.PolygonsOfFeature.at( static_cast< unsigned long long int >( j ) ).Polygon.at( static_cast< unsigned long long int >( h ) ).RingString.at( static_cast< unsigned long long int >( k ) ) = pt;
                    }
                }
            }
            p->PolygonLayer.push_back(Polygon);
        }
        OGRFeature::DestroyFeature(poFeature);
    }
 
}
point_x_y.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef POINT_X_Y_H
#define POINT_X_Y_H
 
 
class point_X_Y
{
public:
    point_X_Y( );
    ~point_X_Y( );
 
    double X;
    double Y;
};
 
#endif // POINT_X_Y_H
point_x_y.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "point_x_y.h"
 
point_X_Y::point_X_Y( )
{
 
}
 
point_X_Y::~point_X_Y( )
{
 
}
shape_conf.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef SHAPECONF_H
#define SHAPECONF_H
#include <iostream>
 
#include "ogr_api.h"
#include "ogr_attrind.h"
 
class ShapeConf
{
public:
    ShapeConf( );
    ~ShapeConf( );
 
    /* Точка */
    typedef struct MyPoint2D
    {
        double dX;
        double dY;
    } MyPoint2D;
 
    /* Мультиточка */
    typedef struct MultipointFeature
    {
        std::vector< MyPoint2D > PointsOfFeature;
 
    } MultipointFeature;
 
    /* Линия */
    typedef struct MyLine2D
    {
        std::vector< MyPoint2D > LineString;
 
    } MyLine2D;
 
    /* Линейный объект */
    typedef struct LineFeature
    {
        std::vector< MyLine2D > LinesOfFeature;
 
    } LineFeature;
 
    /* Окружность */
    typedef struct MyRing2D
    {
        std::vector< MyPoint2D > RingString;
        bool IsClockwised;
 
    } MyRing2D;
 
    /* Полигон */
    typedef struct MyPolygon2D
    {
        std::vector< MyRing2D > Polygon;
 
    } MyPolygon2D;
 
    /* Многоугольник */
    typedef struct PolygonFeature
    {
        std::vector< MyPolygon2D > PolygonsOfFeature;
 
    } PolygonFeature;
 
    /* вектор для ShapeFile содержащий данные точек */
    std::vector< MyPoint2D > PointLayer;
 
    /* вектор для Shapefile содержащий данные множества точек */
    std::vector< MultipointFeature > MultipointLayer;
 
    /* вектор для Shapefile содержажщий данные линий */
    std::vector< LineFeature > LineLayer;
 
    /* вектор для Shapefile содержащий данные полигонов */
    std::vector< PolygonFeature > PolygonLayer;
 
    int indf = 0;   /* идендификатор объекта */
    std::vector < std::string > SemanticName;
    std::vector < std::string > SemanticValue;
};
 
#endif // POLYGONCONF_H
shape_conf.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "shapeconf.h"
 
ShapeConf::ShapeConf( )
{
 
}
 
ShapeConf::~ShapeConf( )
{
 
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "mapview.h"
#include <QApplication>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << "start";
 
    OpenShapefile_and_get_data open;
    ShapeConf sc;
    configurationshape confshape;
 
    open.Open_SHP_file( "C:\\Users\\ARINGOT\\Desktop\\world_map\\TM_WORLD_BORDERS-0.3.shp", &confshape, &sc );
 
    qDebug() << confshape.NumObject;
 
 
    MapView w;
    w.show();
    qDebug() << "finish";
 
    return a.exec();
}
Программа крашится после нескольких секунд после запуска.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2019, 04:15
Ответы с готовыми решениями:

Неожиданное завершение программы
При нажатие правой стрелки, а потом левой, программа вылетает! Код: Левая: void...

Неожиданное завершение работы программы
Доброго, форум! Есть задание к курсовику: - Создать базу данных для хранения данных о самолётах...

Неожиданное завершение приложения
Есть многопоточное приложение, обменивающееся данными по сокетному соединению, в некоторых случаях(...

Полное завершение программы
Вот я дописал программу. Как теперь ее полностью сделать готовой для переноса на другие...

10
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718
30.05.2019, 09:36 2
Aringot, пожалуйста, указывайте точку падения программы (выявите через дебаг), и, желательно, путь до этой точки (очередность операций до этого действия).

Возможно, когда вы будете дебажить вопрос решится сам собой
0
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
30.05.2019, 12:40  [ТС] 3
Честно признаться, до этого момента у меня его не было, так как с Visual Studio он не поставляется, я просто подключал заголовок <QDebug> и смотрел когда программа упадёт и падала она тут:
openshapefile_and_get_data.cpp
C++ (Qt)
1
2
3
4
5
OGREnvelope Envelope;
    qDebug() << "norm3";
    err = dataL ->GetExtent( &Envelope, true );
    qDebug() << err;
    qDebug() << "norm4";
По мимо этого у меня ещё вылетает Segmentation fault ( сигнал SIGSEGV )

Сейчас ставлю дебагер и буду проверять, но от коментариев по делу бы неотказался бы.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
30.05.2019, 13:39 4
Очевидно же, нет?

C++ (Qt)
1
2
3
4
5
  OGRLayer* nowLayer = nullptr;
    qDebug() << "norm";
    GetConfigurationFromShapefile( inDS, nowLayer, c );
... // внутри метода GetConfigurationFromShapefile:
err = dataL ->GetExtent( &Envelope, true ); // dataL = nowLayer (обращение к nullptr)
0
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
30.05.2019, 14:02  [ТС] 5
Да, действительно, не инициализировал слой, а надо было
C++ (Qt)
1
OGRLayer* nowLayer = inDS->GetLayer( 0 );
Ночь делу не помощник в общем, но проблема осталась, но теперь уже во втором методе.
Который - GetGeometryPolygonFromShapefile
Дебагерные вставки показали что проблема начинается перед вхождением в цикл
C++ (Qt)
1
2
for ( int i = 0; i < NumberOfFeatures; ++i )
{
После запуска приложения получается что либо программа ложится перед вхождением, либо проходит пару строк под объявлением цикла и ложится.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
30.05.2019, 14:20 6
Теперь уже сложно по коду понять. По крайней мере нахрапом. По описанию проблемы - используемый объект где-то в другом потоке уничтожается. Если нет многопоточности, то я бы все же советовал дебажить каждый объект, проверять валидность, значения. Перечитать описание каждого используемого метода либы.
0
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
30.05.2019, 15:11  [ТС] 7
Тогда лучше задам обобщённый вопрос по данному случаю.
Скажем у меня есть два класса, в одном я добавляю данные, другой является, например, контейнером.
Ну и точка входа.
Вот код примера:
Пускай это будет контейнер
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
class num
{
public:
    num( );
    ~num( );
 
    typedef struct a
    {
       int x;
       int y;
    } a;
 
    std::vector <a> z;
};
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "num.h"
 
num::num()
{
 
}
 
num::~num()
{
 
}
пускай это будет класс с какими-то методами для добавлением данных:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <num.h>
 
class mat
{
public:
    mat();
    ~mat();
 
    void somthin( num *n );
    void s1( int *x );
};
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "mat.h"
 
mat::mat()
{
 
}
 
mat::~mat()
{
 
}
 
void mat::somthin( num &n )
{
    num::a sa;
    sa.x = 2;
    sa.y = 3;
    n.z.push_back( sa );
    n.z.push_back( sa );
}
и точка входа:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <QCoreApplication>
#include <mat.h>
#include <num.h>
#include <iostream>
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    mat m;
    num n;
 
    m.somthin( n );
    std::cout << "x = " << n.z.at( 0 ).x << "y = " << n.z.at( 0 ).y << std::endl;
 
    return a.exec();
}
Но почему то при таком написании я получению ошибку линковки
main.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "public: __cdecl num::num(void)" (??0num@@QEAA@XZ) в функции main
main.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "public: __cdecl num::~num(void)" (??1num@@QEAA@XZ) в функции "public: void * __cdecl num::`scalar deleting destructor'(unsigned int)" (??_Gnum@@QEAAPEAXI@Z)

По моей логике я описываю контейнер и класс с методами и создаю экземпляры этих классов в точке входа и передаю ссылку на мой объект - контейнер в экземляр класса с методами для добавления данных, а потом я уже хочу работать с этими данными.
Сразу прошу прощения, может быть я что то неправильно понимаю, если да, то укажите на мой косяк.
Пример выше это упрощённое изложение того кода что я прикладывал к вопросу темы.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
30.05.2019, 15:33 8
Я давненько так не писал, но рискну предположить:

C++ (Qt)
1
2
3
4
5
6
7
    typedef struct a
    {
       int x;
       int y;
    } a;
 
    std::vector <a> z;
Имя структуры и имя созданного объекта - одинаковые. Отсюда косяк с определением того, что ты пытаешься положить в вектор (<a>). Т.к. вектор - часть каждого объекта nam, компилятор творит фигню и ругается на что попало, пытаясь понять, как ему создавать и удалять объекты nam...
1
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
30.05.2019, 16:06  [ТС] 9
Горбаг, да, действительно, Ваше предположение оказалось верным, такая запись выполнилась:
C++ (Qt)
1
2
3
4
5
6
7
    typedef struct
    {
       int x;
       int y;
    } a;
 
    std::vector <a> z;
либо:
C++ (Qt)
1
2
3
4
5
6
7
    typedef struct a
    {
       int x;
       int y;
    } az;
 
    std::vector <az> z;
Спасибо, сейчас попробую решить вопрос с кодом в начале темы.
Изображения
 
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
30.05.2019, 17:49 10
В С++ проще написать без typedef,
C++
1
2
3
4
5
struct a
    {
       int x;
       int y;
    };
Этот код не скомпилируется в чистом С, но как бы с классами чистый С тоже работать не сможет.
0
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
31.05.2019, 02:30  [ТС] 11
TRam_, а можно подробнее, что - бы учитывать этот момент в будущем?
0
31.05.2019, 02:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2019, 02:30
Помогаю со студенческими работами здесь

Завершение программы из MainWindow
Здравствуйте, у меня такая проблема, что не могу понять как завершить программу не из мэйна При...

Аварийное завершение программы. Сигналы Слоты
Привет. Есть библиотека limereport, в которой есть функция- переносит сожержимое .xml файла в .pdf....

Завершение текущей программы из запускаемого процесса
Доброго времени суток. У меня имеется такая ситуация (пока все работает под винду): есть некая...

Завершение программы,при закрытии формы
Добрый день! Имеется 2 формы : главная и второстепенная. При нажатии на кнопку в главной форме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru