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

Вниз

Глюки с вызовом процедуры по ссылке   Найти похожие ветки 

 
yantar92   (2009-11-02 13:29) [0]

Проблема в том, что при передаче ссылки на процедуру как параметр функции начинаются глюки с методами глобального класса.
Код:

...
type
Tpaint=procedure (const x:extended; const y:extended; var series:Tlineseries);
...
procedure paint(const x:extended; const y:extended; var series:Tlineseries);
begin
series.AddXY(x,y);
series.ParentChart.Parent.Repaint;
end;
...
function dc_A_st(... var paint:Tpaint;var series:Tlineseries ...):extended;
...
begin
...
paint(x,y,series);
...
end;

При исполнении процедуры paint выбивает "Ivalid pointer operation", а при дебаге пишет, что метод Repaint класса series.ParentChart.Parent - не определён, тогда как сам класс является определенным.


 
Демо ©   (2009-11-02 13:36) [1]


> yantar92   (02.11.09 13:29) 


1. Ты бы функции назвал отличными от методов класса хотя бы.
2. Ссылки на объекты и указатели передаются как var-параметры только в том случае, если ты собираешься менять их значение. Для того, чтобы изменять объекты, ссылки на них не нужно передавать как var-параметр.


 
Сергей М. ©   (2009-11-02 13:37) [2]


> var paint:Tpaint


Ну и зачем тут var ?


 
Leonid Troyanovsky ©   (2009-11-02 13:39) [3]


> yantar92   (02.11.09 13:29)

> Проблема в том, что при передаче ссылки на процедуру как
> параметр функции начинаются глюки с методами глобального
> класса.

Не надо извращений, давай ее закопаем.

--
Regards, LVT.


 
RWolf ©   (2009-11-02 13:43) [4]

чему равно фактическое значение параметра paint, передаваемое в функцию dc_A_st?


 
RWolf ©   (2009-11-02 13:45) [5]

и да, все const-ы и var-ы в этом коде не нужны.


 
yantar92   (2009-11-02 13:50) [6]

убирание var и const не помогает


 
yantar92   (2009-11-02 13:50) [7]

Удалено модератором


 
yantar92   (2009-11-02 13:50) [8]

Удалено модератором


 
yantar92   (2009-11-02 13:52) [9]

фактическое значение параметра paint, передаваемое в функцию dc_A_s равно ссылке на функцию paint


 
Сергей М. ©   (2009-11-02 13:54) [10]


> равно ссылке на функцию paint
>


А где функция-то определена и реализована ?


 
yantar92   (2009-11-02 13:55) [11]

procedure paint(const x:extended; const y:extended; var series:Tlineseries);
begin
series.AddXY(x,y);
series.ParentChart.Parent.Repaint;
end;


 
RWolf ©   (2009-11-02 13:55) [12]

вероятно, баг не в вызове процедуры  по указателю, а в методе Repaint класса series.ParentChart.Parent


 
yantar92   (2009-11-02 13:55) [13]

а определена она в той же форме


 
Сергей М. ©   (2009-11-02 13:56) [14]


> определена она в той же форме


В форме нет функций.
Там есть методы


 
yantar92   (2009-11-02 13:56) [15]

>RWolf ©   (02.11.09 13:55) [12]

>вероятно, баг не в вызове процедуры  по указателю, а в методе Repaint класса >series.ParentChart.Parent
нет, если убрать это, но после вызова paint написать application.processmassages, то вылетает именно на application.processmassages.


 
yantar92   (2009-11-02 13:58) [16]

>Сергей М. ©   (02.11.09 13:56) [14]
>
>
>> определена она в той же форме
>
>
>В форме нет функций.
>Там есть методы

ну private метод.


 
Сергей М. ©   (2009-11-02 14:00) [17]


> ну private метод


Ну так а какого тогда лешего прототип Tpaint у тебя прототип функции, а не прототип метода ?


 
yantar92   (2009-11-02 14:02) [18]

ну во первых, это работает если вызывать иную ф-цию.
во-вторых paint об"явлен в implementation а раньше нигде не оговорен.


 
Сергей М. ©   (2009-11-02 14:03) [19]


