Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.016 c
3-71474
stud
2003-09-01 16:56
2003.09.22
в базе данных странные вещи!


14-71878
Пубертанец
2003-09-04 11:33
2003.09.22
Есть ли польза от очков для компьютеров?


1-71645
SH
2003-09-08 14:20
2003.09.22
Подсветка синтаксиса


14-71901
Dimka Maslov
2003-09-03 11:43
2003.09.22
Простуда


3-71499
Russko
2003-09-01 09:38
2003.09.22
На конце 0