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

Вниз

Реализация в Delphi массива array[0..10] of array of ...   Найти похожие ветки 

 
KSergey ©   (2012-09-18 14:07) [0]

Вопрос по внутренней организации (реализации) массива, объявленного как

array[0..10] of array of TMyData;

Т.е. первая граница имеет фиксированный диапазон, вторая - динамический массив.

Можно ли надеяться, что фактическая реализация будет вида

array[0..10] of Pointer;

где в Pointer будет храниться ссылка/указатель на соответствующие динамические массивы?

Что собственно беспокоит. Пусть есть такой код:

var
 v: array[0..10] of array of TMyData;
begin
 SetLength(v[0], 10);
 SetLength(v[1], 10); (1)

... теперь изменяем размер одного из массивов "второго" измерения ..

 SetLength(v[0], 20);  // (2)


можно ли надеяться, что после операции (2) физическое расположение в памяти элементов массива, выделенных в (1), т.е. адресуемых через v[1][xx], останется неизменным?


 
KSergey ©   (2012-09-18 14:13) [1]

Вопрос вот от чего возник.
В программе к массиву

v: array[0..10] of array of TMyData;

одновременно организован доступ из разных потоков на чтение/запись.
При этом первый индекс - это номер потока (не важно как он формируется, но гарантируется, что каждый потом адресуется только к своему индексу v[номер_потока].
При этом из разных потоков в общем случае одновременно производятся операции типа

SetLength(v[номер_потока], 20);
SetLength(v[номер_потока], 30);
SetLength(v[номер_потока], 50);


и т.д.
Соответственно хочется быть уверенным, что при этих операциях точно реаллоцируется только фактически отдельно расположенный одномерный массив, индексируемый вторым индексом в исходном многомерном массиве, а исходный массив v[] с фиксированным расположением границ остается неизменным. В моем понимании так и должно быть, но вдруг я чего-то не углядываю?


 
AV ©   (2012-09-18 14:53) [2]

Можно посмотреть
SetLength(v[ -> 00599B4B E868C6E6FF       call @DynArraySetLength

system.pas
procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: Longint; lengthVec: PLongint);


 
MBo ©   (2012-09-18 15:05) [3]

Да, массив указателей будет неизменным


 
KSergey ©   (2012-09-18 17:57) [4]

Спасибо, други!


 
Дмитрий С ©   (2012-09-20 02:12) [5]

т.е. дин массив это указатель на указатель чтоли?


 
Германн ©   (2012-09-20 02:18) [6]


> Дмитрий С ©   (20.09.12 02:12) [5]
>
> т.е. дин массив это указатель на указатель чтоли?

дин массив это дин массив.
Надо только понимать что компилятор подразумевает под именем массива, именем его эелемента и т.п. и т.д.


 
Anatoly Podgoretsky ©   (2012-09-20 06:29) [7]

> Дмитрий С  (20.09.2012 02:12:05)  [5]

Динамический массив array of element, это указатель на элемент
Динамический массив array of array of element, это указатель на на
динамический массив, который указатель на элемент – то есть указатель на
указатель


 
Дмитрий С ©   (2012-09-20 10:26) [8]


> Динамический массив array of element, это указатель на элемент

а при SetLength() указатель меняет свое значение?


 
Плохиш ©   (2012-09-20 11:21) [9]


> Дмитрий С ©   (20.09.12 10:26) [8]
>
> > Динамический массив array of element, это указатель на
> элемент
>
> а при SetLength() указатель меняет свое значение?

На динамический массив - да.
На статический массив - нет.

Вопрос ещё раз внимательней прочитай, что интересует ТС.


 
Дмитрий С ©   (2012-09-20 11:24) [10]


> Плохиш ©   (20.09.12 11:21) [9]


А все понял! Спасибо. Мир, слава богу, не перевернулся :)


 
Anatoly Podgoretsky ©   (2012-09-20 11:37) [11]

> Дмитрий С  (20.09.2012 10:26:08)  [8]

Может изменить, если будет в новом месте.


 
QAZ2   (2012-09-20 12:41) [12]

и нахрена весь этот прон?

threadvar v: array of TMyData;

и каждому потоку своя v



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

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

Наверх




Память: 0.5 MB
Время: 0.078 c
4-1259019636
SPeller
2009-11-24 02:40
2013.03.22
Внедрение кода в другой поток. Замечания, дополнения, критика


2-1332909299
Pcrepair
2012-03-28 08:34
2013.03.22
Способ управления сложным проектом


15-1344112205
Юрий
2012-08-05 00:30
2013.03.22
С днем рождения ! 5 августа 2012 воскресенье


15-1333286141
Новичок
2012-04-01 17:15
2013.03.22
Какой пакер лучше?


1-1301494021
Циркуль
2011-03-30 18:07
2013.03.22
Модальное окно прячется под немодальным