Что теоретически невозможно сделать на VB?

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 13.05.2005 (Пт) 11:27

pitbull писал(а):
FAKK2 писал(а):"Старайся делать все максимально просто, но не проще" (с) ктото

"Старайся делать все максимально просто, но не упрощай" Кажется так и кажется это John Kemeny и Thomas Kurtz или кто-то из них :D написал.
Короче это идея лежит в основе Basic (со слов Bruce McKinney)
Вот так.


Всё должно быть просто, настолько просто - насколько возможно!
(с) Какой-то самоуверенный автор
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.05.2005 (Пт) 11:39

xolod писал(а):А напишите мне драйвер, ну, скажем... для видеокарты. На VB.
Кто смелый?
Ни дровишки, ни Native DLL. VB даже QueryInterface и IUnknown Interface не понянет. Вообщем, ни тебе нормального видеоплеера, ни программы захвата (с тюнера или еще с чего).
Вообщем, в плане сильных системных и мультимеди утилит он хиловат.
Зато прост и надежен как копейка с Fiat'овским движком :D


Кину камешек в огород: копейка - полностью Fiat'овская машина. Точная копия какой-то модели.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.05.2005 (Пт) 20:30

ism писал(а):Еще забыто отсутствие возможности компилировать прогу под ДОС

Чего? VBDOS видел?
ism писал(а):отсутствие оператора new(нельзя создать цепь или дерево в памяти как в Си или Паскале).

Чего? И оператор такой есть, и дерево можно создать...

ism, чего-то ты гонишь капитально... Что ни аргумент, то гон :evil:
Изображение

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 13.05.2005 (Пт) 22:37

Что ни аргумент, то гон

Ну может слишком картко сказал... но я ж думал все тут знают Си и Паскаль 8)

В Си и Паскаль оператор new имеет несколько другую функцию нежли в ВБ и работает подругому. Он возвращает указатель на динамически созданную переменную(массив). Я имел ввиду в ВБ нельзя обявить стуктуру с полем указателем на следующую структуру. Впринципе я делал нечто подобное через апи, но это нетак удобно и постоянно глючит (особенно конечные поля).

Вот что я имел ввиду:
Код: Выделить всё

Private Type TItem
body As String * 255
NextPointer As Long
End Type

Private Sub Form_Load()
Dim IItem As TItem
Dim pAddr As Long

        pAddr = HeapAlloc(GetProcessHeap(), _
                HEAP_ZERO_MEMORY, Len(IItem))

        IItem.body = "Text"
        IItem.NextPointer = 0 'Указател на следующую область
        CopyMemory ByVal pAddr, IItem, Len(IItem)
        CopyMemory IItem, ByVal pAddr, Len(IItem)
        MsgBox IItem.body
       
        Call HeapFree(GetProcessHeap(), 0, pAddr)
End Sub

Т.о. каждый элемент указывает на последующий, а их максимальное к-во практически неограничено. На ВБ это хорошо только на бумаге.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2005 (Сб) 1:11

На VB это реализуется объектами, и притом гораздо более гибко, чем указателями.

Так всё-таки можно в памяти дерево сделать? Или не разрешаешь? ;-)
Или для этого тоже понадобятся апи? :lol:
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 14.05.2005 (Сб) 15:22

Тоже понадобятся апи :lol:
Несмотря на то, что Брюс МакКинни уже давно сказал: и удобнее, и лучше делать структуры данных при помощи объектов. :)
Моду создают модоки, а распространяют модозвоны.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.05.2005 (Сб) 17:24

2tyomitch:Тут страдает скрость. Предположим, что наша струкутура, которая много раз создается/копируется/удаляется в оперативной памяти состоит из четырех чисел. Если структура объявлена как Type, то она будет занимать 16 байт. А если как Class, то каждый ее экземпляр бедут занимать еще плюс как минимум 28 байт для vtable IDispatch'а, и еще плюс 8(!) байт на каждую переменную. Тогда получится, что именно "оболочка" класса будет занимать объем как минимум в два раза больший чем, сами данные. Елси теперь вся эта масса будет куда-то перемещаться, то можно увидеть значительное снижение производительности. Не забывайте также, что обращение к элементам класса производится несколько медленнее, чем к структурам.
В этом вопросе я в принципе согласен с ism. В VB, к примеру нельзя(т.е. можно, но через ж) создавать ссылки на структуры, в то время, как я уже отметил, работа со структурами все-таки быстрее.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.05.2005 (Сб) 17:27

