如何在数组中使用变量?
How to use a variable in an array?
我正在使用 PASCAL 来学习我正在学习的课程,但我在做作业时遇到了问题,在我的程序中,我使用了 2 个数组,这些数组使用了来自用户输入的变量,但是当我转到 运行 自己想出来的程序,错误:无法计算常量表达式。数组的代码是:
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()
and High()
:
for q := Low(s) to High(s) do
// access s[q];
(Low()
和 High()
不是主题,只是知道它们也可以用于静态数组,而且它们 return 实际数组边界——我总是为此使用高和低)
这里并不像使用 @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.
我正在使用 PASCAL 来学习我正在学习的课程,但我在做作业时遇到了问题,在我的程序中,我使用了 2 个数组,这些数组使用了来自用户输入的变量,但是当我转到 运行 自己想出来的程序,错误:无法计算常量表达式。数组的代码是:
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()
and High()
:
for q := Low(s) to High(s) do
// access s[q];
(Low()
和 High()
不是主题,只是知道它们也可以用于静态数组,而且它们 return 实际数组边界——我总是为此使用高和低)
这里并不像使用 @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.