> paint об"явлен в implementation а раньше нигде не оговорен.


А причем тут тогда private ?


 
yantar92   (2009-11-02 14:04) [20]

ну если єто метод, как ті говоришь, то он может біть исключительно private, либо я чего-то не понимаю


 
Сергей М. ©   (2009-11-02 14:05) [21]


> то он может біть исключительно private


С чего бы вдруг ?

Если это метод, то он м.б. и приватный, и защищенный, и публичный


 
yantar92   (2009-11-02 14:07) [22]

ладно, суть вопроса не в этом заключалась. Я же говорю, что оно прекрасно работает если вызывать не paint а например некий paint2 код которого иной


 
Сергей М. ©   (2009-11-02 14:09) [23]


> суть вопроса не в этом заключалась


А никакого вопроса и не было.
Была констатация некоего факта, не более того.


 
yantar92   (2009-11-02 14:11) [24]

ну вопрос как от этого избавится


 
Сергей М. ©   (2009-11-02 14:12) [25]

Ну ты же сам сказал как избавиться - вызывать не paint а например некий paint2 код которого иной)


 
yantar92   (2009-11-02 14:14) [26]

нет, не в имени дело. А в том чтобы именно этот код можно было вызывать без глюков


 
Сергей М. ©   (2009-11-02 14:15) [27]


> чтобы именно этот код можно было вызывать без глюков


Для этого нужно понять, что у тебя там на самом деле  private, а что не имеет ни малейшего отношения к методу класса


 
yantar92   (2009-11-02 14:16) [28]

и, кстати, "paint2" не решает проблему с application.processmassages


 
clickmaker ©   (2009-11-02 14:17) [29]

> проблему с application.processmassages

а с ней-то какие проблемы?
и почему именно paint2 призван ее решить?


 
yantar92   (2009-11-02 14:18) [30]

>Сергей М. ©   (02.11.09 14:15) [27]
>
>
>> чтобы именно этот код можно было вызывать без глюков
>
>
>Для этого нужно понять, что у тебя там на самом деле  private, а что не имеет >ни малейшего отношения к методу класса

оно то так, но совсем загадочно почему series.addXY - работает, а series.parentchart.parent.repaint - нет


 
Сергей М. ©   (2009-11-02 14:18) [31]


> не решает проблему с application.processmassages


Надо же ! Проблемы плодятся как кролики)


 
yantar92   (2009-11-02 14:19) [32]

>clickmaker ©   (02.11.09 14:17) [29]
>
>> проблему с application.processmassages
>
>а с ней-то какие проблемы?
>и почему именно paint2 призван ее решить?
если вызывать другую процедуру по ссылке, то это не помогает


 
clickmaker ©   (2009-11-02 14:19) [33]

> processmassages

надо массажиста менять. адназначна


 
yantar92   (2009-11-02 14:22) [34]

если вызывать процедуру по ссылке, то выходит что application.processmessages перестает работать


 
Сергей М. ©   (2009-11-02 14:23) [35]


> если вызывать


Да нихрена ты ничего не вызываешь !
Где в приведенном фрагменте хоть что-либо напоминающее вызов ф-ции dc_A_st ?


 
yantar92   (2009-11-02 14:28) [36]

вызвать не dc_A_st а в
function dc_A_st(... var paint:Tpaint;var series:Tlineseries ...):extended;
...
begin
...
paint(x,y,series);
application.processmessages //[b]НЕ ПАШЕТ[/b]
...
end;


 
Медвежонок Пятачок ©   (2009-11-02 14:30) [37]

а может пашет, но неглубоко?


 
yantar92   (2009-11-02 14:32) [38]

application.processmessages - при дебаге не определен


 
RWolf ©   (2009-11-02 14:36) [39]

особых проблем в коде не видно, надо выше смотреть — как вызывают, что передают, как данные хранятся.


 
Медвежонок Пятачок ©   (2009-11-02 14:37) [40]

отключи оптимизацию кода


 
Сергей М. ©   (2009-11-02 14:40) [41]


> вызвать не dc_A_st а в


