Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
15-1189166684
Kerk
2007-09-07 16:04
2007.10.07
Какнить можно в винде кэш DNS сбросить?


3-1180927711
merko
2007-06-04 07:28
2007.10.07
Подключение к удаленной БД


15-1189356433
Beastie Boys
2007-09-09 20:47
2007.10.07
про выделенный сервер


2-1189510675
FreeTT
2007-09-11 15:37
2007.10.07
Как получить всех родителей в TreeView


6-1170928218
tytus
2007-02-08 12:50
2007.10.07
TWebBrowser и Java.





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