Mayby问题出在环境中[我使用replit];但是有人可以帮助我逐步理解为什么我不能那样使用计数器吗?在另一个/第二个编译器中 [dev-pascal] 结果是正确的,但是当我尝试使用析构函数时,我得到了关于语法最后一部分的信息:matrix1.free 不是一个语句。
我必须修改什么?
附言
对不起我的英语,但这不是我的母语。
{$MODE OBJFPC}
{$M+}
uses
SysUtils,crt;
const
n=10;
type
matrix = class
public
t: array [1..n,1..n] of integer;
i,x,y,sum: integer;
procedure read_data();
procedure process_data();
procedure show_data();
end;
procedure matrix.read_data();
begin
randomize();
for x:=1 to n do
for y:=1 to n do
begin
if (x=y) then
t[x,y]:=random(10)
else
t[x,y]:=0;
end;
end;
procedure matrix.process_data();
begin
sum:=0;
i:=0;
for i:=1 to n do
begin
if (x=y) then
sum:=sum+t[i,i];
end;
end;
procedure matrix.show_data();
begin
for x:=1 to n do
begin
for y:=1 to n do
write(t[x,y],#9);
writeln();
end;
writeln('suma liczb z przekątnej: ',sum);
end;
var
matrix1:matrix;
begin
matrix1:= matrix.create;
matrix1.read_data();
matrix1.process_data();
matrix1.show_data();
matrix1.free;
end.
为什么我不能使用全局初始化?
我特别阅读
https://comp.lang.pascal.borland.narkive.com/uzQCbC7K/why-illegal-counter-variable
https://gitlab.com/freepascal.org/fpc/source/-/issues/36065
请注意,这取决于模式是一个全局变量初始化,如果您的代码运行多次,这将是不安全的。
如果您出于“始终初始化”的原因这样做,请在代码中进行初始化,因为在声明中初始化在 FPC 中是不明确的。
很明显,对于新代码,在声明时允许初始化的情况下,不支持此异常(不支持不良样式)。
FPC在这个意义上是兼容的
尝试向矩阵类添加构造函数和析构函数。构造函数可以初始化随机数生成器,而析构函数什么都不做,因为矩阵类不分配任何外部资源。并且调用该方法的正确方法是 Free(),free 不是一条指令,而是一个以对象引用为参数并释放分配给该对象的内存的过程。所以你需要调用 free 对象引用,而不是类名。