Ты прикидываешься что ли ?)

Тебе ж черным по-русски говорят - покажи где и как ты вызываешь dc_A_st ..


 
yantar92   (2009-11-02 15:37) [42]

procedure TForm1.Button3Click(Sender: TObject);
var i,j,k:longint; koord:Tkoord;
dcAst:extended;     proc:Tpaint;
begin
chart1.Visible:=true;
Panel1.Visible:=1=2;
Button1.Visible:=1=2;
Button2.Visible:=1=2;

{E_AA:=-1E-20;E_BB:=-3E-20;E_AB:=(E_AA+E_BB)/2;
T:=1E3;
C_A:=0.5;C_B:=1-C_A;
D:=200;
width_:=10;
height_:=10;
N_layers:=200;D_layer:=trunc(D/N_layers)+abs(sign(frac(D/N_layers)));}

read_parameters;

series_:=TLineSeries.Create(Self);
series_.ParentChart:=chart1;
chart1.Parent:=main_form;
proc:=paintXY;
Application.ProcessMessages;
dcAst:=dc_A_st(100000000,4000,atoms,C_A,C_B,D,width_,height_,E_AA,E_BB,E_AB,T,pr oc,series_);
Label16.Caption:=floattostr(dcAst);
end;


 
Сергей М. ©   (2009-11-02 15:45) [43]


> proc:=paintXY;


Опять в прятки играешься ?
Что такое paintXY ?
Где и как объявлено и реализовано ?


 
RWolf ©   (2009-11-02 16:01) [44]

1=2 — это такой модный способ написать False? :)


 
yantar92   (2009-11-02 16:16) [45]

implementation
...
procedure paintXY(const x:extended; const y:extended; var series_:Tlineseries);
begin
series_.ParentChart.Parent.Repaint;
series_.AddXY(x,y);
end;


 
yantar92   (2009-11-02 16:17) [46]

>RWolf ©   (02.11.09 16:01) [44]
>
>1=2 — это такой модный способ написать False? :)

так быстрее:))


 
clickmaker ©   (2009-11-02 16:19) [47]

> так быстрее:))

вот так круче
Button1.Visible:=(2*2=5);


 
Anatoly Podgoretsky ©   (2009-11-02 16:20) [48]


> так быстрее:))

Чего же тогда выше не написал 1=1


 
RWolf ©   (2009-11-02 16:22) [49]

быстрее будет поставить GExperts (или что-нибудь вроде) и привязать нужные слова на алиасы из пары букв. Сокращать код в ущерб читабельности — это неправильный подход.


 
RWolf ©   (2009-11-02 16:23) [50]

и да, Button1.Hide;  :)


 
Сергей М. ©   (2009-11-02 16:25) [51]


> yantar92   (02.11.09 16:16) [45]


Тогда вернемся к нашим баранам см. [16]

> ну private метод.


Это самое "private метод" какое отношение имеет к коду в [45], в котором никакими приватными методами даже не пахнет  ?


 
yantar92   (2009-11-02 16:37) [52]

>Сергей М. ©   (02.11.09 16:25) [51]
>
>
>
>Это самое "private метод" какое отношение имеет к коду в [45], в котором >никакими приватными методами даже не пахнет  ?
я по поводу приват-метод писал из-за [14] и это действительно никакого отношения к [45] не имеет.


 
Сергей М. ©   (2009-11-02 16:53) [53]


> yantar92   (02.11.09 16:37) [52]


Т.е. paintXY - это регулярная процедура, а dc_A_st - регулярная функция ?


 
yantar92   (2009-11-02 17:00) [54]

да


 
Сергей М. ©   (2009-11-02 17:03) [55]

Тогда убирай отовсюду все var и const.

А вызывай так:

dcAst:=dc_A_st(..., @PaintXY,...);


 
yantar92   (2009-11-02 17:05) [56]

не помогает


 
Сергей М. ©   (2009-11-02 17:06) [57]

ПРямо так и говорит "не помогаю" ?)


 
yantar92   (2009-11-02 17:10) [58]

