Форум: "Основная";
Текущий архив: 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.036 c