我正在使用PASCAL进行我正在做的课程而且我在分配时遇到问题,在我的程序中我使用了2个使用来自用户的变量的数组&# 39; s输入,但当我去运行程序时,它出现了,错误:无法评估常量表达式。该数组的代码是:
Var
x : integer;
s : array[1..x] of real;
n : array[1..x] of string[30];
这里x是用户的输入,有没有办法让数组从1变为x?
答案 0 :(得分:6)
如果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()
不是主题,但只知道它们也可以用于静态数组,并且它们返回实际的数组边界 - 我总是使用High和这个很低)
答案 1 :(得分:-1)
使用像@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.