将多维数组分配给另一个

时间:2014-06-11 01:16:26

标签: c++ multidimensional-array assign

我有这些结构:

struct tcFrameConfig {
    int           NameF; 
    int           NameP;
    int           NameH;
    unsigned __int8 Length;
    unsigned int  Duration; };

struct tcFrameStimulus {
    short Key; };

struct tcFrame {
    tcFrameConfig      Config;
    tcFrameStimulus* Stimulus; };

int main() {
    tcFrame Frame1;
    tcFrame Frame2;

    Frame1.Config.NameF = 0;
    Frame1.Config.NameP = 0;
    Frame1.Config.NameH = 0;
    Frame1.Config.Length = 4;
    Frame1.Config.Duration = 100;

    Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
    Frame1.Stimulus[0] = 0;
    Frame1.Stimulus[1] = 1;
    Frame1.Stimulus[2] = 40;
    Frame1.Stimulus[3] = 43;

好吧我初始化Frame1; 现在...如果我这样做:

Frame2 = Frame1;
return 0; }

它有效,但我不认为它是正确的,什么是正确的方法? 如果Frame1实际上是tcFrame的动态数组?

...更新

来自

struct tcFrame {
    tcFrameConfig      Config;
    tcFrameStimulus* Stimulus; };

我去了

struct tcFrame {
    tcFrameConfig      Config;
    std::vector<tcFrameStimulus> Stimulus;  };

编译说

error: 'struct tcFrame' has no member named 'Stimulus'|

对此代码进行了一些测试

int main() {
tcFrame Frame1;
tcFrame Frame2;

Frame1.Config.NameF = 0;
Frame1.Config.NameH = 0;
Frame1.Config.NameP = 0;
Frame1.Config.Length = 4;
Frame1.Config.Duration = 100;

Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame1.Stimulus[0].Key = 0;
Frame1.Stimulus[1].Key = 1;
Frame1.Stimulus[2].Key = 2;
Frame1.Stimulus[3].Key = 3;

Frame2 = Frame1;

Frame1.Config.NameF = 1;
Frame1.Config.NameH = 1;
Frame1.Config.NameP = 1;
Frame1.Config.Length = 4;
Frame1.Config.Duration = 200;

Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame1.Stimulus[0].Key = 1;
Frame1.Stimulus[1].Key = 2;
Frame1.Stimulus[2].Key = 3;
Frame1.Stimulus[3].Key = 4;

cout << Frame1.Config.NameF  << endl;
cout << Frame1.Config.NameH  << endl;
cout << Frame1.Config.NameP  << endl;
cout << Frame1.Config.Length  << endl;
cout << Frame1.Config.Duration  << endl;
cout << Frame1.Stimulus[0].Key  << endl;
cout << Frame1.Stimulus[1].Key  << endl;
cout << Frame1.Stimulus[2].Key  << endl;
cout << Frame1.Stimulus[3].Key  << endl;

cout << Frame2.Config.NameF  << endl;
cout << Frame2.Config.NameH  << endl;
cout << Frame2.Config.NameP  << endl;
cout << Frame2.Config.Length  << endl;
cout << Frame2.Config.Duration  << endl;
cout << Frame2.Stimulus[0].Key  << endl;
cout << Frame2.Stimulus[1].Key  << endl;
cout << Frame2.Stimulus[2].Key  << endl;
cout << Frame2.Stimulus[3].Key  << endl;

return 0; }

并且框架具有不同的值......

2 个答案:

答案 0 :(得分:1)

听说Rule of Three

看起来你应该利用C ++的面向对象部分,并使tcFrame成为一个完整的成熟对象(提示class)。在此之后,您可以创建适当的构造函数和析构函数,以及复制构造函数和重载的复制赋值。

......但是你为什么要使用动态内存呢? C ++提供了std::vector动态数组,没有头痛。

答案 1 :(得分:0)

您必须为Frame2.Stimulus分配内存并将Frame1.Stimulus的内容复制到其中。

Frame2.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame2.Stimulus[0] = Frame1.Stimulus[0];
Frame2.Stimulus[1] = Frame1.Stimulus[1];
Frame2.Stimulus[2] = Frame1.Stimulus[2];
Frame2.Stimulus[3] = Frame1.Stimulus[3];

否则,Frame2Frame1指向相同的内存。如果你修改一个,它将影响另一个。

由于您将使用c ++,因此使用标准库中的容器会更好,例如std::vectorstd::array。否则,您将处理与内存相关的问题。

对于您的情况,您可以使用:

struct tcFrame 
{
   tcFrameConfig      Config;
   std::vector<tcFrameStimulus> Stimulus;
};

这样,你可以使用:

Frame2 = Frame1;

不用担心内存分配,内存释放,从一个列表到另一个列表的数据分配等等。