Главная страница
    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.47 MB
Время: 0.009 c
1-71586
saNat
2003-09-10 02:10
2003.09.22
MainMenu


7-71987
Poirot
2003-07-08 12:33
2003.09.22
Load/Free DLL


1-71617
Pavel Oliynik
2003-09-11 15:41
2003.09.22
как загрузить строку ресурса ? дайте плз. рабочий пример


1-71613
Алексей Петухов
2003-09-09 14:44
2003.09.22
Как определить конец таблицы в MSWord?


3-71493
yurez
2003-09-01 15:43
2003.09.22
translate error. value out of bounds - не могу забороть.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский