Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы Найти похожие ветки
← →
avsh (2002-11-28 01:08) [0]Подскажите пожайлуста почему не работает функция 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;
← →
Юрий Зотов (2002-11-28 01:26) [1]1. SetLength имеет два параметра, а Вы пытаетесь загнать ей три. Как же быть бедняге компилятору? Он не знает, вот и ругается.
2. FElem := Value копирует адрес, а не тело массива. Если это не то, чего Вы добивались, то используйте, например, Move.
← →
Anatoly Podgoretsky (2002-11-28 08:08) [2]Для двухмерных вообще то три
← →
Fantasist (2002-11-28 20:46) [3]
> SetLength имеет два параметра, а Вы пытаетесь загнать ей
> три. Как же быть бедняге компилятору? Он не знает, вот и
> ругается.
Да, хоть в хелпе и написано, что для нее всего два параметра, практически установлено, что компилятор эту функцию компилирует особо, и при необходимости заменяет ее на DynArraySetLength которая может принимать принимает параметры через стек и число их "неограниченно" (это естесственно не относиться к первому параметру). Так что и такая вещь вполне допустима:
var
a:array of array of array of integer;
begin
SetLength(a,10,5,3);
end;
← →
Anatoly Podgoretsky (2002-11-28 20:53) [4]Информация об SetLength для многоразмерных массивах находится в хелпе по теме Multidimensional dynamic arrays, там же пример для двухмерного массива.
← →
Fantasist (2002-11-29 19:07) [5]
> Информация об SetLength для многоразмерных массивах находится
> в хелпе по теме Multidimensional dynamic arrays
Да, но почему-то разработчики не догадались вставить эту информацию в помощь о SetLength. Надо лезть в See Also, выбирать там Dynamic Array и потом еще найти на той странице ссылку на Multidimensional dynamic arrays, и после этого там можно увидеть строчку с примером. Что естесственно, может сконфузить людей, которые считают, что информация о функции SetLength вполне полно изложенна не первой странице. Ну или хотя бы какие-то явные ссылки на возможное другое использование.
← →
Anatoly Podgoretsky (2002-11-29 20:53) [6]В Борланде работают тоже люди и хелп пишется всегда в последнею очередь (иногда после выхода), при исправлении ошибок как правило не все ошибки исправляются, иногда никогда.
Там все равно остается вопрос для случая более двух измерений.
← →
Fantasist (2002-11-30 02:43) [7]
> Там все равно остается вопрос для случая более двух измерений
Где? И какой?
← →
Meshalo (2002-12-05 12:36) [8]Просто по вертикали элемент массива типа Integer, а по горизонтали Double и какого типа должен быть элемент, например a[1,1]?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c