Форум: "Основная";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизНе работает метод с параметром в виде переменной при вызове извне Найти похожие ветки
← →
nejest (2007-07-23 13:24) [0]У меня в программе есть 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 получают корректные значения эллементов массива и соответственно нормально работают.
← →
Вася Правильный (2007-07-23 13:30) [1]отладчик сломался?
← →
Сергей М. © (2007-07-23 13:31) [2]
> boolUniversal1,boolUniversal2
Это что, локальные переменные ?
← →
Stanislav © (2007-07-23 13:35) [3]непонятно к чему GetFirst:=true;
← →
Stanislav © (2007-07-23 13:36) [4]если за ним вызвать твою процедуру, тогда понятно
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:37) [5]т.е. result:=GetWorkData(GetFirst) ;
← →
nejest (2007-07-23 13:43) [6]
> отладчик сломался?
Я просто думал, что есть какая-то особенность модели вызовов методов в Delphi из-за которой идёт некорректная работа с переменными boolUniversal1, boolUniversal2.
← →
nejest (2007-07-23 13:52) [7]
> непонятно к чему GetFirst:=true;
Это для того, чтобы передать наружу информацию о том, что массив закончился используется это примерно следующим образом:repeat
tmp:=GetWorkData(boolUniversal);
if(boolUniversal=false)
res:=res+tmp;
until(NOT(boolUniversal=false))
← →
nejest (2007-07-23 13:55) [8]
> > boolUniversal1,boolUniversal2
>
>
> Это что, локальные переменные ?
Да это локальные переменные в одном из методов bar, но
tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
tmp2:=DoubleRowTable[1].GetWorkData(boolUniversal2);
происходит в пределах одного вызова функции в цикле похожем на цикл указанный выше.
← →
Stanislav © (2007-07-23 14:11) [9]А count у тебя правильно заполняется?
← →
Сергей М. © (2007-07-23 14:19) [10]
> nejest (23.07.07 13:55) [8]
Не понял ...
> tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
Эта строчка вызывается в контексте метода какого класса ?
← →
nejest (2007-07-23 14:28) [11]
> А count у тебя правильно заполняется?
Ну судя по тому, что методы, находящиеся в классе foo вполне нормально вычисляют различные вещи, включая среднее значение элементов, или например дисперсию то наверное правильно( но специально не проверял).
← →
nejest (2007-07-23 14:30) [12]
> > nejest (23.07.07 13:55) [8]
>
>
> Не понял ...
>
>
> > tmp1:=DoubleRowTable[0].GetWorkData(boolUniversal1);
>
>
> Эта строчка вызывается в контексте метода какого класса
> ?
В методе класса bar
← →
Сергей М. © (2007-07-23 14:38) [13]
> 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:51) [14]
> Почему не сделать по образу и подобию 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 15:00) [15]
> Так по сути у меня GetFirstWorkData и GetNextWorkData в
> одном флаконе
Так а какой вообще резон городить целый класс foo ради метода, работающего с массивом данных, который к тому же формируется другим (bar) классом ?
imho, гораздо логичней отдать работу с массивом полностью на откуп классу foo.
← →
nejest (2007-07-23 15:20) [16]
> > Так по сути у меня GetFirstWorkData и GetNextWorkData
> в
> > одном флаконе
>
>
> Так а какой вообще резон городить целый класс foo ради метода,
> работающего с массивом данных, который к тому же формируется
> другим (bar) классом ?
В классе foo реализованны функции, которые можно вычислять имея только 1 столбец данных( всякие средние значения, дисперсии, среднеквадратичные отклонения). Собственно данные при желании можно формировать откуда угодно, а не обязательно из класса bar
> imho, гораздо логичней отдать работу с массивом полностью
> на откуп классу foo.
А вот в классе bar реализованны те, операции, которые нужно проводить с 2 наборами данных, например сейчас я реализую вычисление коэффициента парной корреляции( пока правда из-за того, что не могу получить правильные данные не работает вычисление), позже будет ещё производится вычисление характеристик регрессионных зависимостей.
← →
nejest (2007-07-23 19:05) [17]
> Так а какой вообще резон городить целый класс foo ради метода,
> работающего с массивом данных, который к тому же формируется
> другим (bar) классом ?
Кстати формируется этот массив не путём непосредственного доступа к нему, а через специальный метод-сеттер, который при добавлении элемента проверяет, хватает ли места в массиве, если хватает, то записывает значение в следующую ячейку и увеличивает значение count, если не хватает, то сначала увеличивает размер массива, а потом уже записывает значение в следующую ячейку и увеличивает значение count.
← →
nejest (2007-07-24 10:12) [18]Посидел за отладчиком и нашёл таки источник ошибки:
в методе класса bar , после первого вызова GetWorkData происходит обращение к одному из свойств( и что немаловажно это свойство не было вычисленно на момент обращения к нему) класса foo из-за того, что это свойство не вычисленно, происходит вычисление его в процессе которого используется в цикле метод GetWorkData. Из-за этого к моменту второго вызова из метода класса bar метода GetWorkData переменная ReadCount равна сount и поэтому я и получаю вместо второго значения 0.
Тема закрыта.
← →
SpellCaster (2007-07-24 10:37) [19]> until(NOT(boolUniversal=false))
жжошь!
← →
nejest (2007-07-24 11:46) [20]
> > until(NOT(boolUniversal=false))
> жжошь!
fixed сделано в момент сильной усталости, поэтому и не упрощенно выражение. Вообще заметил я это давно, но как-то не доходили руки, собирался сделать при финальной подчистке кода.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.048 c