Текущий архив: 2003.09.22;
Скачать: CL | DM;
ВнизVarArrayCreate - массив массивов? Найти похожие ветки
← →
oomneeq (2003-09-10 16:27) [0]Доброго дня-вечера-ночи
Почему не получается создать массив массивов?
Т.е оно получается, но обратиться правильно к элементу
не выходит :-(
Вот для понятности код
procedure TForm1.VarTest;
var ATest,
VVV, V1, V2: variant;
bo : boolean;
i : integer;
begin
// два массивчика
V1 := VarArrayCreate([0, 2], varVariant);
V2 := VarArrayCreate([0, 2], varVariant);
// наполняем значениями
V1[0] := 0;
V2[0] := "Value 0";
V1[1] := 1;
V2[1] := "Value 1";
V1[2] := 2;
V2[2] := "Value 2";
// а вот этот массивчик должен будет содержать два предыдущих как элементы, вроде как тип varVariant это позволяет
VVV := VarArrayCreate([0,1], varVariant);
// вот присваиваю этому метамассивчику каждый элемент, в свою очередь-массив
VVV[0]:=V1;
VVV[1]:=V2;
//проверяю, а девствительно ли элемент-массив?
bo:=VarIsArray(VVV[0]);
//да, действительно, bo=true
//проверим размерчик
i:=VarArrayHighBound(VVV[0], 1);
// все правильно, i=2
//тогда V1[i] должно означать тоже самое что VVV[0][i] ???
//проверим
ATest:=V1[0];
//оч хорошо, Atest=0, как и задавали
//теперь обратимся к тому же элементу через метамассив, должно же быть тоже самое
ATest:=VVV[0][0];
//А вот и нет! Atest=Unassigned
//ПАЧИМУУУУУ?????
end;
Помогите разобраться, плиз.
← →
Юрий Федоров (2003-09-10 16:33) [1]Тоже замечал это. Ну что тут можно сказать : не обращайся "через метамассив", а обращайся через промежуточные переменные...
← →
[lamer]Barmaglot (2003-09-10 16:40) [2]??
procedure TForm1.Button1Click(Sender: TObject);
type
Ta = Array of Variant;
var
b: Array[0..2] of Ta;
begin
Setlength(b[1], 10);
b[1,7]:="a";
end;
← →
Nikolay M. (2003-09-10 16:48) [3]Потому что компилятор оптимизирует ATest и VV - они в этом куске кода больше не используются. Попробуй на последней строке посмотреть значение не Atest, а VV[0][0].
← →
oomneeq (2003-09-10 17:35) [4]>Nikolay M. © (10.09.03 16:48) [3]
оптимизатор выключен.
Но вот что обнаружилось.
дописываю последней строчкой процедуры
Caption:=Vartostr(ATest);
и ATest получает значение!
повторяю-оптимизатор ВЫКЛЮЧЕН
проверьте, кому есть охота на своих машинах,
код рабочий
А попробуйте пожалуйста у себя, код гото
← →
Е-Моё имя (2003-09-10 17:36) [5]вот так вот... за правду убили...
← →
Nikolay M. (2003-09-10 17:43) [6]Это галкой Optimization не выключается.
То, что ты добавляешь строку, где используется переменная и это работает, говорит о том, что я прав.
Попробуй такой код:
var
t : integer;
begin
t := 1;
ShowMessage ("");
end;
и попытайся посмотреть значение t на строке с ShowMessage.
← →
Nikolay M. (2003-09-10 17:45) [7]
> Но вот что обнаружилось.
>
> дописываю последней строчкой процедуры
> Caption:=Vartostr(ATest);
> и ATest получает значение!
ПС
Мистика, не иначе! :))))
← →
oomneeq (2003-09-10 20:18) [8]2Nikolay M.
Ты в чем-то прав, но оптимизация выключена.
Мне жаль что у тебя она "не выключается галкой"
Ты всетаки попробуй мой код, делов на полминуты.
Думаю, что дело в особом обхождении Дельфи с вариантными (динамическими)массивами.
Если пройтись отладчиком пошагово - F7
по оператору
ATest:=VVV[0][0];
(eсли сразу за ним стоит процедурный end, безо всяких там Caption:=Vartostr(ATest);
)
то путь лежит через
_FinalizeArray и _VarClear();
где и происходит очищение переменной еще до момента присваивания.
← →
Nikolay M. (2003-09-10 21:54) [9]
> Ты в чем-то прав, но оптимизация выключена
Могу только отослать к умным книжкам по компиляторам...
Имхо в данном случае нельзя быть в чем-то правым, так же, как нельзя быть чуть-чуть беременной.
> Если пройтись отладчиком пошагово - F7
> по оператору
> ATest:=VVV[0][0];
> (eсли сразу за ним стоит процедурный end, безо всяких там
> Caption:=Vartostr(ATest);
> )
Что говорит о чем? О том, что компилятор не дурак, понимает, что далее в тексте эта переменная нигде не используется и "очищает" ее.
ПС.
Я задолбался доказывать, что белое - это белое, а черное - это черное. Больше я в эту ветку не писец.
← →
oomneeq (2003-09-11 11:10) [10]2Nikolay M. ©
>Я задолбался доказывать ...
Я искрене сожалею о твоей задолбанности,
Думаю если бы ты попробовал бы код, ты был бы свежее.
Твоя уверенность в своей правоте - очень ценное качество.
Описаная проблема не относится к оптимизатру.
Страницы: 1 вся ветка
Текущий архив: 2003.09.22;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c