Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Динамические массивы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
14-51962
id_privin
2002-11-26 13:13
2002.12.16
Переход D5->D7


14-51906
Filat
2002-11-24 10:00
2002.12.16
Запись на CD-R, CD-RW


1-51816
avsh
2002-11-28 01:08
2002.12.16
Динамические массивы


3-51650
Cranium
2002-11-28 19:53
2002.12.16
IBStoredProc ругается на парметр


1-51672
Sergy
2002-12-04 15:47
2002.12.16
Как заставить перерисоваться TTreeview?