Присвоение значений массиву структуры с массивом внутри - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть этот массив структуры, который содержит один массив

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 голосов
/ 08 ноября 2018

В старых компиляторах 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;
...