我正在使用PASCAL进行一个课程,我在做一个任务时遇到麻烦,在我的程序中,我使用了两个数组,它使用用户输入的变量,但是当我去运行程序时想出来,错误:无法评估常量表达式。对于数组的代码是:如何在数组中使用变量?
Var
x : integer;
s : array[1..x] of real;
n : array[1..x] of string[30];
x是用户的输入,是有办法的阵列,从1到X?
我正在使用PASCAL进行一个课程,我在做一个任务时遇到麻烦,在我的程序中,我使用了两个数组,它使用用户输入的变量,但是当我去运行程序时想出来,错误:无法评估常量表达式。对于数组的代码是:如何在数组中使用变量?
Var
x : integer;
s : array[1..x] of real;
n : array[1..x] of string[30];
x是用户的输入,是有办法的阵列,从1到X?
如果x
是一个变量,那确实不起作用。所谓的静态数组的范围必须是的恒定表达式,即它必须在编译时已知。
所以你想要的东西不会按原样工作。
但是,在FreePascal中,您可以使用dynamic arrays。它们的长度可以在运行时进行设置和更改。
var
x: Integer;
s: array of Real;
n: array of string[30]; // why not just string?
及更高版本:
x := someUserInput(); // pseudo code!
SetLength(s, x);
SetLength(n, x);
你应该知道的事实,动态数组是基于0
,使您的索引从0
运行到x - 1
。但对于数组的极限,你应该宁愿使用Low()
和High()
代替:
for q := Low(s) to High(s) do
// access s[q];
(Low()
和High()
不是主题,但我们知道它们也可以用于静态数组,并且他们返回实际的数组边界 - 我总是用高和低本)
谢谢!我似乎遇到了更多的问题,我认为它与数组有关,它表示错误:操作符未超载:“SmallInt的动态数组”,div“SmallInt”,“SmallInt的Dyanmic数组”,mod“ShortInt”。我把我的整个程序放在OP中。 – LeCarloVC
侦测到的吸血鬼活动 –
@David:确实如此。 –
这里不如使用管理类型,如通过@RudyVelthuis但更有趣的解决方案,提供了一些理解 它是如何工作的内部建议动态数组那么简单: )
program dynarr;
{$mode objfpc}{$H+}
type
TArrayReal = array[1..High(Integer)] of Real;
TArrayString30 = array[1..High(Integer)] of string[30];
PArrayReal = ^TArrayReal;
PArrayString30 = ^TArrayString30;
var
i: Integer;
x: Integer;
s: PArrayReal;
n: PArrayString30;
begin
Write('Count: '); Readln(x);
// Allocate memory for the actual count of the elements
s := GetMem(SizeOf(Real) * x);
n := GetMem(SizeOf(string[30]) * x);
try
for i := 1 to x do
begin
Write('Row ', i:3, ': '); Readln(s^[i], n^[i]);
end;
Writeln('Your input was:');
for i := 1 to x do
Writeln('Row ', i:3, ': ', s^[i]:10:3, n^[i]: 20);
finally
// Do not forget to release allocated memory
FreeMem(s);
FreeMem(n);
end;
end.
难道你错过了';'? – FDavidov
是的,这只是我的一个错字,我不会错过任何;在我的程序中 – LeCarloVC
您需要一个动态数组 –