![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы [D6]
avsh © (2002-11-28 01:08:00)Подскажите пожайлуста почему не работает функция SetElem
unit WorkMatr;
interface
uses SysUtils,Dialogs;
type
TArrayBase = double;
TMaxSize = integer;
TDinVect = array of TArrayBase;
TDinMatr = array of TDinVect;
TMatr = class
private
FElem: TDinMatr;
procedure SetElem(const Value: TDinMatr);
public
property Elem:TDinMatr read FElem write SetElem;
Constructor Create(R,C:TMaxSize);
function GetRow:TMaxSize;
function GetColumns:TMaxSize;
procedure TransMatr;
function MultMatr(A:TDinMatr):TDinMatr;
end;
implementation
////////////////////////////////////////////////////////
procedure TMatr.SetElem(const Value: TDinMatr);
begin
SetLength(FElem,Length(Value),Length(Value[0]));//Здесь выдает ошибку
FElem := Value;
end;
Constructor TMatr.Create(R,C:TMaxSize);
var A:TDinMatr;
begin
SetLength(A,R,C);
SetElem(A);
SetLength(A,0,0);
end;
function TMatr.GetRow: TMaxSize;
begin
result:=Length(Elem);
end;
function TMatr.GetColumns: TMaxSize;
begin
Result:=Length(Elem[0]);
end;
Meshalo (2002-12-05 12:36:00) [1]Просто по вертикали элемент массива типа Integer, а по горизонтали Double и какого типа должен быть элемент, например a[1,1]?
Fantasist (2002-11-30 02:43:00) [2]
> Там все равно остается вопрос для случая более двух измерений
Где? И какой?
Anatoly Podgoretsky (2002-11-29 20:53:00) [3]В Борланде работают тоже люди и хелп пишется всегда в последнею очередь (иногда после выхода), при исправлении ошибок как правило не все ошибки исправляются, иногда никогда.
Там все равно остается вопрос для случая более двух измерений.
Fantasist (2002-11-29 19:07:00) [4]
> Информация об SetLength для многоразмерных массивах находится
> в хелпе по теме Multidimensional dynamic arrays
Да, но почему-то разработчики не догадались вставить эту информацию в помощь о SetLength. Надо лезть в See Also, выбирать там Dynamic Array и потом еще найти на той странице ссылку на Multidimensional dynamic arrays, и после этого там можно увидеть строчку с примером. Что естесственно, может сконфузить людей, которые считают, что информация о функции SetLength вполне полно изложенна не первой странице. Ну или хотя бы какие-то явные ссылки на возможное другое использование.
Anatoly Podgoretsky (2002-11-28 20:53:00) [5]Информация об SetLength для многоразмерных массивах находится в хелпе по теме Multidimensional dynamic arrays, там же пример для двухмерного массива.
Fantasist (2002-11-28 20:46:00) [6]
> SetLength имеет два параметра, а Вы пытаетесь загнать ей
> три. Как же быть бедняге компилятору? Он не знает, вот и
> ругается.
Да, хоть в хелпе и написано, что для нее всего два параметра, практически установлено, что компилятор эту функцию компилирует особо, и при необходимости заменяет ее на DynArraySetLength которая может принимать принимает параметры через стек и число их "неограниченно" (это естесственно не относиться к первому параметру). Так что и такая вещь вполне допустима:
var
a:array of array of array of integer;
begin
SetLength(a,10,5,3);
end;
Anatoly Podgoretsky (2002-11-28 08:08:00) [7]Для двухмерных вообще то три
Юрий Зотов (2002-11-28 01:26:00) [8]1. SetLength имеет два параметра, а Вы пытаетесь загнать ей три. Как же быть бедняге компилятору? Он не знает, вот и ругается.
2. FElem := Value копирует адрес, а не тело массива. Если это не то, чего Вы добивались, то используйте, например, Move.