Вопросы по синтаксису Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mR_LiNK[deface_0nl, 7 Jan 2007.

  1. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    Вопрос в следующем::
    Как задется открытый массив??
    Пример(расчет средней элементов массива):

    Code:
    ...
    function Average(a: array of integer): real;
    var
      i: Integer;
    begin
      for i := 0 to 5 do readln(a[i]);
      Result := 0;
      for I := Low(a) to High(a) do Result := Result + a[i];
      Result := Result / (High(a) - Low(a) + 1);
    end;
    begin
      writeln(Average(a));
    
      writeln('Press Enter to exit...');
      readln;
    end.
    ...
    
    Компилятор выдает следующее:
    Undeclared identifier:'a'
    Что вобщем-то понятно, т.к. переменная 'а' описана только в локальном блоке, т.е. в функции, а не в программе.

    Объясните как ее описать в программе, или что нужно исправить, чтобы избаиться от ошибки? :confused:
     
  2. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Чтобы программа заработала добавь
    Code:
    var a: array [0..5] of integer;
    перед
    Code:
    begin
      writeln(Average(a));
    ...
     
    #2 Deem3n®, 7 Jan 2007
    Last edited: 7 Jan 2007
  3. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    Это правильно, но не много не то.

    должен быть открытый массив
    (ограничение на ввод я поставил в качестве примера)

    нужно чтобы массив оставался открытым,
    а программа расчитывала среднее по первому и последнему элементам..
     
  4. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Ну тогда замени:
    Code:
    function Average(a: array of integer): real;
    на
    Code:
    function Average([color=red]var[/color] a: array of integer): real;
    и вообще убери
    Code:
    for i := 0 to 5 do readln(a[i]);
    или замени на
    Code:
    for i := Low(a) to High(a) do readln(a[i]);
    если тебе в этой ф-ции надо вводить данные (странно, почему в ф-ции расчета средней элементов массива нужно вводить данные?)

    Потом можешь экспериментировать :
    Code:
    var p: array [1..10] of integer;
    
    begin
      writeln(Average(p));
    
      writeln('Third element is ',p[3]);
      writeln('Press Enter to exit...');
      readln;
    end.
     
    #4 Deem3n®, 7 Jan 2007
    Last edited: 7 Jan 2007
    1 person likes this.
  5. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    Собрал
    получилось следующее(по логике вроде правильно)::
    Code:
    function Average(var a: array of integer): real;
    var
      i: Integer;
    begin
      for i := Low(a) to High(a) do readln(a[i]);
      Result := 0;
      for I := Low(a) to High(a) do Result := Result + a[i];
      Result := Result / (High(a) - Low(a) + 1);
      writeln('Srednaya massiva = ', Result);
    end;
    var
      p: array [0..5] of integer;
    begin
      writeln('vvedite el-ty massivy');
      writeln(Average(p));
    
      writeln('Press Enter to exit...');
      readln;
    end.
    Единственное есть недочет маленький
    результат выводится 2-а раза, почему?
    (1-ый раз: Srednaya massiva = .{численный результат}.
    2-ый раз:.{численный результат}. )
     
    #5 mR_LiNK[deface_0nl, 7 Jan 2007
    Last edited: 7 Jan 2007
  6. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    1-ый раз это тут:
    Code:
    writeln('Srednaya massiva = ', Result);
    2-й раз тут:
    Code:
    writeln(Average(p));
     
  7. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    writeln('Srednaya massiva = ', Result);
    writeln(Average(p));

    поэтому и два раза. Убери вывод внутри Average()
     
    1 person likes this.
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    стоп... я конечно же извиняюсь, а разве не надо указывать длинну?
    этоо? = array of integer.
    SetLength(a,7)????
     
  9. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    в Delphi есть 2-а понятия массива..
    стандартно, при объявлении длина задается принудительно.

    также существуют и открытые массивы-параметры, которые являются массивами произвольной длины..
    описывается такой массив с помощью словосочетания array of, при этом границы массива опускаются..

    зы.учишь Delphi говоришь, отметься здесь::
    /thread30523.html
     
    #9 mR_LiNK[deface_0nl, 10 Jan 2007
    Last edited: 10 Jan 2007