singlepost

Delphi – ошибка Array type Requied << На главную или назад  

выводит ошибку Array type Requied в выделенной строке…((((как исправить?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit10: TEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Edit19: TEdit;
Label3: TLabel;
Edit20: TEdit;
Label4: TLabel;
Edit21: TEdit;
Label5: TLabel;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Matrix=class
a:array[1..3,1..3]of real;
constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:integer);
procedure Umnogenie(k:integer);
procedure vyvod;
procedure Delenie(d:integer);
procedure vvod;
procedure Stepen(r:integer;a:array of integer);

end;
var
i,j:integer;
Form1: TForm1;
Tmatrix:matrix;
x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
implementation

{$R *.dfm}
constructor matrix.create;
begin inherited create;
a[1,1]:=x1;
a[1,2]:=x2;
a[1,3]:=x3;
a[2,1]:=x4;
a[2,2]:=x5;
a[2,3]:=x6;
a[3,1]:=x7;
a[3,2]:=x8;
a[3,3]:=x9;
end;

procedure matrix.vvod;
begin
x1:=strtoint(form1.edit1.text);
x2:=strtoint(form1.edit2.text);
x3:=strtoint(form1.edit3.text);
x4:=strtoint(form1.edit4.text);
x5:=strtoint(form1.edit5.text);
x6:=strtoint(form1.edit6.text);
x7:=strtoint(form1.edit7.text);
x8:=strtoint(form1.edit8.text);
x9:=strtoint(form1.edit9.text);
end;

procedure matrix.vyvod;
begin
form1.edit10.text:=floattostr(a[1,1]);
form1.edit11.text:=floattostr(a[1,2]);
form1.edit12.text:=floattostr(a[1,3]);
form1.edit13.text:=floattostr(a[2,1]);
form1.edit14.text:=floattostr(a[2,2]);
form1.edit15.text:=floattostr(a[2,3]);
form1.edit16.text:=floattostr(a[3,1]);
form1.edit17.text:=floattostr(a[3,2]);
form1.edit18.text:=floattostr(a[3,3]);
end;

procedure matrix.Umnogenie;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=a[i,j]*k;
end;

procedure matrix.Delenie;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=a[i,j]/d;
end;

procedure matrix.Stepen;
begin
for i := 1 to 3 do begin
for j := 1 to 3 do begin
a[i,j]:=0;
end;end;
begin
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
end;
end;

procedure TForm1.N2Click(Sender: TObject);
var
k:integer;
begin
k:=strtoint(form1.edit19.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Umnogenie(k);
Tmatrix.Vyvod;
end;

procedure TForm1.N3Click(Sender: TObject);
var
d:integer;
begin
d:=strtoint(form1.edit20.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Delenie(d);
Tmatrix.Vyvod;
end;

procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Stepen(r,a);
Tmatrix.Vyvod;
end;

end.

68 ответов в теме “Delphi – ошибка Array type Requied”

  1. 48
    Павел Потапов ответил:

    Циклы по i и j, конечно, забыл :) У мну ж даж Дельфи не стоит, чтоп проверить…

    Вместо

    for r := 1 to 3 do
    temp[i,j]:= temp[i,j]+result[i,r]*a[r,j];

    Надо

    for i := 1 to 3 do
    for j := 1 to 3 do
    for k := 1 to 3 do
    temp[i,j]:= temp[i,j]+result[i,k]*a[k,j];

    Самое главное-то (умножение матриц) и не написал :)

  2. 47
    Андрей Мазур ответил:

    TMatrix = array of real;
    индексация в динамических массивах начинается с нуля
    чтобы использовать его как двумерный нужно использовать правильную индексацию
    то есть на примере
    n – размерность
    var
    a: TMatrix;
    i, j: integer;
    Setlength(a,n*n);
    Randomize;
    for i:=0 to n-1 do
    for j:=0 to n-1 do
    a[i*n+j]:=Random(100)-100;

    таким циклом можно обрабатывать матрицу представленную одномерным массивом

  3. 46
    Сергей Старовой ответил:

    а где циклы по i и j? :)
    И переменные так в делфи не объявлялись, по крайней мере когда я еще в нем кодил, хз что в последних версиях там…

  4. 45
    Павел Потапов ответил:

    Внесу и я свою лепту, хотя в Дельфях не силен, могу накосячить с синтаксисом ;)

    procedure matrix.Stepen;
    begin

    // создаем матрицу, где будет результат. Записываем текущее значение – 1я степень ;)
    MyMatrix result = a;

    // Возводим в степень.
    for r_cur:= 2 to r do // <– Первая степень у нас уже есть – начинаем со 2й.
    begin

    // Умножаем текущий результат на a.

    MyMatrix temp;

    // Вычисляем значение степени для ячейки [i, j]. Возможно ее сначала надо заполнить нулями.
    for r := 1 to 3 do
    temp[i,j]:= temp[i,j]+result[i,r]*a[r,j];

    result = temp; // Запоминаем промежуточный вариант.

    end;

    a = result; // Окончательное значение.

    end;

  5. 44
    Яков Мишин ответил:

    Удачно разобраться :-)
    Если не получится, пиши завтра днём в личку, продолжим здесь обсуждение, чем смогу помогу.

    p.s. Утро вечера мудренее будет.

  6. 43
    Светлана Шульц ответил:

    procedure matrix.Stepen;
    begin
    for i := 1 to n do
    for j := 1 to n do
    a[i,j]:=exp(r*ln(a[i,j]));

    еще такой вариант возведения есть)

  7. 42
    Сергей Старовой ответил:

    А что такое r? ) показатель степени?
    Ато функция stepen совсем не похожа на функцию возводящую матрицу в степень )

  8. 41
    Яков Мишин ответил:

    Напони что такое степень матрицы, т.е что ты хочешь чтобы этот метод делал?

  9. 40
    Сергей Старовой ответил:

    for i := 1 to n do
    for j := 1 to n do
    a[i,j]:=0;

    Собсна не удивительно что все нули :)

  10. 39
    Светлана Шульц ответил:

    возвести матрицу в степень значит умножить ее саму на себя столько раз,в какую степень ее над возвести

  11. 38
    Светлана Шульц ответил:

    Процедура, осуществляющая произведение двух матриц. Данная процедура организована с помощью вложенного цикла по параметрам iи j. В качестве входных параметров используется:
    - две матрицы, которые буду умножены
    - количество строк и столбцов матриц
    В качестве выходных параметров используется матрицы, содержащая результат произведения двух матриц.

    {процедура, осуществляющая умножение двух матриц}
    {A размерность m*n}
    {B размерность n*p}
    {a,b – матрицы, которые будем умножать}
    {KP – результирующая матрица}
    {n –количество столбцов первой матрицы}
    {m – количество строк первой матрицы}
    {n – количество строк второй матрицы}
    {p – количество столбцов второй матрицы}
    procedure ymnog(a,b:typematrix; n,m:integer; var KP:typematrix);
    var
    i,j,k:integer;
    begin{ymnog}
    for i:=1 to m do
    for j:=1 to p do
    begin
    C[i,j]:=0;
    for k:=1 to n do
    C[i,j]:=C[i,j]+a[i,k]*b[k,j];
    end;
    end;{ymnog}
    воть че в инете нашла.на всех сайтах так

  12. 37
    Яков Мишин ответил:

    Хм…. не так всё просто надо повспоминатьт линейную алгебру….

  13. 36
    Светлана Шульц ответил:

    так он выводит все нули…

  14. 35
    Яков Мишин ответил:

    Это раз!

    procedure TForm1.N4Click(Sender: TObject);
    var
    r:integer;
    a:MyMatrix;
    begin
    r:=strtoint(form1.edit21.text);
    Tmatrix.vvod;// Ввели в Иксы из едитов
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);// Заполнили экземляр массива
    Tmatrix.Stepen(r,Tmatrix.a);// Возводим встепень
    Tmatrix.Vyvod;
    end;

    Передавать параметром матрицу вовсе не обязатльно коли ты работаешь в видимости одного экземпляра.

    Это два!

    procedure matrix.Stepen;
    begin
    for i := 1 to n do
    for j := 1 to n do
    a[i,j]:=0;// все 0
    for r := 1 to 3 do
    a[i,j]:= a[i,j]+a[i,r]*a[r,j]; // := 0 + 0*0 = 0 :-)
    end;

    И сознаюсь ноль всё же надо.

  15. 34
    Светлана Шульц ответил:

    а как тогда.не обнулять ее совсем?но тогда ведь вычисления неверные будут..или неть?

  16. 33
    Яков Мишин ответил:

    Напиши полнорстью свою задачу, что тебе надо получить и необходимый в использовании инструмент, пробуем с объяснениями ещё разок. :-)

  17. 32
    Светлана Шульц ответил:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Menus, StdCtrls;

    type
    TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit10: TEdit;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    Edit19: TEdit;
    Label3: TLabel;
    Edit20: TEdit;
    Label4: TLabel;
    Edit21: TEdit;
    Label5: TLabel;
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    const
    n =3;
    type MyMatrix=array[1..n] of array[1..n] of real;
    type
    Matrix=class

    a:MyMatrix;

    constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:real);
    procedure vvod;
    procedure Umnogenie(k:integer);
    procedure Delenie(d:integer);
    procedure Stepen(r:integer;a:MyMatrix);
    procedure vyvod;
    end;

    var
    i,j:integer;
    Form1: TForm1;
    Tmatrix:matrix;
    x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
    implementation

    {$R *.dfm}
    constructor matrix.create;
    begin inherited create;
    a[1,1]:=x1;
    a[1,2]:=x2;
    a[1,3]:=x3;
    a[2,1]:=x4;
    a[2,2]:=x5;
    a[2,3]:=x6;
    a[3,1]:=x7;
    a[3,2]:=x8;
    a[3,3]:=x9;
    end;

    procedure matrix.vvod;
    begin
    x1:=strtoint(form1.edit1.text);
    x2:=strtoint(form1.edit2.text);
    x3:=strtoint(form1.edit3.text);
    x4:=strtoint(form1.edit4.text);
    x5:=strtoint(form1.edit5.text);
    x6:=strtoint(form1.edit6.text);
    x7:=strtoint(form1.edit7.text);
    x8:=strtoint(form1.edit8.text);
    x9:=strtoint(form1.edit9.text);
    end;

    procedure matrix.vyvod;
    begin
    form1.edit10.text:=floattostr(a[1,1]);
    form1.edit11.text:=floattostr(a[1,2]);
    form1.edit12.text:=floattostr(a[1,3]);
    form1.edit13.text:=floattostr(a[2,1]);
    form1.edit14.text:=floattostr(a[2,2]);
    form1.edit15.text:=floattostr(a[2,3]);
    form1.edit16.text:=floattostr(a[3,1]);
    form1.edit17.text:=floattostr(a[3,2]);
    form1.edit18.text:=floattostr(a[3,3]);
    end;

    procedure matrix.Umnogenie;
    begin
    for i:=1 to n do
    for j:=1 to n do
    a[i,j]:=a[i,j]*k;
    end;

    procedure matrix.Delenie;
    begin
    for i:=1 to 3 do
    for j:=1 to 3 do
    a[i,j]:=a[i,j]/d;
    end;

    procedure matrix.Stepen;
    begin
    for i := 1 to n do
    for j := 1 to n do
    a[i,j]:=0;
    for r := 1 to 3 do
    a[i,j]:= a[i,j]+a[i,r]*a[r,j];
    end;

    procedure TForm1.N2Click(Sender: TObject);
    var
    k:integer;
    begin
    k:=strtoint(form1.edit19.text);
    Tmatrix.vvod;
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
    Tmatrix.Umnogenie(k);
    Tmatrix.Vyvod;
    end;

    procedure TForm1.N3Click(Sender: TObject);
    var
    d:integer;
    begin
    d:=strtoint(form1.edit20.text);
    Tmatrix.vvod;
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
    Tmatrix.Delenie(d);
    Tmatrix.Vyvod;
    end;

    procedure TForm1.N4Click(Sender: TObject);
    var
    r:integer;
    a:MyMatrix;
    begin
    r:=strtoint(form1.edit21.text);
    Tmatrix.vvod;
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
    Tmatrix.Stepen(r,Tmatrix.a);
    Tmatrix.Vyvod;
    end;

    end.

  18. 31
    Светлана Шульц ответил:

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

  19. 30
    Сергей Старовой ответил:

    [quote] скопировала вставила то что написал.выводит то же самое(данную матрицу [/quote]

    Вот и начали проявляться бонусы от сюрреализма в коде :)

    Делфи под рукой нет, и писал на нем я давно, но попробуй изменить определение метода степень вот так
    procedure stepen(r:integer; var a:MyMatrix);

  20. 29
    Светлана Шульц ответил:

    скопировала вставила то что написал.выводит то же самое(данную матрицу

  21. 28
    Дмитрий Евтеев ответил:

    ну ни че себе девушка программист…..))

  22. 27
    Светлана Шульц ответил:

    да девушка то не оч программист)
    хорошо тут люди отзывчивые попались,чем могут помогают,спасибо им,почти уже сделали все)

  23. 26
    Яков Мишин ответил:

    Сергей молодец – дело подсказал, определить тип – самый простой метод. +5

  24. 25
    Сергей Старовой ответил:

    Tmatrix.Stepen(r;a);
    Первая точка с запятой откуда )

  25. 24
    Светлана Шульц ответил:

    а если запятую ставить то грит что неопределенынй параметр а

  26. 23
    Светлана Шульц ответил:

    procedure TForm1.N4Click(Sender: TObject);
    var
    r:integer;
    a:MyMatrix;
    begin
    r:=strtoint(form1.edit21.text);
    Tmatrix.vvod;
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
    Tmatrix.Stepen(r,a);
    Tmatrix.Vyvod;
    end;

    программа заработала))
    тока она выводит почему то матрицу которую я ввела

  27. 22
    Сергей Старовой ответил:

    omg )
    Поле a определено в классе matrix, а метод n4click в форме, естественно что они друг друга не видят.
    Tmatrix.Stepen(r,tmatrix.a);

  28. 21
    Сергей Старовой ответил:

    Хотя нет , цикл править не нужно, он уже правильный )

  29. 20
    Светлана Шульц ответил:

    private
    { Private declarations }
    public
    { Public declarations }
    end;
    const
    n =3;
    type MyMatrix=array[1..3] of array[1..3] of real;
    type
    Matrix=class

    a:array[1..n,1..n] of MyMatrix;
    constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:real);
    procedure Umnogenie(k:integer);
    procedure vyvod;
    procedure Delenie(d:integer);
    procedure vvod;
    procedure Stepen(r:integer;a:array of MyMatrix);

    end;

    var
    i,j:integer;
    Form1: TForm1;
    Tmatrix:matrix;
    x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
    implementation

    {$R *.dfm}
    constructor matrix.create;
    begin inherited create;
    a[1,1]:=x1;————вот сюда показывает и пишет что не совпадают типы myMatrixи real
    a[1,2]:=x2;
    a[1,3]:=x3;
    a[2,1]:=x4;
    a[2,2]:=x5;
    a[2,3]:=x6;
    a[3,1]:=x7;
    a[3,2]:=x8;
    a[3,3]:=x9;
    end;

  30. 19
    Сергей Старовой ответил:

    Нет, не так брутально )
    const
    n =3;
    type MyMatrix=array[1..n] of array[1..n] of real;
    type
    Matrix=class

    a:MyMatrix;

    procedure Stepen(r:integer;a:MyMatrix);

  31. 18
    Светлана Шульц ответил:

    урря)))почти работает))

    procedure TForm1.N4Click(Sender: TObject);
    var
    r:integer;
    begin
    r:=strtoint(form1.edit21.text);
    Tmatrix.vvod;
    Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
    Tmatrix.Stepen(r;a);—–говорит что не хватает параметров О_о
    Tmatrix.Vyvod;
    end;

    end.

  32. 17
    Сергей Старовой ответил:

    Пару строчек поправить всего )
    Хотя в принципе стоило бы и всю программу переписать, она немного пугающе выглядит щас )

  33. 16
    Светлана Шульц ответил:

    я уже пятый час сижу с этой фигней((
    переписывать все не в моих силах уже

  34. 15
    Светлана Шульц ответил:

    четя прям оч не пойму как тут исправить пару строчек и получится программа О_о
    можете помочь?)

  35. 14
    Сергей Старовой ответил:

    Перед определением класса с матрицей вставить строчку
    type MyMatrix=array[1..3] of array[1..3] of real;

    Потом определение поля a сделать типа MyMatrix, параметр у функции степень тоже сделать MyMatrix, и поправить цикл for внутри процедуры степень чтобы он проходил от 1 до 3 а не от 0 до 2. Вроде все

  36. 13
    Сергей Старовой ответил:

    :D
    Смотри.У тебя написано в определении класса
    procedure Stepen(r:integer;a:array of integer);
    т.е. a – одномерный массив.

    А в реализации функции ты пишешь
    a[i,j]:= a[i,j]+a[i,r]*a[r,j];
    т.е. индексируешь этот массив как двухмерный. Так нельзя делать )

  37. 12
    Светлана Шульц ответил:

    а если я пишу procedure Stepen(r:integer;a:array[1..3,1..3] of real); воть так то он ошибку выдает((
    и как из этого выйти

  38. 11
    Сергей Старовой ответил:

    Ну ващет по хорошему стоило бы определить тип
    type MyMatrix=array[0..2] of array[0..2] of real;
    и использовать его везде по коду…

  39. 10
    Светлана Шульц ответил:

    эт мне сейчас придется всю программу переписываь получается?((((

  40. 9
    Яков Мишин ответил:

    А зачем ты отпределила аргумент в заголовке процедуры:?
    procedure Stepen(r:integer;a:array of integer);

    не верно ли будет будет описывать её так:
    procedure Stepen(r:integer);

    А использовать вот так:
    Tmatrix.Stepen(r);

  41. 8
    Сергей Старовой ответил:

    Ошибка собсна потому, что аргументпроцедуры определен так
    a: array of integer;
    т.е. как одномерный массив. а используется как двухмерный массив.
    вот он и хочет вместо интегера видеть массив )

  42. 7
    Светлана Шульц ответил:

    тогда компилится но в результате выводит нули все,потому что неучитывает массив совсем.воть(

  43. 6
    Светлана Шульц ответил:

    Сергей Lucius Старовой
    О_о.где именно?там вроде все норм задано

  44. 5
    Яков Мишин ответил:

    Уй блин сколько лишних операторских скобок.

    Так короче и понятнее будет

    procedure matrix.Stepen;
    begin
    for i := 1 to 3 do
    for j := 1 to 3 do
    a[i,j]:=0;
    for r := 1 to 3 do
    a[i,j]:= a[i,j]+a[i,r]*a[r,j];
    end;

    Комментируй операционную строчку, будем дальше смотреть.

  45. 4
    Светлана Шульц ответил:

    procedure matrix.Stepen;
    begin
    for i := 1 to 3 do
    for j := 1 to 3 do
    a[i,j]:=0;—-указывает на эту строку пишет array type requied
    for r := 1 to 3 do
    a[i,j]:= a[i,j]+a[i,r]*a[r,j];
    end;

  46. 3
    Яков Мишин ответил:

    *Нефига не видно выделенной строки.

    Что за аргумент в "a"?
    И где его определение в вызове?
    procedure Stepen(r:integer;a:array of integer);

  47. 2
    Светлана Шульц ответил:

    procedure matrix.Stepen;
    begin
    for i := 1 to 3 do begin
    for j := 1 to 3 do begin
    a[i,j]:=0;
    end;end;
    begin
    for r := 1 to 3 do
    a[i,j]:= a[i,j]+a[i,r]*a[r,j];!!!!!!!!!!!!!!!!!!!!!
    end;
    end;

    воть она)

  48. 1
    Светлана Шульц ответил:

    а-это массив с которым мы работаем и который мы вводим через эдиты
    его надо возвести в степень(это у меня и не выходит никак

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.