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

Вниз

функция, которая возвращает матрицу   Найти похожие ветки 

 
Andarko ©   (2005-05-25 18:51) [0]

Как написать функцию, которая возвращала бы матрицу(по определенному алгоритму) и не ругалась бы!


 
TUser ©   (2005-05-25 18:52) [1]

type
TMatrix = array of array of integer;

function GetMatrix: TMatrix;
begin

end;

Если с дин. массивами - то не забудь освобождать память.


 
VMcL ©   (2005-05-25 18:54) [2]

>>TUser ©   (25.05.05 18:52) [1]

>Если с дин. массивами - то не забудь освобождать память.

С этого места поподробнее.


 
begin...end ©   (2005-05-25 18:55) [3]

> TUser ©   (25.05.05 18:52) [1]

> type
> TMatrix = array of array of integer;
>
> function GetMatrix: TMatrix;

Ты бы эта... Код рабочий привёл. Для возвращения дин. массива из функции.


 
Andarko ©   (2005-05-25 18:59) [4]

function My_Trans(m1:mas2D):mas2D;
var i,j:integer;
   m:mas2D;
begin
 SetLength(m,N,N);
 for i:=0 to N-1 do
   for j:=0 to N-1 do m[i,j]:=m1[j,i];
 My_Trans:=m;
 m:=nil;
end;
вот после использования этой функции далее по
коду проги идет такая операция
Setlength(Evec1,N,N);
где Evec1 - пустой динамический массив
на этой строке выдает ошибку EAcessViolation

Буду очень признателен, если скажете в чем дело и как надо делать такие функции


 
begin...end ©   (2005-05-25 19:03) [5]

> Andarko ©   (25.05.05 18:59) [4]

А матрица обязательно динамическая? Статическая не подойдёт?


 
Andarko ©   (2005-05-25 19:06) [6]

>begin...end ©   (25.05.05 19:03) [5]
>> Andarko ©   (25.05.05 18:59) [4]

>А матрица обязательно динамическая? Статическая не подойдёт?

Подойдет, хоть это и не желательно


 
Marser ©   (2005-05-25 19:08) [7]

Под Result(то бишь MyTrans) память не выделена.


 
alertus   (2005-05-25 19:12) [8]

Код из моей рабочей программы, заодно может кто-нибудь поправит:

 TMatrix = class(TObject)
 private
   w:integer;  //ширина матрицы
   h:integer;  //высота матрицы
   elem:array of array of real;  //массив элементов матрицы
 public
   constructor Create(wset,hset:integer); virtual;
   destructor Destroy; override;
   function GetElem(i,j:integer):real;
   procedure SetElem(i,j:integer;r:real);
   function GetWidth:integer;
   function GetHeight:integer;
 end;
....

function FillMatrix(wset,hset:integer;r:real):TMatrix;  //Заполняет матрицу числом r
var
 i,j:integer;
begin
 result:=TMatrix.Create(wset,hset);
 for i:=1 to result.w do begin
   for j:=1 to result.h do begin
     result.SetElem(i,j,r);
   end;
 end;
end;


 
begin...end ©   (2005-05-25 19:13) [9]

> Andarko ©   (25.05.05 19:06) [6]

type
 TMatrix = array [1..3] of array [1..2] of integer;

function GetMatrix: TMatrix;
begin
 ...
end


 
Andarko ©   (2005-05-25 19:16) [10]

СПАСИБО ВСЕМ!


 
Просто Джо ©   (2005-05-25 19:22) [11]

[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;


 
begin...end ©   (2005-05-25 19:31) [12]

> Просто Джо ©   (25.05.05 19:22) [11]

> А в чем тут подвох?

А он должен быть?


 
TUser ©   (2005-05-25 19:35) [13]

> С этого места поподробнее.

В смысле? Если я получил матрицу M:=GetMatrix, то потом я где-то должен написать SetLength(M,0,0);


 
Просто Джо ©   (2005-05-25 19:37) [14]


>  [12] begin...end ©   (25.05.05 19:31)
> > Просто Джо ©   (25.05.05 19:22) [11]
>
> > А в чем тут подвох?
>
> А он должен быть?


Я никакого подвоха в таком подходе не вижу. Обычнычнейший подход, как и с любой другой функцией. Псевдо-переменная Result имеет в теле функции тот же тип, что и возвращаемое функцией значение. Поэтому и не понимаю сложности сабжа, а так же почему "функция которая возвращает матрицу" отличается от функции, которая возвращает что-либо другое.
Из твоего замечания

> Ты бы эта... Код рабочий привёл

я сделал вывод, что ты утверждаешь, что по сабжу невозможно привести рабочий код. Вот и спросил, что ты имеешь в виду ;-)


 
Kolan ©   (2005-05-25 19:38) [15]


