pascal中的字符串到数组

时间:2014-09-24 08:14:25

标签: arrays command-line-arguments pascal

您好我从命令行界面传递字符串// - 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.

2 个答案:

答案 0 :(得分:3)

您发布的代码中存在很多问题,很难知道从哪里开始......

  1. 您需要将TIntegerArray的类型声明移近程序的开头,因此它可以用作addIntArray的返回类型,以及add的论据。 array of IntegerTIntegerArray是Pascal中的两种不同类型,不能互换。

  2. 在盲目使用之前,您不会检查是否收到任何参数。如果它们不存在,则代码根本不起作用。您需要检查以确保您已收到参数,并在没有找到参数时生成带有说明的有用信息。

  3. 您永远不会为IntArray返回值分配任何空格。在使用动态数组时,您需要使用SetLength来声明数组中正确数量的元素,然后才能为它们分配任何内容。 (见下面的#4。)

  4. 您的IntArray只假设input中只有两个项目,您的示例命令行显示更多内容。你需要使用一个循环。 (

  5. 您的IntArray尝试将ParamStr(1)用作var参数。 ParamStr(1)是常量,不能作为var任何内容传递。

  6. 您无法直接将数组传递给writewriteln。您必须循环遍历数组中的元素并单独输出每个元素。

  7. (不是真正的问题,只是信息)add没有任何“添加”任何东西,所以它的命名真的很差。您应该选择实际描述其正在执行的操作的名称,以便您的代码更易于阅读和理解。 (我不确定你打算用add做什么,但你现在所做的并没有用。

  8. (另一个“不是真正的问题”,但信息。)如果参数无法转换为整数,则不处理任何异常。提供给StrToInt的无效值会引发异常。您应该使用ValStrToIntDef,或者至少在转化时使用try..except块来处理无效参数。

  9. (另一个“不是真正的问题”。)你没有做任何事情来暂停程序,所以你可以看到write语句的输出,这使得很难从IDE测试或调试您的程序。

  10. 这是您的代码的工作(测试)版本。

    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的帮助。