Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-51615
Shaman
2002-11-26 17:06
2002.12.16
Автоинкрементные поля - как с ними работать ч-з TSimpleDataSet


1-51794
Vagrant
2002-12-05 06:42
2002.12.16
SHAREMEM


6-51850
Igor_thief
2002-10-20 18:53
2002.12.16
Почта


1-51830
DDF
2002-12-05 11:20
2002.12.16
Outlook Express добавить письмо


6-51870
boolean
2002-10-07 13:40
2002.12.16
Help





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский