2016-07-27 96 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

相關問題