быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Может ли быть вызвана объявленная, но неопределённая функция?02.01.2012, 23:11. Показов 1896. Ответов 18
Метки нет (Все метки)
Друзья! Ещё раз прошу иизвнения, если задену чьи-то чувства, но в дельфи я полный профан.
...Итак, качнул исходники Dev-Cpp (IDE C++, прилагаются), написанные на Delphi7. Научился компилировать и даже нашёл, как мне кажется, процедуру, с которой и разбираюсь. (Эта процедура должна удалить настройки компилятора g++ по нажатию на кнопку, но она ни фига их не удаляет. То есть удаляет пункт в выпадающем списке с именем настроек, но не сами настройки) Вот она:
НА всякий случай посмотрел класс TPersistent и ещё какой-то коленом выше, тоже этой функции нет Потом посмотрел, что значит слова "virtual; abstract;" "Директива Virtual может сопровождаться директивой Abstract. Это изменяет эффект директивы Virtual. Это означает, что текущий класс не должен кодировать метод - он здесь только как метка-заполнитель, чтобы напомнить и гарантировать, что полученные классы осуществят его. Директива Virtual может сопровождаться директивой Abstract. Это изменяет эффект директивы Virtual. Это означает, что текущий класс не должен кодировать метод - он здесь только как метка-заполнитель, чтобы напомнить и гарантировать, что полученные классы осуществят его. " То есть мне щас надо для класса TStrings искать подкласс и она там должна быть определена, ну допустим. Но фишка в том, что devCompilerSet.Sets именно класса TStrings, а никакого другого, вот:
Добавлено через 2 минуты Вот исходники https://www.cyberforum.ru/atta... 1325455643
0
|
02.01.2012, 23:11 | |
Ответы с готовыми решениями:
18
Ошибка E2250 (Нет перегруженной версии 'FmtStr', которая может быть вызвана с этими аргументами) save_construct_data не хочет быть вызвана Может ли рекурсивная функция быть встроенной? Ошибка - функция не может быть перегружена |
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,162
|
||||||
03.01.2012, 01:15 | 2 | |||||
CodeIns.pas
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
03.01.2012, 16:36 [ТС] | 3 |
А как определить, что это именно эта функция и есть искомая? То есть я вижу определение метода Delete класса
TCodeInsList Меж тем мне нужно определение Delete класса TStrings. Извините
0
|
03.01.2012, 19:05 | 4 | |||||
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
03.01.2012, 19:57 [ТС] | 5 | |||||
Спасибо, конечно, но вопросы те же самые остались, то есть я наблюдаю определение метода Delete класса TMemoStrings, меж тем мне нужно определение метода Delete класса Tstrings
...НАсколько я понял, по F7/F8 мы просто пошагово выполняем программу, в общем я жал на F8 ища нужный метод, пока просто не запустил Dev-Cpp
0
|
480 / 253 / 51
Регистрация: 30.06.2010
Сообщений: 651
|
|
03.01.2012, 20:36 | 6 |
Найдите объявление в классе devCompilerSet где производится инстанцирование fSets (именно fsets) скорее всего найдёте в конструкторе Create, там будет что-то вроде fsets := Tstringlist.create;
Так вот, в этом Tstringlist и ищите описание метода Delete (само собой, там может быть не конкретно Tstringlist, я его поставил в пример, как фактического класса), т.е. будет вызываться не абстрактный метод формально прописанного класса, а перекрытый метод фактического класса. F8 это step over - дебаг без захода в подпрограмму, а Вам надо использовать F7 - с заходом в подпрограмму. А ещё лучше сделать брейкпоинт по F5 - и нажать Run F9 и тогда при попытке выполнения кода программа брякнется туда, где поставили бряк, хотя думаю, Вы понимаете ход дебага в общих чертах.
1
|
03.01.2012, 23:40 | 7 |
TStrings абстрактный класс, для него существует только объявление метода Delete. Реализация отсутствует. Поэтому вы непосредственно "его" реализацию не найдете. Я своим прошлым постом пытался донести, что имея где-то в коде или переменную или тип возвращаемого результата в виде TStrings де-факто подразумевается любой потомок этого класса. В вашем конкретном случае, как справедливо заметил pHOMM вам нужно при помощи trace into попасть в вызов этой процедуры и смотреть что к чему.
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||||||||||||||||||||||||||||||||
10.01.2012, 02:14 [ТС] | 8 | |||||||||||||||||||||||||||||||||||
А без трассировки никак нельзя? Я просто не пойму, я ведь в этой строке когда нахожусь
Добавлено через 49 минут +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Ребята, мне без вашей помощи не обойтись, короче я решил пошагово трассировать всю эту бодягу, итак, ставлю бряк два бряка, вот на этих строках:
Добавлено через 28 минут Уж я даже у этой проклятой Delete нашёл и ассемблерный код, брякнулся на неё, правой кнопкой-> отладка-> показать CPU; а исходник никак не найду
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|||||||||||||||||||||
10.01.2012, 10:21 | 9 | ||||||||||||||||||||
Присоединюсь к обсуждению темы.
Всё правильно, свойство devCompilerSet.Sets объявлено, как поле типа TStrings. Класс TStrings - это абстрактный класс. Это означает, что некоторые его методы объявлены, но не реализованы. Нереализованным является также и метод Delete(). В объявлении этого метода прямо указано на это с помощью слова: abstract. Нельзя создать экземпляр абстрактного класса. Можно создать экземпляр класса потомка от абстрактного класса, в котором реализованы все абстрактные методы. Абстрактный класс задаёт архитектурную, концептуальную основу для группы классов, которые будут унаследованы от него. Это означает, что полю devCompilerSet.Sets присвоен указатель на экземпляр класса потомка, унаследованного от класса TStrings. В данном случае классом-потомком является класс TStringList. Этот класс уже не является абстрактным и его метод Delete() имеет реализацию. Именно реализацию этого метода мы и видим в приведённом коде. --- Здесь смысл в следующем. У нас есть поле evCompilerSet.Sets. Это поле может ссылаться на экземпляр любого не абстрактного класса, являющегося наследником от класса TStrings. Код построен так, что этому полю, evCompilerSet.Sets, присваивается указатель на экземпляр класса TStringList. Этот класс, TStringList, является потомком от класса TStrings. --- Чтобы было понятнее можно рассмотреть такой пример. Предположим, что мы должны работать с такими компонентами как: TMemo, TListBox, TComboBox и с экземплярами класса TStringList. И нам надо написать процедуру, которая бы умела записывать в экземпляры этих классов набор случайных чисел (в строковом представлении). Все эти компоненты хранят свои текстовые данные в потомках класса TStrings. Зная это, пишем процедуру:
kravam, в этом примере последняя строка:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||||||||||||||||||||||
10.01.2012, 13:33 [ТС] | 10 | |||||||||||||||||||||||||
Спасибо, что-то понятно, над чем-то ещё буду думать, но один вопрос для дальнейшего продвижения высянить необходимо.
+++ Напомню, по бряку на этом вызове:
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
10.01.2012, 14:05 | 11 |
Если нужно узнать что откуда и сколько раз вызывается, здесь надо либо изучать исходный код используемых классов, либо - трассировкой.
Ну от этого никуда не деться - чем больше код, тем сложнее в нём разбираться. В общем, "копать глубоко" нужно начинать в случае, если программа работает в самом деле медленно и требуется что-то предпринять для увеличения быстродействия.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
10.01.2012, 14:28 [ТС] | 12 | ||||||||||
А в моём случае код какого класса надо изучить?
То есть я правильно понял, что где-то до этого вызова
+++++++++++++++++++++++++++++++++++++++ Там недостатки те ещё, там предлагаются несколько настроек компиляотора, например: настройка_A, настройка_B, настройка_C; каждая настройка суть набор опций, с которыми компилятор запускается. Можно свои обавлять или менять. А вот удалить проблема, допустим, удаляю настройку настройка_B Остаются настройки: настройка_A, настройка_C; И всё бы ничего, да только вот набор опций настройка_C исчезает бесследно, а на его месте оказывается набор опций удалённой настройки настройка_B Добавлено через 3 минуты И кстати, в моём случае надо только исходный код изучать потому что по трассировке мы попадаем на два вызова, о которых я говорил, но фишка-то в том, что они могут вызываться не безусловно, а по каким-то условиям. То есть: предположим теоретически, что я поправил работу какой-то из двух функций, а она взялась и не выщзвалась в один прекрасный момент, ибо вызывается ПО НЕКОТРОМУ УСЛОВИЮ. Вся работа насамарку.
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
10.01.2012, 14:41 | 13 |
Да, верно. И выше в теме об этом уже говорили HighPredator и pHOMM. - Что такое присвоение следует искать, начиная с реализации конструктора класса, к которому принадлежит экземпляр devCompilerSet. И таким потомком класса TStrings, судя по:
является класс TStringList.
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
10.01.2012, 16:01 [ТС] | 14 | ||||||||||
Кажется, вы были правы, расставляя бряки подобного рода
ShowMessage(IntToHex(Integer(devCompilerSet.Sets), 8)+ 'попробуем здесь'); то здесь, то там: Я наткнулся на:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
10.01.2012, 16:17 | 15 |
Ну и тема. Умеет ли комп "ходить туда, не скажу как". А как он пойдёт, если ему не сказали, как это делается? Куда, он предположим знает. Но если ты забыл ему сказать, как, то чего ты от него хочешь?
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
10.01.2012, 16:18 [ТС] | 16 |
Так-то я разобрался уже. До свидания.
0
|
10.01.2012, 16:22 | 17 | |||||
Здесь всё веселее.В коде вызывается ЧтоТоТам.Delete(ЧтоТоЕщё.ItemIndex), однако ЧтоТоЕщё.ItemIndex - это не переменная, а свойство. Посмотрите его определение, и увидите что-то вроде:
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
10.01.2012, 16:38 [ТС] | 18 |
Понимаемо. Здорово, конечно, если бы это можно было увидеть в исходниках, но это отошло уже на второй план, ведь я КОРРЕКТНО (не наугад то есть) нужную реализацию Delete, а это главное. А этот механизм, что вы описали наверное скрыт где-то в её глубине.
Добавлено через 11 минут вот тогда у меня возник вопрос, а чё, компилятор скам подставляет SetItemIndex? То есть тут важно понять, что я имею ввиду, то есть я понимаю, чтокомпилятор много чего куда подставляеть сам и это скрыто. В С++ также, но там он только может подставить функцию в АССЕМБЛЕРНЫЙ КОД (если она, конечно не реализована в хидерах)! А тут мы наблюдаем вызов SetItemIndex (суть нахождения индекса) в исходном коде. То есть автор просто прописал TStringList.Delete(Index: Integer); И вместо Index: Integer пишется вызов SetItemIndex(Value:Integer), так? +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Ну или раз уж об этом разговор зашёл, наверное в DElphi есть хидеры и SetItemIndex(Value:Integer) реализована в хидерах? ТОгда это всё объясняет. Но, кажись, Она реализована не в хидерах, а в авторских сырцах, мне не разобраться.
0
|
10.01.2012, 17:22 | 19 | ||||||||||||||||||||
для примера, класс представляет строку из единиц
Свойства также могут работать напрямую с переменными, то есть можно было бы написать так:
1
|
10.01.2012, 17:22 | |
10.01.2012, 17:22 | |
Помогаю со студенческими работами здесь
19
Может ли функция быть действительной частью Функция определяющая может ли быть построен треугольник Может ли функция (процедура) быть полем record? Может ли быть функция кондиционера в тепловой завесе? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |