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

Вниз

Копия массива   Найти похожие ветки 

 
Massiv   (2008-06-02 17:34) [0]

Подскажите как сделать копию заполненного массива.
В книгах пишут что достаточно присвоить один массив к другому, но так у меня не получается. Привожу как пример свой код:

type
 TTree = record
   Title : String;
   ID    : Integer;
 end;

var
 Tab1 : Array of TTree;
 Tab2 : Array of TTree;

begin
SetLength(Tab1, 498);
SetLength(Tab2, 498);

Tab1 := Tab2; - не работает :((


 
Reindeer Moss Eater ©   (2008-06-02 17:51) [1]

SetLength(Tab1, 498);
SetLength(Tab2, 498);

А дальше move из первого во второй.


 
DiamondShark ©   (2008-06-02 17:54) [2]


> В книгах пишут что достаточно присвоить один массив к другому

Так это про статические массивы пишут. А у тебя динамические.
Тут ручками, поэлементно.


> А дальше move из первого во второй.

Чудесов со строками не боишься?


 
Reindeer Moss Eater ©   (2008-06-02 17:56) [3]

Чудесов со строками не боишься?

Ты думаешь я не заметил у него длинных строк?
Заметил.


 
DiamondShark ©   (2008-06-02 17:59) [4]


> Reindeer Moss Eater ©   (02.06.08 17:56) [3]
> Чудесов со строками не боишься?
>
> Ты думаешь я не заметил у него длинных строк?
> Заметил.

Посто ты такой коварный, чтоб народ не расслаблялся?
;)


 
Reindeer Moss Eater ©   (2008-06-02 18:01) [5]

так если первый массив не умрет, то строки останутся живы.


 
palva ©   (2008-06-02 18:06) [6]


> то строки останутся живы.

Живы, конечно. Но будут синхронно меняться, чего автор, по-видимому, не хотел.
{$APPTYPE CONSOLE}
var
 a1, a2: array of String;
begin
 SetLength(a1, 3);
 a1[0] := "000";
 a1[1] := "111";
 a1[2] := "222";
 SetLength(a2, 3);
 move(a1, a2, 12);
 WriteLn(a1[1]); // 111
 WriteLn(a2[1]); // 111
 a1[1][2] := "x";
 WriteLn(a1[1]); // 1x1
 WriteLn(a2[1]); // 1x1
end.


 
ZENsan ©   (2008-06-02 18:12) [7]

type
TTree = record
  Title : String;
  ID    : Integer;
end;

 TTreeArray = array of TTree;
var
Tab1, Tab2 : TTreeArray;

begin
SetLength(Tab1, 498);
SetLength(Tab2, 498);

Tab1 := Tab2;
end;


 
ZENsan ©   (2008-06-02 18:13) [8]

Самые основы паскаля...


 
DiamondShark ©   (2008-06-02 18:20) [9]


> ZENsan ©   (02.06.08 18:13) [8]
> Самые основы паскаля...

Которых ты не выучил.


> palva ©   (02.06.08 18:06) [6]
>
> > то строки останутся живы.
>
> Живы, конечно. Но будут синхронно меняться, чего автор,
> по-видимому, не хотел.

Это не самое страшное.
Гораздо интереснее
a1[0] := "qweqwe";
a2[0] := "oiuoiu"; // здравствуй, инвалид поинтер оперэйшн


 
Palladin ©   (2008-06-02 18:24) [10]


>ZENsan ©

1. в паскале нет динамических массивов он тут нипричем
2. зачем тебе выделять и тут же освобождать память?
3. это копирование ссылки на массив, а не данных массива

оба, описанных тобою, идентификатора являются ссылками. со всеми вытекающими отсюда последствиями


 
ZENsan ©   (2008-06-02 18:28) [11]

type
 TTree = record
   Title: string;
   ID: Integer;
 end;

 TTreeArray = array of TTree;
var
 Tab1, Tab2: TTreeArray;

begin
 SetLength(Tab1, 498);
 SetLength(Tab2, 498);

 Tab1[0].Title := "asdasdasd";
 Tab2 := Copy(Tab1, 0);
 Tab2[0].Title := "sdfsdfsdf";

 WriteLn(Tab1[0].Title, " ", Tab2[0].Title);
 ReadLn;
end.

да да попутался.. это же динамические..
Так чё тут умничать - просто Copy i всё..


 
ZENsan ©   (2008-06-02 18:30) [12]

И ыто я вообще-то скопировал исходник от автора...насчёт 3 пункта..


 
Sapersky   (2008-06-02 19:31) [13]

Если Copy, то SetLength(Tab2, 498) не нужен.


 
zensan ©   (2008-06-02 19:36) [14]

Это к автору.



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

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

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1212269187
Randew
2008-06-01 01:26
2008.06.29
Помогите найти ошибку, пожалуйста...


2-1212313498
alex-drob
2008-06-01 13:44
2008.06.29
Как обьеденить две области памяти


2-1212150966
Mozgan
2008-05-30 16:36
2008.06.29
Memo и SMTP


15-1210977956
Draw
2008-05-17 02:45
2008.06.29
Чем заменить Canvas.CopyRect ?


3-1200914554
Mike Kouzmine
2008-01-21 14:22
2008.06.29
"Внебрачные отношения."