C++ 包含多个动态数组的c-struct分配

C++ 包含多个动态数组的c-struct分配,c++,arrays,serialization,struct,dynamic-memory-allocation,C++,Arrays,Serialization,Struct,Dynamic Memory Allocation,早上好 我想把样品储存在缓冲区里。为了便于将来的修改和内存管理,我想使用struct。例如: #define MAX_SAMPLES 999 #define NUM_VAR3 7 #define NUM_VAR4 18 struct SampleType { type1 var1; type2 var2; type3 var3[NUM_VAR3]; type4 var4[NUM_VAR4]; }; SampleType Buffer[MAX_SAMPLES];

早上好

我想把样品储存在缓冲区里。为了便于将来的修改和内存管理,我想使用struct。例如:

#define MAX_SAMPLES  999
#define NUM_VAR3       7
#define NUM_VAR4      18

struct SampleType
{
 type1 var1;
 type2 var2;
 type3 var3[NUM_VAR3];
 type4 var4[NUM_VAR4];
};

SampleType Buffer[MAX_SAMPLES];

到目前为止还不错。但是,我的问题是,我还想更改数组的大小。我想在程序开始时初始化MAX_SAMPLES、NUM_VAR3和NUM_VAR4,而不是硬编码。因此,初始化后仍然是一个容易处理的静态问题。我设想添加一个包含三个变量的头,从而能够将缓冲区存储并加载到文件中

有没有一种方法可以做到这一点,比如“结构黑客”(cf.)?如果是,如何在结构中使用多个动态数组

提前谢谢

致以最良好的祝愿, 弗洛里安


更新/解决方案:

谢谢,矢量完成了这个任务。缓冲区现在必须是std::vector。要坚持以上示例,请执行以下操作:

struct StaticSampleType {
type1 var1;
type2 var2;
};
StaticSampleType StaticSample;
std::vector<type3> var3;
std::vector<type4> var4;

std::vector<char> Buffer;
struct StaticSampleType{
1型var1;
2型var2;
};
StaticSampleType StaticSample;
std::向量var3;
std::向量var4;
向量缓冲区;

void函数每10ms调用一次(…)
{
静态无符号int BufferPos=Buffer\u StartAddr;//示例性
/*尽量使其易于编辑:*/
uint startAddress[]={(uint)和StaticSample,(uint)和var3[0],(uint)和var4[0]};
uint SizeToAdd[]={sizeof(StaticSampleType),var3.size()*sizeof(type3),var4.size()*sizeof(type4)};
uint arrayelements=sizeof(startadess)/sizeof(startadess[0]);
/*填充缓冲区*/
for(无符号整数i=0;i0)
{
标准::memcpy((void*)startAddress[i],(void*)BufferPos,SizeToAdd[i]);
BufferPos+=SizeToAdd[i];
}
}     
}
现在必须有一个初始化缓冲区的函数。它是:

void Function_Initialise_Buffer()
{
uint buffer_size = sizeof(StaticSampleType);
buffer_size += sizeof(type3)    * var3.size();
buffer_size += sizeof(type4)    * var4.size();

/* Preallocate Buffer */
for (uint i = 0; i < 2; i++)
{
  Buffer.clear();
  Buffer.resize(buffer_size * MAX_SAMPLES); // Allocate Size
  /* Remarques: */
  Buffer_StartAddr = (uint)&Buffer[0];
  Buffer_Size   = Buffer.size();    // using char ==> Buffer.size() equals buffer_size*MAX_SAMPLES
  Buffer_EndAddr = Buffer_StartAddr + Buffer_Size;  
  }
}
void函数\u初始化\u缓冲区()
{
uint buffer_size=sizeof(StaticSampleType);
缓冲区大小+=sizeof(type3)*var3.size();
缓冲区大小+=sizeof(type4)*var4.size();
/*预分配缓冲区*/
对于(uint i=0;i<2;i++)
{
Buffer.clear();
resize(Buffer_size*MAX_SAMPLES);//分配大小
/*答复:*/
Buffer_StartAddr=(uint)和Buffer[0];
Buffer_Size=Buffer.Size();//使用char==>Buffer.Size()等于Buffer_Size*MAX\u SAMPLES
Buffer_EndAddr=Buffer_StartAddr+Buffer_大小;
}
}
只是一个例子,但我想也许这个概念对一些人来说会很有趣。我将无符号int缩短为uint以减少文本

致以最良好的祝愿,
弗洛里安你不能这么做。你应该使用。如果
NUM\u VAR3
等是编译时常量,您可以将它们设置为(不应该在C++中使用宏)并使用,但大小的确定不能在运行时进行。

罗伯特说的:使用动态内存(std::vector)


在您的情况下,在初始化问题的输入大小时分配所有动态内存就足够了。复制内存块实际上是便宜的,所以纯赋值(不重新分配缓冲器)应该足够快。< /P>这是C还是C++?代码>标准::向量选项?一些编译器还提供可变长度数组作为扩展。Constexp在Visual Studio 2010中不起作用。在这种情况下,我有义务继续使用宏,对吗?
void Function_Is_Called_Each_10ms (...)
{
 static unsigned int BufferPos = Buffer_StartAddr; // exemplary

 /* Try to keep it easy editable: */
 uint StartAdress[] = {(uint)&StaticSample, (uint)&var3[0], (uint)&var4[0]};
 uint SizeToAdd[]   = {sizeof(StaticSampleType), var3.size()*sizeof(type3), var4.size()*sizeof(type4)};
 uint arrayelements  = sizeof(StartAdress)/sizeof(StartAdress[0]);

 /* Fill Buffer */
 for (unsigned int i = 0; i < arrayelements; i++)
 {
   if ( SizeToAdd[i] > 0 )
   {
   std::memcpy((void*)StartAdress[i], (void*)BufferPos, SizeToAdd[i]);
   BufferPos += SizeToAdd[i];
   }
  }     
}
void Function_Initialise_Buffer()
{
uint buffer_size = sizeof(StaticSampleType);
buffer_size += sizeof(type3)    * var3.size();
buffer_size += sizeof(type4)    * var4.size();

/* Preallocate Buffer */
for (uint i = 0; i < 2; i++)
{
  Buffer.clear();
  Buffer.resize(buffer_size * MAX_SAMPLES); // Allocate Size
  /* Remarques: */
  Buffer_StartAddr = (uint)&Buffer[0];
  Buffer_Size   = Buffer.size();    // using char ==> Buffer.size() equals buffer_size*MAX_SAMPLES
  Buffer_EndAddr = Buffer_StartAddr + Buffer_Size;  
  }
}