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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хронение массива в памяти 
V
    Опции темы
Ak47black
  Дата 22.12.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Привет всем.
Вообщем немогу понять как сохранить динамический массив в память (не переберая его).
Скорей всего я не доконца понял как храниться в памяти.
Вот как я себе представляю
В правильную сторону я вообще думаю?
user posted image
PM MAIL   Вверх
GuManOiD
Дата 22.12.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Только не
Код

for i := 0 to Length(Struct.A2) do

а
Код

for i := 0 to Length(Struct.A2)-1 do


PM MAIL   Вверх
Snowy
Дата 22.12.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



4 байта - A1
4 байта указатель на массив
4 байта длина A3
4 байта - указатель на A3

Не перебирая не получится - указатели smile
PM MAIL   Вверх
GuManOiD
Дата 22.12.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И почему в строке
Код

Struct.A2[i] := i;


У тебя A2 - массив строк, а присваиваешь его элементу тип Integer

Добавлено @ 19:47 
Чето я туплю...
PM MAIL   Вверх
Ak47black
Дата 22.12.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Цитата

У тебя A2 - массив строк, а присваиваешь его элементу тип Integer

Да тут у меня ошибочка вышла.
Цитата

4 байта указатель на массив

Хмм... 
Тоесть тут как-бы сам массив должен хрониться совсем отдельно.
Ну ситуация прояснилась.
А как элементы массива храняться по адресу указателя , один за другим?
PM MAIL   Вверх
bems
Дата 22.12.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Ak47black @  22.12.2006,  20:24 Найти цитируемый пост)
один за другим? 
да



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ak47black
Дата 22.12.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



И еше как программа определяет какое количество элементов есть в массиве?
PM MAIL   Вверх
MetalFan
Дата 22.12.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(GuManOiD @  22.12.2006,  19:44 Найти цитируемый пост)
for i := 0 to Length(Struct.A2)-1 do


Код

for i := 0 to high(Struct.A2) do

;)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 22.12.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



У меня тут клавиатура новая неслушиеться сори.

Добавлено @ 23:35 
Вообшем где это количество элементов храниться в памяти?

Добавлено @ 23:36 
тоесть как программа узнает какое кочество элементов присуствует в массиве?
PM MAIL   Вверх
bems
Дата 22.12.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



для динамических массивов это 4 байта перед нулевым элементом

Добавлено @ 23:40 
для нединамических - length и high при компиляции заменяются константами

Добавлено @ 23:47 
Код

writeln(pCardinal(Cardinal(DynArrayVar)-4)^);
writeln(length(DynArrayVar));


Добавлено @ 23:50 
правда при нулевой длине переменная просто равна nil и сделать -4 байта не выйдет  smile 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 22.12.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Snowy @  22.12.2006,  19:45 Найти цитируемый пост)
4 байта длина A3
4 байта - указатель на A3


Snowy, SizeOf(stringVar)=4. Длина это 4 байта неперед указателем, перед точкой куда он указывает


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 23.12.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Код

program Project6;

{$APPTYPE CONSOLE}
uses windows;

var SourceArr,DestArr:array of DWORD;
begin
  SetLength(SourceArr,10);//ненулевая длина массива
  SourceArr[0]:=101010;//для проверки правильности :)

  GetMem(pointer(DestArr),length(SourceArr)*SizeOf(SourceArr[0])+4);
  CopyMemory(pointer(DestArr),pointer(DWORD(SourceArr)-4),length(SourceArr)*SizeOf(SourceArr[0])+4);
  inc(pDWORD(DestArr));
end.

Вот это копирует массив из SourceArr в DestArr. 
Но если как в твоем примере - array of string то будет скопирован массив указателей на строки, а счетчик ссылок строк не увеличится. Поэтому после удаления из памяти SourceArr (если строки больше нигде не используются) DestArr будет хранить невалидные указатели.

Лучше воспользоваться стандартной функцией copy, которая расчудесно копирует динамические массивы


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ak47black
Дата 23.12.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Спасибо bems+
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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