А эта масса не будет никуда перемещаться :) Объекты в неуправляемой памяти не могут поменять свой ObjPtr :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.05.2005 (Сб) 17:31

Пардон, только щас обдумал такой момент: ведь для кажого объекта не создается отдельного экземпляра vtable? Если так, то беру свои слова обратно :oops:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.05.2005 (Сб) 17:40

Иными словами: интерфейс это указатель на первый элемент vtable или укзатель на указатель на первый элемент vatble?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2005 (Сб) 21:22

ANDLL писал(а):Иными словами: интерфейс это указатель на первый элемент vtable или укзатель на указатель на первый элемент vatble?

Ни то ни другое. Интерфейс - это сама VTable.
Экземпляр класса - это указатель на указатель на VTable (то, что у тебя второе).
И VTable, и код всех методов - по одному на класс.
Т.е. все "доп. потери" - это ~20 байт (ссылка на IID, ссылка на VTable, счётчик ссылок и т.п. вещи)
Последний раз редактировалось tyomitch 14.05.2005 (Сб) 21:30, всего редактировалось 1 раз.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2005 (Сб) 21:24

hCORe писал(а):Тоже понадобятся апи :lol:
Несмотря на то, что Брюс МакКинни уже давно сказал: и удобнее, и лучше делать структуры данных при помощи объектов. :)

Брюса МакКинни я не читал, но уважаю :-)
Потому что объекты и правда рулят.

Один из аргументов против переАПИстов: вон в дотнете всё суть объекты, как вы там жить-то будете с таким презрением к ООП?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2005 (Сб) 21:27

ANDLL писал(а):Не забывайте также, что обращение к элементам класса производится несколько медленнее, чем к структурам.

А это-то почему?

Неужели начитался Аппельмана, который считает, что публичные переменные компилируются как пара Property Let/Property Get?
Так вот, я проверял - это гон, по крайней мере в VB6. В VB5, может, было и по Аппельмановски.
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.05.2005 (Сб) 21:35

tyomitch

Да, действительно, Аппельман, так и говорит, мол, для публичных переменных VB сам дописывает Get/Let.

Но, если ты утверждаешь, что гон, покажи как ты к этому пришел? Мне интересно просто.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2005 (Сб) 22:30

FAKK2 писал(а):Но, если ты утверждаешь, что гон, покажи как ты к этому пришел? Мне интересно просто.

Создал компонент:
Код: Выделить всё
Public Variable As Variant

Public Property Get Property() As Variant
End Property

Public Property Let Property(ByVal RHS As Variant)
End Property


Откомпилировал и посмотрел число вызовов __vbaFreeVar в получившемся. Их ровно два: в ?Property__Get@Class1@@AAGXXZ и ?Property__Let@Class1@@AAGXXZ
Легко понять, что никакой сгенерированный код для установки Variant-свойства не может обойтись без __vbaFreeVar, чтобы уничтожить старое значение.
Отсюда делаются выводы.

Есть и более простой способ: сосчитать число команд ret x (т.к. любой COM-член возвращает HRESULT, у "сгенерированных" методов неизбежно были бы аргументы). Их ровно две, и именно для явно прописанных методов.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.05.2005 (Вс) 5:16

Не знаю, что вы там читали у Эпплмана, но, видимо, вы читали раннего Эпплмана :)
Открой Книжку на странице 249 и прочитай абзац сразу после кода :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.05.2005 (Вс) 8:09

Я вообще не читал Эпплмана, но вес-же не понимаю. Ты имеешь ввиду, что у Vb есть некий оптимизирующий механизм при обращении к переменным-членам классов внутри своей проги. Ведь любой другой язык(тот же VBA) использует свойство только через Get\Let?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.05.2005 (Вс) 10:10

ANDLL писал(а):Я вообще не читал Эпплмана, но вес-же не понимаю.

