2016-07-20 1 views
1

Простой пример:Delphi XE6, 3D массив записей с булевыми полями членов, не будет строить

type 
    TGm = record 
    Rm,Nc,Sc,Wc,Ec,Su,Sd:boolean; 
    end; 

var 
    Dm: Array[1..20] of Array[1..20] of Array[1..20] of TGm; 
    Gm: TGm; 

... 

if (Dm(z,y-1,x).Ec) then Gm.Wc := TRUE; 

Когда я пытаюсь построить, что последняя строка будет отмечена и две ошибки показаны:

'$1' does not contain a member named 'Ec' 
Type of expression must be BOOLEAN 

Я пропустил что-то жизненно простое здесь?

И, да, я генерация темницу ;-)

+0

кронштейнов ... Жизненно просто, да. Ошибка компилятора странная, хотя ... –

+0

@Sertac: Я думаю, что компилятор видит в нем своего рода анонимный тип, внутренне называемый '$ 1', вероятно, внутреннюю первичную строку типа Dm. Я предполагаю, что это потому, что объявление представляет собой массив [] массива [] массива [] of ... ', что необычно. Обычно у вас есть 'array [.., .., ..] of ...'. –

ответ

2

Вы используете круглые скобки, где требуются скобки. Он должен выглядеть следующим образом, вместо:

if Dm[z][y-1][x].Ec then Gm.Wc := TRUE; 

Я хотел бы предложить использовать единый многомерный массив вместо:

var 
    Dm: Array[1..20, 1..20, 1..20] of TGm; 
    Gm: TGm; 

... 

    if Dm[z,y-1,x].Ec then Gm.Wc := TRUE; 
+0

Не могли бы вы объяснить, что означает первое сообщение компилятора? Я смущен, обычно сообщения компилятора delphi очень дружелюбны ... –

+0

Я не могу воспроизвести ошибку, которую вы показали в моем XE6. Соответствующая строка не работает с «E2066 Missing operator или точкой с запятой». –

+0

@Remy: Я получаю то же самое в XE4 (нет XE6 на этом ноутбуке). –