将值分配给带有内部数组的结构体数组

时间:2018-11-07 16:38:30

标签: arrays struct c++builder

我有这个结构数组,其中包含一个数组

struct pannello_t {
    String nome;
    TLabel* labelNome;
    TShape* ShapeLed[10];
} Moduli[20];

我可以使用以下命令进行编译,而不会出错:

Moduli[0].nome = "HCL-IN8";
Moduli[0].labelNome = LabelP1;
Moduli[0].ShapeLed[0] = Led1P1;
Moduli[0].ShapeLed[1] = Led2P1;
Moduli[0].ShapeLed[2] = Led3P1;
Moduli[0].ShapeLed[3] = Led4P1;
Moduli[0].ShapeLed[4] = Led5P1;
Moduli[0].ShapeLed[5] = Led6P1;
Moduli[0].ShapeLed[6] = Led7P1;
Moduli[0].ShapeLed[7] = Led8P1;
Moduli[0].ShapeLed[8] = Led9P1;
Moduli[0].ShapeLed[9] = Led10P1;
... etc

但是我正在寻找一种更紧凑的方法,我尝试这样做:

Moduli[0] = {"HCL-XXX", LabelP3, {Led1P3, Led2P3, Led3P3, Led4P3, Led5P3, Led6P3, Led7P3, Led8P3, Led9P3, Led10P3}  };

但是编译器会说:E2188 Expression syntax。我浏览书籍和Google,但找不到解决方案,因此在这里寻求帮助。

1 个答案:

答案 0 :(得分:1)

在较旧的Borland / Embarcadero编译器中,有一个编译器错误有时会引起此错误。但是我找到了一种解决方法:

除其他事项外,它还可以再次使用您想要的赋值...但是,我怀疑对于较新的编译器仍然如此,但仍然值得尝试。

如果该方法不起作用,在找到此替代方法之前,我仍然使用了一个选项。您必须创建一个加载函数,该函数返回您的struct(类似构造函数),然后仅用它来填充数组...

这里有2个选项(都可以在我的BDS2006 C ++上使用,并且两者都可以组合在一起):

//---------------------------------------------------------------------------
// I assume your VCL form components ...
TLabel *LabelP1; TShape *Led1P1,*Led2P1,*Led3P1,*Led4P1,*Led5P1,*Led6P1,*Led7P1,*Led8P1,*Led9P1,*Led10P1;
TLabel *LabelP2; TShape *Led1P2,*Led2P2,*Led3P2,*Led4P2,*Led5P2,*Led6P2,*Led7P2,*Led8P2,*Led9P2,*Led10P2;
TLabel *LabelP3; TShape *Led1P3,*Led2P3,*Led3P3,*Led4P3,*Led5P3,*Led6P3,*Led7P3,*Led8P3,*Led9P3,*Led10P3;
TLabel *LabelP4; TShape *Led1P4,*Led2P4,*Led3P4,*Led4P4,*Led5P4,*Led6P4,*Led7P4,*Led8P4,*Led9P4,*Led10P4;
TLabel *LabelP5; TShape *Led1P5,*Led2P5,*Led3P5,*Led4P5,*Led5P5,*Led6P5,*Led7P5,*Led8P5,*Led9P5,*Led10P5;
// struct
struct pannello_t
    {
    String nome;
    TLabel* labelNome;
    TShape* ShapeLed[10];
    };
// load function for style 2
pannello_t ld(String nome,TLabel* labelNome,TShape* S0,TShape* S1,TShape* S2,TShape* S3,TShape* S4,TShape* S5,TShape* S6,TShape* S7,TShape* S8,TShape* S9)
    {
    pannello_t a;
    a.nome=nome;
    a.labelNome=labelNome;
    a.ShapeLed[0]=S0;
    a.ShapeLed[1]=S1;
    a.ShapeLed[2]=S2;
    a.ShapeLed[3]=S3;
    a.ShapeLed[4]=S4;
    a.ShapeLed[5]=S5;
    a.ShapeLed[6]=S6;
    a.ShapeLed[7]=S7;
    a.ShapeLed[8]=S8;
    a.ShapeLed[9]=S9;
    return a;
    }
//---------------------------------------------------------------------------
void test()
    {
    // 1. style
    pannello_t A[5]=
        {
        {"HCL-XXX", LabelP1, {Led1P1, Led2P1, Led3P1, Led4P1, Led5P1, Led6P1, Led7P1, Led8P1, Led9P1, Led10P1} },
        {"HCL-XXX", LabelP2, {Led1P2, Led2P2, Led3P2, Led4P2, Led5P2, Led6P2, Led7P2, Led8P2, Led9P2, Led10P2} },
        {"HCL-XXX", LabelP3, {Led1P3, Led2P3, Led3P3, Led4P3, Led5P3, Led6P3, Led7P3, Led8P3, Led9P3, Led10P3} },
        {"HCL-XXX", LabelP4, {Led1P4, Led2P4, Led3P4, Led4P4, Led5P4, Led6P4, Led7P4, Led8P4, Led9P4, Led10P4} },
        {"HCL-XXX", LabelP5, {Led1P5, Led2P5, Led3P5, Led4P5, Led5P5, Led6P5, Led7P5, Led8P5, Led9P5, Led10P5} },
        };
    // 2. style
    pannello_t B[5];
    B[0]=ld("HCL-XXX", LabelP1, Led1P1, Led2P1, Led3P1, Led4P1, Led5P1, Led6P1, Led7P1, Led8P1, Led9P1, Led10P1 );
    B[1]=ld("HCL-XXX", LabelP2, Led1P2, Led2P2, Led3P2, Led4P2, Led5P2, Led6P2, Led7P2, Led8P2, Led9P2, Led10P2 );
    B[2]=ld("HCL-XXX", LabelP3, Led1P3, Led2P3, Led3P3, Led4P3, Led5P3, Led6P3, Led7P3, Led8P3, Led9P3, Led10P3 );
    B[3]=ld("HCL-XXX", LabelP4, Led1P4, Led2P4, Led3P4, Led4P4, Led5P4, Led6P4, Led7P4, Led8P4, Led9P4, Led10P4 );
    B[4]=ld("HCL-XXX", LabelP5, Led1P5, Led2P5, Led3P5, Led4P5, Led5P5, Led6P5, Led7P5, Led8P5, Led9P5, Led10P5 );
    }
//---------------------------------------------------------------------------

请注意,如果使用的是数组声明中的定义,则所分配的VCL组件必须已经指向创建的VCL组件。如果不能保证,则唯一安全选项可以在运行时使用样式2和ld函数(例如在窗体构造函数中)使用数组2来提供给数组,或仅使用指针使用指针...

我还看到一些编译器在使用typedef帮助的情况下使用struct(而不是Borland)存在问题...

typedef struct
    {
    String nome;
    TLabel* labelNome;
    TShape* ShapeLed[10];
    } pannello_t;