Текущий архив: 2004.11.14;
Скачать: CL | DM;
ВнизКак работать с дву мерным массивом Найти похожие ветки
← →
Kolan © (2004-10-27 18:06) [0]function TForm1.Get_Finder(A:array of extended):extended;
begin
result:=A[1,1]*A[2,2]-A[1,2]*A[2,1];
end;
Получаю ошибку array type required. Я не ток массив передпл что-ли
← →
Amoeba © (2004-10-27 18:09) [1]type
MyArr = array of array of extended;
function TForm1.Get_Finder(A:MyArr):extended;
← →
Ega23 © (2004-10-27 18:12) [2]
Type
TMyArray=array of extended;
function TForm1.Get_Finder(A:TMyArray):extended;
begin
result:=A[1,1]*A[2,2]-A[1,2]*A[2,1];
end;
Попробуй так.
← →
Ega23 © (2004-10-27 18:13) [3]Ну да, забыл...
Конечно array of array of extended
← →
Kolan © (2004-10-27 18:24) [4]Че т о я тупю
type
DubleArr = array of array of extended;
Вот Ф-цияprocedure TForm1.Solve_System_by_Gauss(A:DubleArr; B:array of extended;var X:array of extended);
var
A_Rev:array [1..2,1..2] of extended;
begin
{Find_Reversed_Matrix(A,A_Rev); }
end;
А вот я её вызываюprocedure TForm1.Solve_Equation();
var
J:array[1..2,1..2]of extended; {Ìàòðèöà ßêîáè}
X_Start:array[1..2]of extended; {Íà÷àëüíîå ïðèáëèæåíèå}
i:integer; {Ñ÷åò÷èêè}
a,k:real; {Ïàðàìåòðû}
X_Next:array[1..2] of extended;
begin
a:=1;
k:=1;
X_Start[1]:=strtofloat(Get_X0()); {Íà÷àëüíîå ïðèáëèæåíèå}
X_Start[2]:=strtofloat(Get_Y0()); {Íà÷àëüíîå ïðèáëèæåíèå}
J[1,1]:=df_dx(X_Start[1],X_Start[2],a,k);
J[1,2]:=df_dy(X_Start[1],X_Start[2],a,k);
J[2,1]:=dg_dx(X_Start[1],X_Start[2],a,k);
J[2,2]:=dg_dy(X_Start[1],X_Start[2],a,k);
Solve_System_by_Gauss(J,X_Start,X_Next)
--Ошибка Incompatible types---
end;
← →
Amoeba © (2004-10-27 18:27) [5]И неудивительно. В заголовке ф-ии параметры B и X являются не динамическими а открытыми массивами. А это "две большие разницы".
← →
begin...end © (2004-10-27 18:28) [6]
> [4] Kolan © (27.10.04 18:24)
> --Ошибка Incompatible types---
Ну так это естественно. Тип параметра, указанный в описании процедуры, не совпадает с типом передаваемой в неё переменной.
← →
Ega23 © (2004-10-27 18:28) [7]Ну всё правильно.
Обзови
type
TDubleArr = array of array of extended;
TSingleArr = array of extended;
procedure TForm1.Solve_System_by_Gauss(A:DubleArr; B:TSingleArr; var X:TSingleArr);
var
A_Rev:array [1..2,1..2] of extended;
begin
{Find_Reversed_Matrix(A,A_Rev); }
end;
Хотя я бы не стал настолько вольно обращаться со статическими и динамическими массивами.
← →
Kolan © (2004-10-27 18:30) [8]Так как же надо - то
PS устал я с этими матрицами. Основная задача вообше другая. Кстати в delphi нет процедур работы с матрицами?
← →
Amoeba © (2004-10-27 18:34) [9]Стандартных нет. Но существуют сторонние библиотеки.
← →
begin...end © (2004-10-27 18:35) [10]
> [8] Kolan © (27.10.04 18:30)
> Так как же надо - то
Например - так, как написано в [7].
> Кстати в delphi нет процедур работы с матрицами?
Стандартных - нет. ИМХО. Если не считать SetLength для многомерных массивов. :-)
← →
Ega23 © (2004-10-27 18:45) [11]Всегда считал дин.массивы - злом. Нас в универе отправляли переделывать программу, если использовался дин.массив. всё через GetMem(N*SizeOf(TMyType)).
← →
begin...end © (2004-10-27 18:48) [12]
> [11] Ega23 © (27.10.04 18:45)
Так ты, может быть, на Турбо Паскале писАл в универе? ;-)
Уж не знаю, за что динамические массивы можно злом считать...
← →
Ega23 © (2004-10-27 18:51) [13]Так ты, может быть, на Турбо Паскале писАл в универе? ;-)
Нет, Д5. Только нас учили базовым приёмом - указатели, выделение памяти, составление списков и т.п. Язык тут, ИМХО, не сильно важен.
← →
Romkin © (2004-10-27 18:55) [14]Ega23 © (27.10.04 18:51) [13] Ну если базовым - тогда да :)) Я ж еще на TP6 матрицы делал. Именно через GetMem. И функция была, которая возвращает указатель на элемент :)
Сколько крышечек в коде было...
← →
Kolan © (2004-10-27 18:57) [15]А не льза статически это сделать. Ведь A:array[1..n] of smth;
можно передать?
← →
Kolan © (2004-10-27 19:00) [16]Да и х с ним одномерным обойдусь. Думал все красиво сделать.
← →
begin...end © (2004-10-27 19:02) [17]
> [15] Kolan © (27.10.04 18:57)
Если размерность массива больше 1, то всё равно придётся объявлять свой тип.
Но в случае статического массива, по-хорошему, придётся передавать в подпрограмму и действительное число строк и столбцов - ведь оно может меняться, я правильно понял твой случай? Так что уж лучше работать с динамическими массивами, предварительно объявив тип.
Если же массив - одномерный, то можно и открытым обойтись.
← →
Ega23 © (2004-10-27 19:02) [18]Сколько крышечек в коде было...
Эт-точно... А ошибок-то..... Особенно если вызов рекурсивный... :о)
← →
begin...end © (2004-10-27 19:03) [19]
> [16] Kolan © (27.10.04 19:00)
> одномерным обойдусь. Думал все красиво сделать.
Вот тебе на. Матрица, и - одномерный массив? Или 2 одномерных массива?
Красивее не придумаешь...
← →
Ega23 © (2004-10-27 19:04) [20]Если честно, то я до сих пор боюсь этого SetLength.... :о)
Мне проще TList завести и с ним работать :о)
← →
Ega23 © (2004-10-27 19:06) [21]Вот тебе на. Матрица, и - одномерный массив?
Конечно. Одномерный массив, размером N*M. По-сути, он и есть одномерный, это для удобства кодирования ты его многомерным сделать можешь. А реально - после окончания первой строки лежит начало второй. Индексирование - проще простого.
← →
Kolan © (2004-10-27 19:07) [22]
> я правильно понял твой случай
Да нет я же как можно проше делаю, а то основное 3-4 ф-ции по 10-15 строк а работа сматрицами 8-10 да если еще универсално делать то...
А матрица у меня 2х2 и все
Страницы: 1 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.044 c