Чтобы понимать вес, надо читать не Эпплмана, а Ньютона :)

ANDLL писал(а):Ведь любой другой язык(тот же VBA) использует свойство только через Get\Let?

Да ну?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 15.05.2005 (Вс) 16:18

Цитирую Эпплмана:
"...При предоставлении доступа к простому элементу данных... следует использовать процедуры свойств... потому что такое решение при небольшом объеме дополнительного кода расширяет ваши возможности. Например, позднее вы сможете легко реализовать проверку присваиваемых значений. В VB6 этот выбор особенно важен, поскольку переход от открытых переменных к процедурам свойств сопровождается нарушением совместимости. В VB.NET дело упрощается тем, что связывание осуществляется в процессе работы JIT-компилятора, поэтому переход на процедуры свойств не отразится на работе существующего кода. Тем не менее это полезная привычка..."
Моду создают модоки, а распространяют модозвоны.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.05.2005 (Вс) 16:25

Ну вот, взял и процитировал 249 страницу :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 15.05.2005 (Вс) 16:45

Должен же был кто-нибудь сделать это :)
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.05.2005 (Вс) 19:23

ANDLL писал(а):Ты имеешь ввиду, что у Vb есть некий оптимизирующий механизм при обращении к переменным-членам классов внутри своей проги.

Нет. Между двумя VB-прогами.
ANDLL писал(а):Ведь любой другой язык(тот же VBA) использует свойство только через Get\Let?

Если ты про Dispatch (про него??), то вполне правдоподобно, что при обращении через него Get\Let "эмулируются".
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.05.2005 (Вс) 19:48

Нет я не про IDispatch.

Скажем так. Программа на VBA использует VB-класс у которого есть Public SomeVar as Variant. Предполождим, что программа на VBA создала экзепляр нашего объекта.
Как она теперь получит значение SomeVar? Только через Get Property, ведь так?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.05.2005 (Вс) 20:37

ANDLL писал(а):Как она теперь получит значение SomeVar? Только через Get Property, ведь так?

Почему??
В "обычном" VB в точности тот же VBA-движок, что и в "чистом" VBA.
Т.е. возможности полностью идентичны.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 15.05.2005 (Вс) 20:59

Эпплман писал(а):...переход от открытых переменных к процедурам свойств сопровождается нарушением совместимости...


Есть вопрос.
Совместимости с чем? Одно дело UserControl'ы, но в классах...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.05.2005 (Пн) 5:14

И чем юзерконтрол отличается от класса?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.05.2005 (Пн) 7:56

2tyomitch: Ты не понял. VBA-проект использует VB-DLL. Каким образом он сможет обращаться к членам класса. Или же VB-EXE использует VB-DLL. Тот же вопрос. Он же не может определить, на каком языке написана DLL.

Кстати,
tyomitch писал(а):Ни то ни другое. Интерфейс - это сама VTable

А вот и нет!
MSDN писал(а):COM Interface
A pointer to a vtable pointer where the first three methods in that table are QueryInterface, AddRef, and Release. For more information, see the COM section of the Platform SDK documentation.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.05.2005 (Пн) 9:44

Ну это же явная бессмыслица. А как тогда у них определён "COM Object"?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.05.2005 (Пн) 10:23

Наверное, как Object which impements COM Interface :D
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.05.2005 (Пн) 12:56

А никак. Нету втом месте такого.
MSDN писал(а):COM Class
An implementation of one or more COM interfaces. COM objects are instances of COM classes. For more information, see the COM section of the Platform SDK documentation.

А вот в другом месте:
COM class

The definition of an object in code. In the Component Object Model, class refers to the general object definition, whereas in C++, the class of an object is a data type.

COM object

A programming structure that includes both data and functionality. A COM object is defined and allocated as a single unit.


2tyomitch: Почему бессмыслица? Логика примерно такая: Если ты пишешь:
Код: Выделить всё
Dim A as IInterface

То что есть переменная A? Ни что иное, как то, что написано. Это просто игра слов: с таким же успехом: интерфейс это запись в TYPELIB... Хотя нет, это interface definition.[/code]
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Пред.След.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 94

    TopList