Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.033 c
1-1117122507
Avals-Z
2005-05-26 19:48
2005.06.14
Подскажите кто знает


1-1117529276
webpauk
2005-05-31 12:47
2005.06.14
работа с Pointer


14-1116901352
Mad
2005-05-24 06:22
2005.06.14
MMORPG


3-1115264768
Бизон
2005-05-05 07:46
2005.06.14
Проблемы с кодировкой


1-1117460259
heady
2005-05-30 17:37
2005.06.14
Размеры иконок





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский