![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
функция, которая возвращает матрицу [D7, Win2k]
Andarko © (2005-05-25 18:51:00)Как написать функцию, которая возвращала бы матрицу(по определенному алгоритму) и не ругалась бы!
TUser (2005-05-27 11:29:00) [1]> не стоит писать функцию, результирующую матрицу следует передавать через параметры процедуры
Почему? Чтобы выделять и освобождать память в вызывающей процедуре?
Erik1 (2005-05-27 11:23:00) [2]И работать с указателями.
TMatrix = array of array of integer;
PMatrix = TMatrix^;
procedure My_Trans(.., const Matrix: PMatrix);
begin
SetLength(Matrix^, 2, 3);
...
End;
Я всегда работаю с указатеми если возникают сомнения с передачей параметров.
vl_chel (2005-05-26 10:35:00) [3]Небольшой совет:
не стоит писать функцию, результирующую матрицу следует передавать через параметры процедуры
Andarko (2005-05-26 08:08:00) [4]Таки я нашел, почему у меня вылазит эта ошибка!
Я то искал ошибку в динамических матрицах.
В одной из функций, возращающих динамичискую матрицу
используется статическаяматрица и идет присвоение её несуществующему элементу. %)
Просто Джо (2005-05-25 23:28:00) [5]Удалено модератором
Примечание: По модераторски это означает Р/О
Kolan (2005-05-25 23:20:00) [6]Удалено модератором
Примечание: По модераторски это означает Р/О
begin...end (2005-05-25 20:48:00) [7]> Kolan © (25.05.05 19:48) [19]
> Кстати как надо освободить память
> SetLength(M,0,0);
> Или SetLength(M,0);
Монопенисуально.
TUser (2005-05-25 20:18:00) [8]Я бы писал SetLength(M,0,0) не знаю даже почему.
И выделять так же - не нужен там цикл, если массив 'прямоугольный'.
Kolan (2005-05-25 19:52:00) [9]
> как в справке делают
как в справке делают = так в справке делают
Kolan (2005-05-25 19:48:00) [10]Кстати как надо освободить память
SetLength(M,0,0);
ИлиSetLength(M,0);
А если
так выделять
SetLength(Matrix, Dimensionality);как в справке делают.
for I := Low(Matrix) to High(Matrix) do
SetLength(Matrix[I], Dimensionality);
Просто Джо (2005-05-25 19:43:00) [11]
> [16] begin...end © (25.05.05 19:39)
> Как видно по [4], сложности всё-таки были :-)
Да, извини, я просто неправильно тебя понял.
А по поводу [4] - ну что тут скажешь? :*(
Просто Джо (2005-05-25 19:41:00) [12]
> [15] Kolan © (25.05.05 19:38)
> А это зачем?
Совершенно низачем. Всего лишь затем, чтобы в тестовом примере, следующем ниже, показать, что динамический массив правильно создался, заполнился значениями и возвратился из функции.
begin...end (2005-05-25 19:39:00) [13]> Просто Джо © (25.05.05 19:37) [14]
> Поэтому и не понимаю сложности сабжа
Как видно по [4], сложности всё-таки были :-)
Kolan (2005-05-25 19:38:00) [14]
> Просто Джо © (25.05.05 19:22) [11]
> Result[5,5] := 10;
А это зачем?
Просто Джо (2005-05-25 19:37:00) [15]
> [12] begin...end © (25.05.05 19:31)
> > Просто Джо © (25.05.05 19:22) [11]
>
> > А в чем тут подвох?
>
> А он должен быть?
Я никакого подвоха в таком подходе не вижу. Обычнычнейший подход, как и с любой другой функцией. Псевдо-переменная Result имеет в теле функции тот же тип, что и возвращаемое функцией значение. Поэтому и не понимаю сложности сабжа, а так же почему "функция которая возвращает матрицу" отличается от функции, которая возвращает что-либо другое.
Из твоего замечания
> Ты бы эта... Код рабочий привёл
я сделал вывод, что ты утверждаешь, что по сабжу невозможно привести рабочий код. Вот и спросил, что ты имеешь в виду ;-)
TUser (2005-05-25 19:35:00) [16]> С этого места поподробнее.
В смысле? Если я получил матрицу M:=GetMatrix, то потом я где-то должен написать SetLength(M,0,0);
begin...end (2005-05-25 19:31:00) [17]> Просто Джо © (25.05.05 19:22) [11]
> А в чем тут подвох?
А он должен быть?
Просто Джо (2005-05-25 19:22:00) [18][3] begin...end © (25.05.05 18:55)
> Ты бы эта... Код рабочий привёл. Для возвращения дин. массива
> из функции.
А в чем тут подвох?
function CreateMatrix (RowCount,ColCount: Integer): TMatrix;
begin
SetLength (Result,RowCount,ColCount);
Result[5,5] := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Matrix: TMatrix;
begin
Matrix := CreateMatrix(10,10);
ShowMessage (IntToStr(High(Matrix)));
ShowMessage (IntToStr(Matrix[5,5]));
end;
Andarko (2005-05-25 19:16:00) [19]СПАСИБО ВСЕМ!
begin...end (2005-05-25 19:13:00) [20]> Andarko © (25.05.05 19:06) [6]
type
TMatrix = array [1..3] of array [1..2] of integer;
function GetMatrix: TMatrix;
begin
...
end