Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
14-71889
Карлсон
2003-09-03 18:06
2003.09.22
книга про Windows для ну совсем чайников.


6-71780
han
2003-07-24 15:01
2003.09.22
настройки интернета


3-71491
peter_login
2003-09-01 14:36
2003.09.22
Компонет для работы с полем БД типа tdatetime


14-71847
Прохожий
2003-08-25 11:03
2003.09.22
Сколько потоков ??


14-71841
wl
2003-09-01 16:01
2003.09.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский