Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.07 c
6-1251381307
Student85236
2009-08-27 17:55
2013.03.22
Уважвемые коллеги! как сделать чтоб не ждать ответа от get запрос


2-1338069326
novichek
2012-05-27 01:55
2013.03.22
DSPack SampleGrabber


15-1334294284
vajo
2012-04-13 09:18
2013.03.22
Маркировка HDD Seagate.


15-1340089952
Омлет
2012-06-19 11:12
2013.03.22
Почему FreeAndNil такой, какой он есть?


15-1340635894
AlexDn
2012-06-25 18:51
2013.03.22
Где взять доменное имя?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский