![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реализация в Delphi массива array[0..10] of array of ...
KSergey © (2012-09-18 14:07:00)Вопрос по внутренней организации (реализации) массива, объявленного как
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], останется неизменным?
QAZ2 (2012-09-20 12:41:00) [1]и нахрена весь этот прон?
threadvar v: array of TMyData;
и каждому потоку своя v
Anatoly Podgoretsky (2012-09-20 11:37:00) [2]> Дмитрий С (20.09.2012 10:26:08) [8]
Может изменить, если будет в новом месте.
Дмитрий С (2012-09-20 11:24:00) [3]
> Плохиш © (20.09.12 11:21) [9]
А все понял! Спасибо. Мир, слава богу, не перевернулся :)
Плохиш (2012-09-20 11:21:00) [4]
> Дмитрий С © (20.09.12 10:26) [8]
>
> > Динамический массив array of element, это указатель на
> элемент
>
> а при SetLength() указатель меняет свое значение?
На динамический массив - да.
На статический массив - нет.
Вопрос ещё раз внимательней прочитай, что интересует ТС.
Дмитрий С (2012-09-20 10:26:00) [5]
> Динамический массив array of element, это указатель на элемент
а при SetLength() указатель меняет свое значение?
Anatoly Podgoretsky (2012-09-20 06:29:00) [6]> Дмитрий С (20.09.2012 02:12:05) [5]
Динамический массив array of element, это указатель на элемент
Динамический массив array of array of element, это указатель на на
динамический массив, который указатель на элемент – то есть указатель на
указатель
Германн (2012-09-20 02:18:00) [7]
> Дмитрий С © (20.09.12 02:12) [5]
>
> т.е. дин массив это указатель на указатель чтоли?
дин массив это дин массив.
Надо только понимать что компилятор подразумевает под именем массива, именем его эелемента и т.п. и т.д.
Дмитрий С (2012-09-20 02:12:00) [8]т.е. дин массив это указатель на указатель чтоли?
KSergey (2012-09-18 17:57:00) [9]Спасибо, други!
MBo (2012-09-18 15:05:00) [10]Да, массив указателей будет неизменным
AV (2012-09-18 14:53:00) [11]Можно посмотреть
SetLength(v[ -> 00599B4B E868C6E6FF call @DynArraySetLength
system.pas
procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: Longint; lengthVec: PLongint);
KSergey (2012-09-18 14:13:00) [12]Вопрос вот от чего возник.
В программе к массиву
v: array[0..10] of array of TMyData;
одновременно организован доступ из разных потоков на чтение/запись.
При этом первый индекс - это номер потока (не важно как он формируется, но гарантируется, что каждый потом адресуется только к своему индексу v[номер_потока].
При этом из разных потоков в общем случае одновременно производятся операции типа
SetLength(v[номер_потока], 20);
SetLength(v[номер_потока], 30);
SetLength(v[номер_потока], 50);
и т.д.
Соответственно хочется быть уверенным, что при этих операциях точно реаллоцируется только фактически отдельно расположенный одномерный массив, индексируемый вторым индексом в исходном многомерном массиве, а исходный массив v[] с фиксированным расположением границ остается неизменным. В моем понимании так и должно быть, но вдруг я чего-то не углядываю?