不允许分配给 "in" 模式参数

Assignment to "in" mode parameter not allowed

好像不能把记录字段作为参数?

joueurActuel.c1 := predColonne(joueurActuel.c1);

函数:

function predColonne (c : T_Colonne) return T_Colonne;

其中 T_ColonnePositive 的子类型。

joueurActuel 是包含上述赋值的函数的 in 参数 (joueurActuel : in T_Joueur;)。 T_Joueur 是一条记录。

这是设计使然。 mode in 的形式参数是常量视图;它不能在子程序主体内更新。常量不能作为赋值操作的目标。参见 section 3.3 od Ada Reference Manual,特别是第 13、15、17 和 25 段。

因此,要么必须将 predColonne(joueurActuel.c1) 的结果存储在局部变量中,要么将 joueurActuel 更改为 in out 参数(如果从业务逻辑的角度来看它是正确的) .

joueurActuel : in T_Joueur; 中的 in 模式是您向编译器保证,您不会在声明此形式的过程中以任何方式更新或修改 joueurActuel范围。它是记录的事实与问题无关。

joueurActuel.c1 := predColonne(joueurActuel.c1); 是试图修改 joueurActuel,尽管有保证。

编译器正确地拒绝了它。

如果这真的是你想要做的,那么in out模式将允许它,但首先问问你自己它是否有更好的设计。程序的其余部分是否需要看到更改?如果是这样,那么 in out 是可以接受的。否则,按照 Ondrej 的建议将其复制到局部变量,并且仅修改本地副本即可。