Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизРеализация в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.076 c