> Просто Джо ©   (25.05.05 19:22) [11]

>  Result[5,5] := 10;

А это зачем?


 
begin...end ©   (2005-05-25 19:39) [16]

> Просто Джо ©   (25.05.05 19:37) [14]

> Поэтому и не понимаю сложности сабжа

Как видно по [4], сложности всё-таки были :-)


 
Просто Джо ©   (2005-05-25 19:41) [17]


>  [15] Kolan ©   (25.05.05 19:38)
> А это зачем?

Совершенно низачем. Всего лишь затем, чтобы в тестовом примере, следующем ниже, показать, что динамический массив правильно создался, заполнился значениями и возвратился из функции.


 
Просто Джо ©   (2005-05-25 19:43) [18]


>  [16] begin...end ©   (25.05.05 19:39)
> Как видно по [4], сложности всё-таки были :-)

Да, извини, я просто неправильно тебя понял.

А по поводу [4] - ну что тут скажешь? :*(


 
Kolan ©   (2005-05-25 19:48) [19]

Кстати как надо освободить память
SetLength(M,0,0);
Или SetLength(M,0);
А если

так выделять
SetLength(Matrix, Dimensionality);
 for I := Low(Matrix) to High(Matrix) do
   SetLength(Matrix[I], Dimensionality);
как в справке делают.


 
Kolan ©   (2005-05-25 19:52) [20]


> как в справке делают

как в справке делают = так в справке делают


 
TUser ©   (2005-05-25 20:18) [21]

Я бы писал SetLength(M,0,0) не знаю даже почему.
И выделять так же - не нужен там цикл, если массив "прямоугольный".


 
begin...end ©   (2005-05-25 20:48) [22]

> Kolan ©   (25.05.05 19:48) [19]

> Кстати как надо освободить память
> SetLength(M,0,0);
> Или SetLength(M,0);

Монопенисуально.


 
Kolan ©   (2005-05-25 23:20) [23]

Удалено модератором
Примечание: По модераторски это означает Р/О


 
Просто Джо ©   (2005-05-25 23:28) [24]

Удалено модератором
Примечание: По модераторски это означает Р/О


 
Andarko ©   (2005-05-26 08:08) [25]

Таки я нашел, почему у меня вылазит эта ошибка!
 Я то искал ошибку в динамических матрицах.
В одной из функций, возращающих динамичискую матрицу
используется статическая матрица и идет присвоение её несуществующему элементу. %)


 
vl_chel ©   (2005-05-26 10:35) [26]

Небольшой совет:
не стоит писать функцию, результирующую матрицу следует передавать через параметры процедуры


 
Erik1 ©   (2005-05-27 11:23) [27]

И работать с указателями.
TMatrix = array of array of integer;
PMatrix = TMatrix^;
procedure My_Trans(.., const Matrix: PMatrix);
begin
SetLength(Matrix^, 2, 3);
...
End;
Я всегда работаю с указатеми если возникают сомнения с передачей параметров.


 
TUser ©   (2005-05-27 11:29) [28]

> не стоит писать функцию, результирующую матрицу следует передавать через параметры процедуры

Почему? Чтобы выделять и освобождать память в вызывающей процедуре?



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.053 c
14-1117177400
juice
2005-05-27 11:03
2005.06.14
Разрешение адресов


14-1117005548
stone
2005-05-25 11:19
2005.06.14
Стих


14-1117026867
Korvet
2005-05-25 17:14
2005.06.14
Открытие окон в инете.


4-1113899638
dimasih
2005-04-19 12:33
2005.06.14
Документация по TService


1-1117376417
aha
2005-05-29 18:20
2005.06.14
Как красиво как в Ворде например сделать функцию переименования