如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明
Posted
技术标签:
【中文标题】如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明【英文标题】:How to store data in a dynamic 2D array, declared inside a struct which is also used by another struct in C++ 【发布时间】:2016-08-29 20:30:21 【问题描述】:我正在尝试调试其他人的代码,但我无法将文件中的数据读取到头文件中声明的变量中。我从 .C 和 .H 文件中附加了 sn-p。
//main.C
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include "test.H"
int main()
Initialize();
return(0);
//test.C.
#include <fstream>
#include <utility>
#include <iostream>
#include <string>
#include <cstring>
#include "test.H"
#include "BB.H"
using namespace std;
#define file_to_be_read "file_to_be_read"
int NUM[10] = 3,2,3,4,5,2,3,1,3,4;
OBJECTS * OBJECTS::m_list[10];
void OBJECTS::createObjects()
//cout << "Print somethin'" << endl;
OBJECTS * objs = new OBJECTS(A_size, NUM[A]);
m_list[A] = objs;
objs = new OBJECTS(B_size, NUM[B]);
m_list[B] = objs;
objs = new OBJECTS(C_size, NUM[C]);
m_list[C] = objs;
objs = new OBJECTS(D_size, NUM[D]);
m_list[D] = objs;
objs = new OBJECTS(E_size, NUM[E]);
m_list[E] = objs;
objs = new OBJECTS(F_size, NUM[F]);
m_list[F] = objs;
objs = new OBJECTS(G_size, NUM[G]);
m_list[G] = objs;
objs = new OBJECTS(H_size, NUM[H]);
m_list[H] = objs;
objs = new OBJECTS(I_size, NUM[I]);
m_list[I] = objs;
objs = new OBJECTS(J_size, NUM[J]);
m_list[J] = objs;
char name[100];
sprintf(name,file_to_be_read);
ifstream fin(name);
// Load the file.
string buf;
for (int i = 0; i < 10; i++)
objs = m_list[i];
for (int j = 0; j < NUM[i]; j++)
fin >> buf; // read separator line.
cout << buf << endl;
for (int k = 0; k < objs->size_m; k++)
fin >> buf;
cout << buf << endl;
fin >> objs->sub_objs[j].coords[k][0]; // Segmentation error
fin >> objs->sub_objs[j].coords[k][1];
void Initialize()
OBJECTS::createObjects();
test.H 文件
#ifndef _test_H
#define _test_H
#include <cmath>
#include <cassert>
#include <vector>
#define A 0
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
#define H 7
#define I 8
#define J 9
extern int NUM[];
//////////////////////
struct SUBOBJECTS
SUBOBJECTS(int size)
coords = new double[size][2];
double (*coords)[2];
;
//////////////////////
struct OBJECTS
OBJECTS(int size, int number) :
size_m(size), num_m(number)
std::vector<SUBOBJECTS> sub_objs(number,size);
static void createObjects();
static OBJECTS * m_list[10];
SUBOBJECTS * sub_objs;
int size_m;
int num_m;
;
void Initialize();
#endif
//BB.H
const int A_size = 2;
const int A_size = 2;
const int B_size = 3;
const int C_size = 3;
const int D_size = 2;
const int E_size = 2;
const int F_size = 1;
const int G_size = 1;
const int H_size = 3;
const int I_size = 3;
const int J_size = 2;
file_to_be_read
#######################
0.658 1.291
1.891 1.753
#----------------------
2.570 2.955
3.747 3.417
#----------------------
3.658 4.141
5.096 2.800
#######################
5.293 1.842
4.518 1.511
6.215 1.450
#----------------------
6.113 3.239
5.960 3.966
7.033 2.842
#######################
0.658 1.291
1.919 1.720
2.404 2.998
#----------------------
3.674 3.536
4.073 3.004
4.379 4.781
#----------------------
3.915 5.534
3.063 5.270
4.417 6.366
#######################
5.500 5.125
5.850 4.551
#----------------------
5.997 5.958
0.658 1.291
#----------------------
1.899 1.698
2.455 3.008
#----------------------
3.751 3.337
4.562 3.037
#######################
3.962 4.032
2.945 4.456
#----------------------
1.997 4.312
3.125 4.921
#----------------------
5.212 4.220
5.982 3.896
#----------------------
5.386 4.685
0.658 1.291
#----------------------
1.873 1.711
2.481 2.999
#######################
1.556 4.164
#----------
0.658 1.291
#######################
1.891 1.753
#----------------------
0.658 1.291
#----------------------
1.919 1.720
#######################
0.658 1.291
1.841 1.793
1.894 1.773
#######################
0.658 1.291
1.894 1.773
2.486 3.006
#----------------------
3.032 2.690
3.045 1.710
3.546 3.682
#----------------------
3.561 4.989
3.219 5.337
3.915 5.627
#######################
3.995 3.220
3.982 2.227
#---------------------
4.348 3.863
1.467 4.890
#---------------------
1.467 4.890
2.201 4.539
#---------------------
2.842 3.762
2.115 5.051
我了解sub_objs
的定义有问题。但我不知道是什么。为了在公共论坛上发帖,我不得不稍微修改变量和代码。请记住与此相关的任何错误并提供帮助!
【问题讨论】:
您是否遇到构建错误(您应该!)?然后请包含构建的完整输出,完整且未经编辑。通过编辑您的问题将其包含在问题正文中。也请read about how to ask good questions,并学习如何创建Minimal, Complete, and Verifiable Example。 另外,每当你认为你需要一个“动态数组”时,你的下一个想法应该是std::vector
。此外,您是否考虑过更好地对 structure 中的值进行分组,而不是数组向量(或向量向量),因此您只有一个结构向量(或数组)?这可能会帮助您解决一些问题(甚至可能更合乎逻辑)。
我已经编辑了代码,现在它可以正常编译并重现上述行的分段错误。
你希望这条线做什么std::vector<SUBOBJECTS> sub_objs(number,size);
?
【参考方案1】:
在OBJECTS
构造函数中,您有以下行:
std::vector<SUBOBJECTS> sub_objs(number,size);
这声明了一个名为sub_objs
的本地 变量。一旦析构函数退出,这个变量就会超出范围。它也与OBJECTS::sub_objs
member 变量没有任何关系。
所以你永远不会在任何地方初始化OBJECTS::sub_objs
成员变量,这意味着它的值将是indeterminate,并且以任何方式使用它都会导致未定义的行为和你看到的崩溃。
有两种解决方案:
由于member变量是一个指针,你需要使用new[]
为其分配内存。
将成员变量的类型改为向量,在OBJECTS
构造函数初始化列表中构造。
【讨论】:
【参考方案2】:那么这部分是做什么的呢?
struct SUBOBJECTS
SUBOBJECTS(int size)
coords = new double[size][2]; // [2]
double (*coords)[3]; // [3]
;
它声明了一个包含 3 个双精度数的数组,然后声明了一个包含 2 个双精度数的数组。 这可能会导致严重的问题。
如果num
的大小为 10,则您为 20 个双打分配空间,但声明为 30 个双打。
【讨论】:
感谢您的关注。我已经编辑了代码,它现在重现了我想要的错误。以上是关于如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明的主要内容,如果未能解决你的问题,请参考以下文章