Заполнение массива

Voprosnik

Доброе время суток! Такая проблема. Есть переменная result, есть функция, которая ее заполняет сделал так:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
var
result:array[1..8,1..8] of byte;
 
function SozdMat():byte;
  var
  a:array [1..8,1..8] of byte;
  i,j:byte;
  begin
    for I := 1 to 8 do
      begin
        for j := 1 to 8 do
          begin
            if i=1 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=2
                else
                a[i,j]:=0;
              end;
            if i=2 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=0
                else
                a[i,j]:=2;
              end;
            if i=3 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=2
                else
                a[i,j]:=0;
              end;
            if (i>3) and (i<6) then
              a[i,j]:=0;
            if i=6 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=1
                else
                a[i,j]:=0;
              end;
            if i=7 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=0
                else
                a[i,j]:=1;
              end;
            if i=8 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=1
                else
                a[i,j]:=0;
              end;
          end;
      end;
      for i := 1 to 8 do
      begin
        for j := 1 to 8 do
          begin
            write(a[i,j],' ');
            result[i,j]:= a[i,j];
          end;
            writeln;
      end;
  end;
 
begin
   write(SozdMat);
   readln;
end.
пишет [Pascal Error] Project1.dpr(70): E2016 Array type required как устранить ошибку или реализовать возврат в переменную типа array fo byte результата функции, т.е. аналогичного массива?
14 ответов

Voprosnik

result это служебное слово и им нельзя называть переменные.
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
var
a:array[1..8,1..8] of byte;
 
function SozdMat():byte;
  var i,j:byte;
  begin
    for I := 1 to 8 do
      begin
        for j := 1 to 8 do
          begin
            if i=1 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=2
                else
                a[i,j]:=0;
              end;
            if i=2 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=0
                else
                a[i,j]:=2;
              end;
            if i=3 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=2
                else
                a[i,j]:=0;
              end;
            if (i>3) and (i<6) then
              a[i,j]:=0;
            if i=6 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=1
                else
                a[i,j]:=0;
              end;
            if i=7 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=0
                else
                a[i,j]:=1;
              end;
            if i=8 then
              begin
                if (j mod 2<>0) then
                a[i,j]:=1
                else
                a[i,j]:=0;
              end;
          end;
      end;
      for i := 1 to 8 do
       begin
        for j := 1 to 8 do
        write(a[i,j],' ');
        writeln;
      end;
    result:=0;
  end;
 
begin
   write(SozdMat);
   readln;
end.


Voprosnik

когда я просматриваю массив вне функции, он оказывается пустым, что не так? объясни пожалуйста
for i := 1 to 8 do
     begin
       for j := 1 to 8 do
         begin
           write(a[i,j],' ');
         end;
           writeln;
     end;
в теле программы дает одни нули


Voprosnik

Так ты не присваиваешь элементам массива накаких значений.


Voprosnik

В функции разве не присваиваю?


Voprosnik

Покажи свой последний код.


Voprosnik

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
var
a:array [1..8,1..8] of byte;
i,j:byte;
 
function SozdMat():byte;
  var
  i,j,max,min:byte;
  begin
  max:=8;
  min:=1;
    for j := 1 to 8 do
      begin
         for i := 1 to 8 do
           begin
             if (j mod 2<>0) then
               begin
                 if (i = max) or (i = max-2) then
                   a[i,j]:=1
                  else if (i = min) or (i = min+2) then
                     a[i,j]:=2
                  else
                     a[i,j]:=0;
               end;
             if (j mod 2 = 0) then
               begin
                 if (i=min+1) then
                   a[i,j]:=2
                 else if (i = max - 1) then
                   a[i,j]:=1
                 else
                   a[i,j]:=0;
               end;
             
           end;
      end;
  end;
 
begin
   for i := 1 to 8 do
     begin
       for j := 1 to 8 do
         begin
           write(a[i,j],' ');
         end;
           writeln;
     end;
   readln;
end.
а.. еще функцию надо вызвать? просто вызвать, ничего не присваивать?


Voprosnik

Перед строкой 46 поставь же обращение к функции:
SozdMat;


Voprosnik

Спасибо огромное! Что-то тупил)


Voprosnik

Voprosnik, ничего не понял, что вы сотворили... Конкретно, ошибка, описанная в вашем верхнем посте, была из-за строки 70:
result[i,j]:= a[i,j];
У вас возвращаемое значение (как и переменная Result) имеет тип byte, а вы пытались обращаться как к элементу массива.


Voprosnik

Собственно, сейчас все вышеописанные проблемы были решены, однако появилась еще одна. Как я понял - необходимо инициализировать результат функции или что-то подобное, однако, не совсем понятно как вот функция(я ее немного поменял, но суть в другом):
function SozdMat():byte;
  var
  i,j,max,min:byte;
  begin
  max:=8;
  min:=1;
    for j := 1 to 8 do
      begin
         for i := 1 to 8 do
           begin
             if (j mod 2<>0) then
               begin
                 if (i = max) or (i = max-2) then
                   a[i,j]:=1
                  else if (i = min) or (i = min+2) then
                     a[i,j]:=2
                  else
                     a[i,j]:=0;
               end;
             if (j mod 2 = 0) then
               begin
                 if (i=min+1) then
                   a[i,j]:=2
                 else if (i = max - 1) then
                   a[i,j]:=1
                 else
                   a[i,j]:=0;
               end;
             
           end;
      end;
 
  end;
подсвечивает последний end; пишет:
[Pascal Warning] Unit38.pas(79): W1035 Return value of function 'SozdMat' might be undefined
и вот:
[Pascal Error] Unit38.pas(18): E2065 Unsatisfied forward or external declaration: 'TForm1.SozdMat'
вторая ошибка указывает на раздел
 public
    { Public declarations }
    procedure DrawBitmap(const FileName : String; const x, y : Integer);
    function SozdMat():byte;
  end;
подсвечивает функцию


Voprosnik

По первой ошибке: Сделай эту твою функцию просто процедурой и запиши там где функция начинается так:
procedure TForm1.SozdMat; //TForm1 - уберёт вторую ошибку
Begin
...
а в описании в секции Public запиши так:
 public
    { Public declarations }
    procedure DrawBitmap(const FileName : String; const x, y : Integer);
    procedure SozdMat;
  end;
А инициализировать результат функции можно было записав:
Result:=1; //Любое число


Voprosnik

а почему нельзя функцией мою функцию оставить? вообще, в какие моменты лучше функцию применять, а в какие процедуры?


Voprosnik

В данном случае ты просто заполняешь описанный глобально массив. На выходе функции здесь нет ничего. Точнее, что ты можешь передать на выход. Ты описал выходное значение Byte. А что ты можешь передать в байте? Если бы описал тип массива:
Type 
  massiv = Array[1..8,1..8] Of Byte;
 
Var 
  a,b,c : massiv;
 
Function TForm1.SozdMat:massiv;
Var
  a : massiv;
Begin
//...
  //В конце написал бы
  Result:=a; //Это выходное значение функции
End;
 
  //Тогда вызов был бы
  a:=SozdMat;
  b:=SozdMat;
  c:=SozdMat;
Функция используется, если на выходе должно быть какое-то значение, которое можно записать в любую переменную или выполнять с ним какие-то действия. Примеры функций Sin, Cos и подобные. В общем, лучше не могу объяснить. Спроси у Mawrat-а. Думаю он сможет нормально объяснить.


Voprosnik

а нельзя у функции выход описать как :array [] of byte? как то. Обязательно в разделе type свой тип описывать?