Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Не работает метод с параметром в виде переменной при вызове извне   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
2-1189435060
qaPavel
2007-09-10 18:37
2007.10.07
MessageBox +отрисовка


15-1189085540
delphiForever
2007-09-06 17:32
2007.10.07
вполне серьезно


2-1189184453
Dr. Andrew
2007-09-07 21:00
2007.10.07
как извлечь корень n-ной степени в Делфи!


15-1189402825
ZeroDivide
2007-09-10 09:40
2007.10.07
Как наиболее надежным образом пополнить webmoney кошелек?


15-1188973346
de.
2007-09-05 10:22
2007.10.07
Город мастеров (Полу сабж, полу вопрос... :)