2016-07-27 55 views
1

我正在使用PASCAL进行一个课程,我在做一个任务时遇到麻烦,在我的程序中,我使用了两个数组,它使用用户输入的变量,但是当我去运行程序时想出来,错误:无法评估常量表达式。对于数组的代码是:如何在数组中使用变量?

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

x是用户的输入,是有办法的阵列,从1到X?

+0

难道你错过了';'? – FDavidov

+0

是的,这只是我的一个错字,我不会错过任何;在我的程序中 – LeCarloVC

+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()不是主题,但我们知道它们也可以用于静态数组,并且他们返回实际的数组边界 - 我总是用高和低本)

+0

谢谢!我似乎遇到了更多的问题,我认为它与数组有关,它表示错误:操作符未超载:“SmallInt的动态数组”,div“SmallInt”,“SmallInt的Dyanmic数组”,mod“ShortInt”。我把我的整个程序放在OP中。 – LeCarloVC

+2

侦测到的吸血鬼活动 –

+0

@David:确实如此。 –

-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. 
+0

是的,比简单的动态数组更“有趣”。 –

+0

这简直是无聊的建议 –

+1

@DavidHeffernan你在我的代码介绍中不明白的地方是什么? – Abelisto