首页 > 解决方案 > 将值分配给内部包含数组的结构数组

问题描述

我有这个包含一个数组的结构数组

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. 我看书和谷歌,但我找不到解决方案,所以我在这里寻求帮助。

标签: arraysstructc++builder

解决方案


在较旧的 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函数提供数组,例如在 Form 构造函数中,或者不仅仅是使用指针,而是使用指针的指针......

我还看到一些编译器在使用 struct 时遇到问题(但不是 Borland),在这种情况下使用 typedef 有助于...

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

推荐阅读