![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает метод с параметром в виде переменной при вызове извне [D7, WinXP]
nejest © (2007-07-23 13:24:00)У меня в программе есть 2 класса:
назовём первый к примеру foo
в котором есть метод для чтения элементов массива реализованного в данном
function foo.GetWorkData(var GetFirst: boolean):double;
begin
if(GetFirst=true)then
begin
{perehod k pervomu elementu}
result:=WorkData[0];
ReadCount:=0;
GetFirst:=false;
end
else
begin
{perehod k sleduushemu elementu}
ReadCount:=ReadCount+1;
if(ReadCount<count)then
result:=WorkData[ReadCount]
else
begin
result:=0;
GetFirst:=true;
end;
end;
end;
во втором классе, назовём его bar
создаётся массив из 2 эллементов типа foo, затем заполняются массивы, которые находятся в
в экземплярах foo, которые создаются в экземпляре класса bar. После этого я пытаюсь получить к этим эллементам доступ примерно следующим образом:
var
boolUniversal1,boolUniversal2: boolean;
//skiped
tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
tmp2:=DoubleRowTable[1].GetWorkData(boolUniversal2);
При первом вызове метод как и положенно выдаёт значение, но при следующем вызове выдаёт ноль.
P.S. Упреждая ваши предположения о том, что массив неправильно заполнен, я сообщаю, что методы, которые находятся в классе foo получают корректные значения эллементов массиваи соответственно нормально работают.
nejest (2007-07-24 11:46:00) [1]
> > until(NOT(boolUniversal=false))
> жжошь!
fixedсделано в момент сильной усталости, поэтому и не упрощенно выражение. Вообще заметил я это давно, но как-то не доходили руки, собирался сделать при финальной подчистке кода.
SpellCaster (2007-07-24 10:37:00) [2]> until(NOT(boolUniversal=false))
жжошь!
nejest (2007-07-24 10:12:00) [3]Посидел за отладчиком и нашёл таки источник ошибки:
в методе класса bar, после первого вызова GetWorkData происходит обращение к одному из свойств( и что немаловажно это свойство не было вычисленно на момент обращения к нему) класса fooиз-за того, что это свойство не вычисленно, происходит вычисление его в процессе которого используется в цикле метод GetWorkData. Из-за этого к моменту второго вызова из метода класса bar метода GetWorkData переменная ReadCount равна сount и поэтому я и получаю вместо второго значения 0.
Тема закрыта.
nejest (2007-07-23 19:05:00) [4]
> Так а какой вообще резон городить целый класс foo ради метода,
> работающего с массивом данных, который к тому же формируется
> другим (bar) классом ?
Кстати формируется этот массив не путём непосредственного доступа к нему, а через специальный метод-сеттер, который при добавлении элемента проверяет, хватает ли места в массиве, если хватает, то записывает значение в следующую ячейку и увеличивает значение count, если не хватает, то сначала увеличивает размер массива, а потом уже записывает значение в следующую ячейку и увеличивает значение count.
nejest (2007-07-23 15:20:00) [5]
> > Так по сути у меня GetFirstWorkData и GetNextWorkData
> в
> > одном флаконе
>
>
> Так а какой вообще резон городить целый класс foo ради метода,
> работающего с массивом данных, который к тому же формируется
> другим (bar) классом ?
В классе fooреализованны функции, которые можно вычислять имея только 1 столбец данных( всякие средние значения, дисперсии, среднеквадратичные отклонения). Собственно данные при желании можно формировать откуда угодно, а не обязательно из класса bar
> imho, гораздо логичней отдать работу с массивом полностью
> на откуп классу foo.
А вот в классе barреализованны те, операции, которые нужно проводить с 2 наборами данных, например сейчас я реализую вычисление коэффициента парной корреляции( пока правда из-за того, что не могу получить правильные данные не работает вычисление), позже будет ещё производится вычисление характеристик регрессионных зависимостей.
Сергей М. (2007-07-23 15:00:00) [6]
> Так по сути у меня GetFirstWorkData и GetNextWorkData в
> одном флаконе
Так а какой вообще резон городить целый класс fooради метода, работающего с массивом данных, который к тому же формируется другим (bar) классом ?
imho, гораздо логичней отдать работу с массивом полностью на откуп классу foo.
nejest (2007-07-23 14:51:00) [7]
> Почему не сделать по образу и подобию FindXXXFirst/Next
> ?
>
> function TFoo.GetFirstWorkData(out data: Double): Boolean;
>
> function TFoo.GetNextWorkData(out data: Double): Boolean;
>
>
> ..
>
> with SomeFoo do
> if GetFirstWorkData(tmpData) then begin
> ..
> while GetNextWorkData(tmpData) do begin
> ..
> end;
> end;
Так по сути у меня GetFirstWorkData и GetNextWorkData в одном флаконе. Я сомневаюсь, что что-то изменится от такой переделки.
Сергей М. (2007-07-23 14:38:00) [8]
> nejest (23.07.07 13:52) [7]
>
>
> > непонятно к чему GetFirst:=true;
>
> Это для того, чтобы передать наружу информацию о том, что
> массив закончился
Почему не сделать по образу и подобию FindXXXFirst/Next ?
function TFoo.GetFirstWorkData(out data: Double): Boolean;
function TFoo.GetNextWorkData(out data: Double): Boolean;
..
with SomeFoo do
if GetFirstWorkData(tmpData) then begin
..
while GetNextWorkData(tmpData) do begin
..
end;
end;
nejest (2007-07-23 14:30:00) [9]
> > nejest (23.07.07 13:55) [8]
>
>
> Не понял ...
>
>
> > tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
>
>
> Эта строчка вызывается в контексте метода какого класса
> ?
В методе класса bar
nejest (2007-07-23 14:28:00) [10]
> А count у тебя правильно заполняется?
Ну судя по тому, что методы, находящиеся в классе fooвполне нормально вычисляют различные вещи, включая среднее значение элементов, или например дисперсию то наверное правильно( но специально не проверял).
Сергей М. (2007-07-23 14:19:00) [11]
> nejest (23.07.07 13:55) [8]
Не понял ...
> tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
Эта строчка вызывается в контексте метода какогокласса ?
Stanislav (2007-07-23 14:11:00) [12]А count у тебя правильно заполняется?
nejest (2007-07-23 13:55:00) [13]
> > boolUniversal1,boolUniversal2
>
>
> Это что, локальные переменные ?
Да это локальные переменные в одном из методов bar, но
tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
tmp2:=DoubleRowTable[1].GetWorkData(boolUniversal2);
происходит в пределах одного вызова функции в цикле похожем на цикл указанный выше.
nejest (2007-07-23 13:52:00) [14]
> непонятно к чему GetFirst:=true;
Это для того, чтобы передать наружу информацию о том, что массив закончился используется это примерно следующим образом:
repeat
tmp:=GetWorkData(boolUniversal);
if(boolUniversal=false)
res:=res+tmp;
until(NOT(boolUniversal=false))
nejest (2007-07-23 13:43:00) [15]
> отладчик сломался?
Я просто думал, что есть какая-то особенность модели вызовов методов в Delphi из-за которой идёт некорректная работа с переменными boolUniversal1, boolUniversal2.
Stanislav (2007-07-23 13:37:00) [16]т.е. result:=GetWorkData(GetFirst) ;
Stanislav (2007-07-23 13:36:00) [17]если за ним вызвать твою процедуру, тогда понятно
function foo.GetWorkData(var GetFirst: boolean):double;
begin
if(GetFirst=true)then
begin
{perehod k pervomu elementu}
result:=WorkData[0];
ReadCount:=0;
GetFirst:=false;
end
else
begin
{perehod k sleduushemu elementu}
ReadCount:=ReadCount+1;
if(ReadCount<count)then
result:=WorkData[ReadCount]
else
begin
result:=0;
GetFirst:=true;
GetWorkData(GetFirst)
end;
end;
end;
Stanislav (2007-07-23 13:35:00) [18]непонятно к чему GetFirst:=true;
Сергей М. (2007-07-23 13:31:00) [19]
> boolUniversal1,boolUniversal2
Это что, локальныепеременные ?
Вася Правильный (2007-07-23 13:30:00) [20]отладчик сломался?