如何在数组中使用变量?

时间:2016-07-27 06:05:32

标签: pascal freepascal

我正在使用PASCAL进行我正在做的课程而且我在分配时遇到问题,在我的程序中我使用了2个使用来自用户的变量的数组&# 39; s输入,但当我去运行程序时,它出现了,错误:无法评估常量表达式。该数组的代码是:

Var
        x : integer;
        s : array[1..x] of real;
        n : array[1..x] of string[30];

这里x是用户的输入,有没有办法让数组从1变为x?

2 个答案:

答案 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.