您好我从命令行界面传递字符串// - 2,3,4,5,6并在ip1中作为参数传递。
当我运行此代码时,它给出错误“错误:预期的类型标识符”和“致命:语法错误”;“预期但”找到“ARRAY”。
请告诉我这是什么问题.....
program main;
uses SysUtils;
var
output : Array of integer;
var
ip1 : Array of integer;
function add(input1:Array of integer) : Array of integer;
begin
add := input1;
end;
type
TIntegerArray = Array of Integer;
function IntArray(var input:string) : TIntegerArray;
var
p: integer;
begin
p := Pos(',', input);
if p = 0 then
p := MaxInt - 1;
result[0] := Copy(input, 1, p - 1);
result[1] := Copy(input, p + 1);
end;
begin
ip1 := IntArray(ParamStr(1));
output := add(ip1);
write('output ',output,'time',0.0 );
end.
答案 0 :(得分:3)
您发布的代码中存在很多问题,很难知道从哪里开始......
您需要将TIntegerArray
的类型声明移近程序的开头,因此它可以用作add
和IntArray
的返回类型,以及add
的论据。 array of Integer
和TIntegerArray
是Pascal中的两种不同类型,不能互换。
在盲目使用之前,您不会检查是否收到任何参数。如果它们不存在,则代码根本不起作用。您需要检查以确保您已收到参数,并在没有找到参数时生成带有说明的有用信息。
您永远不会为IntArray
返回值分配任何空格。在使用动态数组时,您需要使用SetLength
来声明数组中正确数量的元素,然后才能为它们分配任何内容。 (见下面的#4。)
您的IntArray
只假设input
中只有两个项目,您的示例命令行显示更多内容。你需要使用一个循环。 (
您的IntArray
尝试将ParamStr(1)
用作var
参数。 ParamStr(1)
是常量,不能作为var
任何内容传递。
您无法直接将数组传递给write
或writeln
。您必须循环遍历数组中的元素并单独输出每个元素。
(不是真正的问题,只是信息)add
没有任何“添加”任何东西,所以它的命名真的很差。您应该选择实际描述其正在执行的操作的名称,以便您的代码更易于阅读和理解。 (我不确定你打算用add
做什么,但你现在所做的并没有用。
(另一个“不是真正的问题”,但信息。)如果参数无法转换为整数,则不处理任何异常。提供给StrToInt
的无效值会引发异常。您应该使用Val
或StrToIntDef
,或者至少在转化时使用try..except
块来处理无效参数。
(另一个“不是真正的问题”。)你没有做任何事情来暂停程序,所以你可以看到write
语句的输出,这使得很难从IDE测试或调试您的程序。
这是您的代码的工作(测试)版本。
program main;
uses
System.SysUtils;
type
TIntegerArray = Array of Integer;
var
ip1, output: TIntegerArray;
function add(input1: TIntegerArray) : TIntegerArray;
begin
Result := input1;
end;
function IntArray(input:string) : TIntegerArray;
var
p: Integer;
i: Integer; // Tracks current index into Result array
begin
i := 0;
p := Pos(',', input);
while P > 0 do
begin
Inc(i); // Increment index
SetLength(Result, i); // Allocate element in array
Result[i] := StrToInt(Copy(input, 1, P - 1)); // Assign value
System.Delete(input, 1, P); // Remove portion we just read
P := Pos(',', input); // See if there's another comma
end;
// Now get the part after last ',' and add to array also
i := Length(Result);
if (i > 0) and (input <> '') then
begin
SetLength(Result, i + 1);
Result[i + 1] := StrToInt(input);
Input := '';
end;
end;
var
Ctr: Integer;
begin
if ParamCount > 0 then
begin
ip1 := IntArray(ParamStr(1));
output := add(ip1);
Write('Output: ');
for Ctr := Low(output) to High(output) do
Write(output[Ctr], ' ');
// Don't know what this is supposed to do, but...
WriteLn('time', 0.0 );
end
else
begin
WriteLn('ParamCount: ', ParamCount);
WriteLn('Syntax: ', ExtractFileName(ParamStr(0)) + ' <arg,arg[,arg...]>');
end;
ReadLn;
end.
答案 1 :(得分:0)
你也需要使用tintegerarray作为add()的返回类型,就像你已经为intarray做的那样。
之后你会发现Pascal是强类型的,并且不允许为参数赋值。
ip1:= intarray(paramstr(1));类型看起来非常狡猾btw。也许再次查找paramstr和paramcount的帮助。