Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.187.103] |
|
Сообщ.
#1
,
|
|
|
Итак, у меня есть запись:
type TSome = record X: array of String; Y: Integer end Я хочу объявить переменную и сразу задать значения: var Some: TSome = (X: ['A', 'B']; Y: 10); Как задать это значение? Далее, я создаю процедуру: procedure DoIt(X: array of String; Y: Integer); begin Some.X := X; Some.Y := Y end; Вообще бред какой-то, оба ж массива одинаковые! Зато я могу спокойно сделать вызов DoIt(['A', 'B'], 10) Если я обзову array of String, например TArray: type TArray = array of String; Присвоение значений переменной TSome тоже не удастся. Как же сделать, чтобы всё это работало и было совместимо друг с другом??? Добавлено И как присвоить такой записи (Some) начальное значение? |
Сообщ.
#2
,
|
|
|
Цитата Jin X @ Как задать это значение? никак Цитата Jin X @ И тут снова ошибка... Error: Incompatible types: 'Array' and 'dynamic array' Вообще бред какой-то, оба ж массива одинаковые! нет, хоть синтаксис и похож, это не dynamic array, а open array в аргумент X можно передавать массивы любых типов (static/dynamic) а вот обратно только циклом(или воспользоваться Move, но не в твоём случае) Цитата Jin X @ то Some.X := X; внутри процедуры будет работать нормально, а вот это уже не сработает: DoIt(['A', 'B'], 10)... Error: Ordinal type required. в ХЕ7 это работает... попробуй так : DoIt(TArray.Create('A','B'),10); |
Сообщ.
#3
,
|
|
|
Цитата Shaggy @ Откуда это? TArray Добавлено Цитата Shaggy @ Copy Move |
Сообщ.
#4
,
|
|
|
В новых ХЕ добавляли string-like операции над массивами типа сложения, возможно, теперь и динамические массивы можно задавать.
|
Сообщ.
#5
,
|
|
|
Судя по docwiki в XE8 добавили возможность инициализации динамических массивов константным выражением (array constant expression) наподобие конструктора открытого массива. Но похоже это относится только к инициализации переменных в рантайме, а не к объявлению типизированные констант и инициализированных переменных.
По крайней мере в описании внутренних форматов данных подробно рассказывается о константных строках с особым значением reference count = -1, а в отношении динамических массивов на этот счет - ни гу-гу. Похоже как не было для динамических массивов проверки RefCnt на отрицательные значения, так и нет. PS: С другой стороны динамический массив можно инициализировать указателем, поэтому если очень хочется объявить инициализированную переменную, то можно использовать извращенный трик с указателем на статический массив var _XValues: packed record h: TDynArrayRec; m: array[0..1] of string end = (h: (RefCnt:100; Length:2); m: ('A', 'B')); X: array of string = @_XValues.m; Это работает, при условии, что RefCnt выбирается > 1 (точнее > числа дин.массивов, которые на него изначально ссылаются) или большим отрицательным, чтобы никакие возможные присваивания массива по ссылке не привели к обнулению счетчика. |