我正在使用PASCAL進行一個課程,我在做一個任務時遇到麻煩,在我的程序中,我使用了兩個數組,它使用用戶輸入的變量,但是當我去運行程序時想出來,錯誤:無法評估常量表達式。對於數組的代碼是:如何在數組中使用變量?
Var
x : integer;
s : array[1..x] of real;
n : array[1..x] of string[30];
x是用戶的輸入,是有辦法的陣列,從1到X?
我正在使用PASCAL進行一個課程,我在做一個任務時遇到麻煩,在我的程序中,我使用了兩個數組,它使用用戶輸入的變量,但是當我去運行程序時想出來,錯誤:無法評估常量表達式。對於數組的代碼是:如何在數組中使用變量?
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()
和High()
代替:
for q := Low(s) to High(s) do
// access s[q];
(Low()
和High()
不是主題,但我們知道它們也可以用於靜態數組,並且他們返回實際的數組邊界 - 我總是用高和低本)
謝謝!我似乎遇到了更多的問題,我認爲它與數組有關,它表示錯誤:操作符未超載:「SmallInt的動態數組」,div「SmallInt」,「SmallInt的Dyanmic數組」,mod「ShortInt」。我把我的整個程序放在OP中。 – LeCarloVC
偵測到的吸血鬼活動 –
@David:確實如此。 –
這裏不如使用管理類型,如通過@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.
難道你錯過了';'? – FDavidov
是的,這只是我的一個錯字,我不會錯過任何;在我的程序中 – LeCarloVC
您需要一個動態數組 –