如何在数组中使用变量?

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 的事实,因此您的索引 运行 从 0x - 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.