如何将数据存储在动态二维数组中,该数组在 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&lt;SUBOBJECTS&gt; 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++ 中的另一个结构中也使用的结构中声明的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串(来自具有 n 行数的文件)存储在动态数组中? C++

如何在 C++ 中获取二维动态数组的行数和列数

C#/Java 如何存储二维数组,与 C++ 不同?

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]

如何在 C++ 中正确使用动态分配的多维数组 [重复]

如何在 C++ 中为二维对象数组分配内存? [复制]