нет, говорит то же что и раньше: "project bi.exe raised exception class Elnvalid Pointer with message "Invalid pointer operation". process stopped"


 
Сергей М. ©   (2009-11-02 17:10) [59]


> говорит то же что и раньше


На какой конкретно строчке ?


 
yantar92   (2009-11-02 17:12) [60]

series_.ParentChart.Parent.Repaint; при втором вхождении в процедуру


 
Сергей М. ©   (2009-11-02 17:15) [61]

Что говорит отладчик по поводу актуальности значений

series_
series_.ParentChart
series_.ParentChart.Parent

?


 
yantar92   (2009-11-02 17:17) [62]

все есть, а series_.parentchart.parent.repaint - "inaccessible value"


 
Сергей М. ©   (2009-11-02 17:19) [63]


> series_.parentchart.parent.repaint - "inaccessible value"


Правильно говорит.
repaint - это метод, а не свойство.
Да и, кстати, за каким лешим после добавления каждой точки перерисовывать весь чарт ?


 
yantar92   (2009-11-02 17:21) [64]

ну єто требовалось для того, чтобы окно не "зависало" во время выполнения подсчетов точек


 
yantar92   (2009-11-02 17:23) [65]

еще пробовал application.proccesmessages после добавления каждой точки, но оно тоже вылетало


 
Сергей М. ©   (2009-11-02 17:26) [66]


> оно тоже вылетало


Куда ?)


 
yantar92   (2009-11-02 17:27) [67]

"project bi.exe raised exception class Elnvalid Pointer with message "Invalid pointer operation". process stopped"


 
yantar92   (2009-11-02 17:28) [68]

а другими словами - в космос))


 
yantar92   (2009-11-02 17:35) [69]

у меня появилось подозрение на настройки компилятора, но я не представляю что может быть. Может кто-то знает?


 
clickmaker ©   (2009-11-02 17:38) [70]

> у меня появилось подозрение на настройки компилятора

конечно.
"если в кране нет воды, то виной тому - винды"


 
yantar92   (2009-11-02 17:42) [71]


> clickmaker ©   (02.11.09 17:38) [70]
>
> > у меня появилось подозрение на настройки компилятора
>
> конечно.
> "если в кране нет воды, то виной тому - винды"


просто на другом компе работало, хотя я не уверен, что не поменял что-то важное после того.


 
Сергей М. ©   (2009-11-02 18:14) [72]


> после того


После чего ?


 
yantar92   (2009-11-02 18:26) [73]

после того, как запускал прогу на том компе


 
Сергей М. ©   (2009-11-02 19:07) [74]

То есть, подводя итоги, вопрос твой звучит так: почему одна и та же прога на этом компе работает, а на том компе не работает.

Так ?


 
yantar92   (2009-11-02 19:09) [75]

ну да, поэтому и версия насчет настроек компилятора


 
Сергей М. ©   (2009-11-02 19:14) [76]


> версия насчет настроек компилятора


Причем здесь компилятор-то ?

Вот ты собрал свой шедевр на компе А.
Запустил результаты сборки.
Работает.

Скопировал результаты сборки на комп B, запустил.
Не работает.

И причем здесь, спрашивается, компилятор ? Которого на компе В и в помине не было ?


 
sniknik ©   (2009-11-02 19:14) [77]

наигрались? давайте "удавим" партизана? ведь очевидно, ничего с ним не получится.


 
Сергей М. ©   (2009-11-02 19:16) [78]


> sniknik ©   (02.11.09 19:14) [77]


Дави.
Гестапо бессильно)



Страницы: 1 2 вся ветка

Текущий архив: 2009.12.20;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.016 c
1-1229336430
Afonya
2008-12-15 13:20
2009.12.20
Прорисовка пункта меню своими руками


2-1256898581
Oleg1963
2009-10-30 13:29
2009.12.20
Компонент Еdit в цикле


15-1255092813
Unknown user
2009-10-09 16:53
2009.12.20
Интересная задача


15-1256128035
interrup+
2009-10-21 16:27
2009.12.20
The New York Times на русском.


3-1231855810
Тень
2009-01-13 17:10
2009.12.20
Access и дата/время