Текущий архив: 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