|
|
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 30, 2004 06:13:35 · Поправил: q_q volodya примерчик приведу ... есть строка ... функция, которая парсит строку ... Строка может ... UTF-16 ... UTF-8 ... ISO-1251 ... KOI-8 или в чем-нибудь еще ... В структурном программировании у меня есть только один выход - написать кучу процедур ... для ООП подход может быть и другим ... Вариант - костяк в виде виртуальной фунции, которая переопределяется в классах-потомках ... невероятно удобен ... детали реализации определены в соответствующих методах Поясни чем куча процедур отличается от соответствующих методов? Quantum Как в твоей реализации ООП будет выглядеть перегрузка функций? Яркий пример: в Си есть abs, labs, fabs, в Си++ достаточно реализовать abs с разными типами параметров, заботу о вызове нужной реализации возмет на себя компилятор. |
|
|
Дата: Мар 30, 2004 06:48:11 Quantum А на счет структуры, у которой есть еще и такое поле: call (Generic_tbl PTR [eax]).draw_ptr volodya Я сам к макросам отношусь очень негативно. Я не люблю их и не высоких языках, ни, тем более, в асме. Как без макросов на асме сделать УДОБНЫЙ стековый кадр без использования EBP? Так: PUSH [ESP+(5+2+0)*sizeof.DWORD] ? The Svin Это конечно совсем дурацкий пример, но он давно морочит мне голову.. Надо оптимизировать по размеру (значения других регистров не определены): 8378 08 00 cmp [dword ds:eax+8], 0 75 20 jnz short foo |
|
|
Дата: Мар 30, 2004 06:54:43 · Поправил: Quantum q_q Перегрузку можно реализовать, но только в рантайме. Иначе придётся юзать макрос, чего мне очень не хочется. С другой стороны, я не вижу никакой пользы от подобной "фичи", т.е. нескольких функций под одним именем. Кстати, перегрузка не всегда осуществляется средствами компилятора, как в случае С++. На Java используются сигнатуры на базе параметров и возвращаемого значения и всё это ресолвится исключительно в рантайме. S_T_A_S_ Извините, не понял... |
|
|
Дата: Мар 30, 2004 09:09:31 · Поправил: S_T_A_S_ Quantum На FASM можно вроде того:
struc foo arg
{
.ptr dd arg
macro .#go _% call [.ptr] %_
}
_% fix {
%- fix }
bar foo SomeAddress
;; получаем bar.ptr: dd SomeAddress
bar.go
;; делаем call [bar.ptr]
как любил говорить bitRAKE "use macro, luke!" |
|
|
Дата: Мар 30, 2004 09:30:35 Quantum я не вижу никакой пользы от подобной "фичи" imho перегрузка функций - одно из проявлений полиморфизма, который является одним китов ООП. Или мы обсуждаем новый ООП? |
|
|
Дата: Мар 30, 2004 12:22:578378 08 00 cmp [dword ds:eax+8], 0 75 20 jnz short foo Если это адреса одного приложения. Т.е. в eax какой то из адрессов внутри приложения, то база у них одинаковая. Тогда бит базы будет тоже присутсвовать если смещнение не больше базы а значит можно: 8540 08 TEST DWORD PTR DS:[EAX+8],EAX 75 20 jnz short foo Если смещение будет больше может не сработать (т.е. если старшие биты неравны, младшие произвольно не угадать, хотя можно сделать правильную арифметику используя выравнивание). Можно также использовать cmp [eax+8],eax если ты знаешь что все значения (не нулевые) могут быть либо строго больше, либо строго меньше. Я часто использовал такие зависимости для сокращения и ускорения кода зная расположение частей. Я вообще не уверен, что понял, что ты написал. Авитаминоз. |
|
|
Дата: Мар 30, 2004 14:02:42 The Svin Правильно все поняли. Я же пишу - пример дурацкий. .IF TRUE / .IF FALSE 8540 08 TEST DWORD PTR DS:[EAX+8],EAX А если DWORD PTR DS:[EAX+8] == 1? ( как это определено в stdbool.h ) CMP тоже не подойдет, т.к. нельзя сказать заранее, что туда виндос засунет 1 или -1. А вот ООП навязывает использование одного регистра под "this". Ну и ладно.. пожертвуем EBP Тогда можно принятьт для себя условие - в этом регистре только нечетные значения. Меняю например 8 на 7 Данные-то все равно обязательно выравнены. Я просто везде пытаюсь найти положительные моменты. А не только отрицательные. |
|
|
Дата: Мар 30, 2004 14:31:15 Не я не понял до этого что может быть в [eax+8], что там такое? Буль какой то? Я то предположил что там адреса функций. Что может быть FALSE а что TRUE? TRUE всегда 1 а FALSE 0 или -1 ? А в eax? Указатель на таблицу булевых аргуметнов? |
|
|
Дата: Мар 30, 2004 14:43:01 The Svin Там то что виндос возвращает нам 0 или не 0. Выражаюсь я значит невнянтно :( А почему адрес моей функции может быть 0 равен ?? |
|
|
Дата: Мар 30, 2004 16:59:58 Блин такое простое дело не можем понять между собой, а что то формализовать хотим чтоб даже машина поняла. Просто ответь, что может быть если TRUE и FALSE. Ёпсель-мопсиль, я же написал ответь через TRUE и FALSE и что такое в eax. Сейчас второй раз пишу при этом виртуальным кулачком постукиваю по твоему монитору чтобы ты меня услышал :))) при FALSE 0 а при TRUE не 0 ? Так что-ли? А почему адрес моей функции может быть 0 равен ?? При отсутсвии функции. Ты ведь опкод изучал? Вот если mod = 00 то если memr 100 - то это говорит о SIB, если 101 - это говорит об отсутсвии базы, а если любое другое из 6и значений - то просто код базового регистра. Т.е. в компактных форматах поле может содержать разнородные сущности. Я всегда говорил что низкоуровневые форматы изучать стоит не ради кодирования в бинарном виде, а (в частности) для изучения приёмов, которые (в частности) можно использовать и в своих форматах. Вот например пишешь ты базу, есть в записи указатель на текст, но в некоторых записях нет этого текстового поля. И тебе по зарез для быстрой обработки нужно знать есть там или нет его. Ты можешь ввести флаговое поле. А можешь просто в случае отсутвия значения в этом поле ставить вместо указателя в него значение которое наверняка указателем быть не может. Ну не может например в WIndows 0 быть значением указателя. Это значение можно использовать как указание на отсутсвие указателя. Таким образом сохраняется место=колличеству записей * размер флага. При десятках миллионов записей, места существенно много сохраняется. |
|
|
Дата: Мар 30, 2004 18:05:08 · Поправил: S_T_A_S_ The Svin что может быть в [eax+8] Здесь хранится bool - результат какой-нибудь WinAPI ф-ции. (Тут не обязательно eax даже, например esp может быть) Как показывают мои наблюдения, винАПИ, что бы показать ошибку, может сделать inc чего-то там содержащего нуль, т.е. получается FALSE=1. А может делать OR -1, т.е. получаем FALSE=FFFFFFFFh. Компилятор так у них видно устроен. Позже, например, мне это значение надо проверить, 0 оно или нет. Вот я думаю так: Скажем, есть массив данных - DWORD'ы, расположены-то они всегда (!) по адресу кратному 4. И есть регистр, в котором хранится адрес первого элемента этого массива. Т.е. в нем 2 младших бита - нули. И адресация идет [reg32+4], [reg32+8] - и т.п. Но ведь можно сделать так, что в регистре будет всегда адрес первого элемента этого массива + 1. И адресовать элементы так: [reg32+3], [reg32+7] - и т.п. Т.о. в этом регистре постоянно младший бит будет 1. Вот с этом-то регистром и делать TEST для проверки: нуль или 1(-1) Т.е. сравнение всегда происходит правильно, учитывая какие значения может нам дать АПИ в той ячейке памяти. Если у меня будет ООП, то я всегда буду вынужден тратить один регистр для работы с таблицами. Так вот пусть он мне дополнительную пользу приносит - в нем всегда будут нечетные значения :) есть в записи указатель на текст, но в некоторых записях нет этого текстового поля. Но там не указатели на функции ;) Просто я не совсем понял, зачем место под указатель на функцию резервировать, а потом туда ноль писать? Если там указатели на данные, то для флагов можно и биты "лишние" использовать. Например старший и 2 младших - если указатели на DWORD'ы. Бит иногда и проще установить будет, чем ноль записать. А что то формализовать я правильно не умею - это да :( Терминологию пока современную изучишь - крыша поедет :) |
|
|
Дата: Мар 30, 2004 19:52:09 q_q Meyer, B. Object-Oriented Software Construction, second edition, p90: Перегрузка упрощает программирование лишь на синтаксическом уровне, чтоб человек не напрягался лишний раз для придумывания разных имён (или иных символьных нотаций) для функций близких/одинаковых по содержанию, но различающихся по количеству и типу параметров. НО это слабо влияет на повторное использование кода (reusability) и никак не связано с независимостью представления (representation independence). Полиморфизм проявляется в использовании одного кода для обработки различных данных (объектов), но в случае перегрузки имеется несколько кодов (функций, методов) под одним именем, что не есть полиморфизм. IMHO, перегрузку нельзя назвать неотьемлемой частью ООП. |
|
|
Дата: Мар 31, 2004 04:17:55 Quantum Meyer: НО это слабо влияет на повторное использование кода ... Причем здесь повторное использование? Полиморфизм проявляется в использовании одного кода для обработки различных данных ... в случае перегрузки имеется несколько кодов ... Не смешивай уровень реализации полиморфизма с уровнем абстракции. Приведи пример, когда один код используется для обработки различных данных. IMHO, перегрузку нельзя назвать неотьемлемой частью ООП. Я и не называл. Повторю. Перегрузка - одно из воплощений полиморфизма. |
|
|
Дата: Мар 31, 2004 04:41:02 Приведи пример, когда один код используется для обработки различных данных. Да нет такого кода и быть не может. Речь идет о костяке, виртуальной функции, благодря которой не нужно иметь триста разных имен, описывающих, по-сути, одно и то же. Ну первый класс. Что тут обсуждать, книжки надо читать. |
|
|
Дата: Мар 31, 2004 06:00:14 volodya Да нет такого кода и быть не может. Развенчали очередное "улучшение" ООП, реализовывать придется все варианты. не нужно иметь триста разных имен А триста разных имен классов реализующих по-сути, одно и то же? книжки надо читать Книжки читать говоришь, ну-ну ... Перечитай ветку. На первой странице я уже писал по поводу: JaDS > приходиться помнить названия переменных и констант, а почему бы это не оформить как класс и не путаться с именами. |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078 |