Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с динамическими массивами! 
:(
    Опции темы
Grol
Дата 24.5.2005, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 5.5.2005
Где: Россия

Репутация: нет
Всего: нет



Еще раз здравствуйте мастера!!! Сегодня я уже второй раз пишу в форум!!! У меня такой вопрос: у меня есть два динамических массива, первый из них уже забит числами, если я преравняю второй массив к первому, то эти два массива приравняются. Если же я попытаю изменять числа во втором массиве, то числа будут изменяться и в первом массиве!!! Как это избежать? То есть мне надо приравнять два массива, которые динамически созданные, и чтоб при изменении чисел в одном массиве в другом они не изменялись. Я конечно же мог это сделать через цикл, но если элементов в массивах будут под 100000, то будет тормоза с компом. Мастера, асы в этом деле помогите ламаку!!!
Код

var 
     i:integer;
     KTIt,KTI:array of Integer;
begin
 Setlength(KTI,10);
//заполняю масив числами
 For i:=Low(KTI) To High(KTI) do
       KTI[i]:=i;
//хочу преравнять один масив к другому делаю так
KTIt:=KTI;
//После два этих массива будут одинаковы
...
KTI:=nil;
KTIt:=nil;
end;


Это сообщение отредактировал(а) Alex - 24.5.2005, 00:45
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Rrader
  Дата 24.5.2005, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Код

Var    
  I: Integer;    
  KTIt: Array Of Integer;
  KTI: Array Of Integer;    
Begin    
  SetLength(KTI, 10);
  SetLength(KTIt, 10);    

  For I := Low(KTI) To High(KTI) Do    
     KTI[I] := I;    

  For I := Low(KTIt) To High(KTIt) Do    
     KTIt[I] := KTI[I];

  KTI := NIL;    
  KTIt := NIL;    
End;

Delphi под рукой у меня нет. Проверь! smile
Если встретилось вот такое объявление:
Код

  KTIt: Array Of Integer;
  KTI: Array Of Integer;   

то массивы будут разными, и присваивание будет запрещено. smile

Это сообщение отредактировал(а) Rrader - 24.5.2005, 01:02


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
ДЫМ
Дата 24.5.2005, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Код

type ArrayOfInteger:Array of Integer;
Var    
  I: Integer;    
  KTIt, KTI: ArrayOfInteger;    

begin
  Setlength(KTI,10);
 //заполняю масив числами
 For i:=Low(KTI) To High(KTI) do
       KTI[i]:=i;
 Setlength(KTIt,Length(KTI));

 KTIt:=KTI;
end;

PM MAIL WWW   Вверх
<Spawn>
Дата 24.5.2005, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



ДЫМ После присвоение динамических массиов они будут ссылаться на одни данные, а нужно получить копию исходного массива.


Grol

Можешь так скопировать(но не думай что при этом все без циклов работает smile )

Код

uses ..., Math;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: array of integer;
  MinLen: integer;
begin
  SetLength(a, 2);
  SetLength(b, 3);
  a[0] := 10;
  a[1] := 20;
  MinLen := IfThen((Length(a) < Length(b)), Length(a), Length(b));
  CopyMemory(@b[0], @a[0], MinLen * SizeOf(Integer));
  a[0] := 15;
  ShowMessage(IntToStr(b[0]));
end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Alix
Дата 24.5.2005, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



<Spawn>
Уверены, что элементы дин. массивов располагаются в памяти последовательно?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
<Spawn>
Дата 24.5.2005, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Alix Думаю, что последоваетльно, учитывая, что рельно вызывается функция из модуля System под названием DynArraySetLength, которая использует в своей работе GetMem и ReallocMem, а они выделяют неразрывные блоки памяти.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Snowy
Дата 24.5.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Grol @ 24.5.2005, 00:32)
Если же я попытаю изменять числа во втором массиве, то числа будут изменяться и в первом массиве!!!

Это потому, что ты приравниваешь не сами массивы, а их указатели.
Поэтому по сути два разных массива рулят одной и той же областью памяти.

Цитата(Alix @ 24.5.2005, 06:29)
Уверены, что элементы дин. массивов располагаются в памяти последовательно?

Агу. А, если в памяти не будет целого фрагмента, способного вместить запрашиваемый объем, то массив не получит запрашиваемого размера.

Сдается мне, что можно сделать все проще:
не так:
Код

 KTIt:=KTI;
А так:
Код

  Setlength(KTI,10);
  move(KTI[0], KTIt[0], 10);

PM MAIL   Вверх
Петрович
Дата 25.5.2005, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



А хелп читать не пробовали? smile
Цитата
In contrast, to make an independent copy of a dynamic array, you must use the global Copy function:

Код

var
  A, B: array of Integer;
begin
  SetLength(A, 1);
  A[0] := 1;
  B := Copy(A);
  B[0] := 2; { B[0] <> A[0] }
end;




--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.