Страница: 1 | 2 |
Вопрос: Передача структуры в метод класса...
Добавлено: 10.05.06 02:29
Автор вопроса: BV | ICQ: 302392161
Собственно, как известно, нельзя вызвать метод класса, где в качестве аргумента - структура. А так же сами структуры в классах объявлять как Public - нельзя. Мне это нужно обойти, и передать методу класса извне в аргументе структуру. Как это сделать?
Ответы
Всего ответов: 25
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 10.05.06 11:27
О каком языке программирования идет речь? (VB6/NET)
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 10.05.06 11:32
Откуда это известно? Мне, например, нет
Если класс не Private - то кто мешает?
В общем, учить матчасть!
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 10.05.06 15:53
1) объявить как Public (если можно) не в структуре... в отдельном модуле..
2) Долгая и геморная работа с указателями, которых в ВБ, по мнению большинства, - нет. Они есть, просто спрятаны от всяких там "Hello World'истов"...
P.S.
Когда то в Си++ так хотел... тоже что-то неполучалось, хотя там указатели и не спрятаны Фишка вроде была в том, что получая адрес начала структуры, нуполучается потом её востановить читая память, т.к. всякие типы как String расбросаны в памяти как попало ну всмысле где было место
P.S.S. Лучше поискать другие пути решения проблемы...
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 10.05.06 16:16
Еще раз - структуры объявляются как Public и передаются как аргументы при декларации в любом Public классе. Ибо дело не в разбросе её членов, а в том что эта структура в вызываемом классе имеет неплохие шансы просто напросто быть неописанной. То есть, неизвестный тип данных. Компилятор не допускает подобной ерунды.
Для примера возьми ту же коллекцию - ты не сможешь в неё засунуть приватный тип, поскольку этот тип не приводится к типу Variant - и, потенциально, ты можешь передать его за пределы класса/проекта, что попросту недопустимо.
Так что для любого активикс приложения достаточно объявить тип в публичном классе, а для стандартного EXE и смысла в этом нет.
Номер ответа: 5
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #5
Добавлено: 10.05.06 16:48
Поторопился я с вопросом, забыл о передаче структуры по указателю. Теперь, разумеется, вопрос решен.
О VB6.
Это почему же? Работать с указателями более чем просто, собственно, как и с памятью. Не вижу никаких оснований для таких заявлений.
Учи матчасть, и думай, перед тем как говорить.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 10.05.06 17:20
Эт верно, тебе бы сначала азы VB подучить надо, а потом уж на структуры замахиваться.
Да ну? Ну значит гений ты непризнанный. Все тут, понимаишь, считают это геморным патамушта VB не позволяет работать с указателями в принципе. Про ByRef и VarPtr не надо, умоляю...
У тебя есть что возразить на это?
Как я уже говорил, учить матчасть срочна! В поиске найдешь ссылки на мануалы по VB. Советую начать с Введения.
Номер ответа: 7
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #7
Добавлено: 10.05.06 17:30
2 LamerOnLine
Видимо, для таких как ты, об этом надо сказать:
Это я: http://bbs.vbstreets.ru/profile.php?mode=viewprofile&u=5332&sid=19b45f8a1ac5787e8a29c0803e8472af
Это тоже я: http://forum.sources.ru/index.php?showuser=23565
5 лет программирую на Basic-подобных языках и Borland C++, из них 3 с половиной года на VB, год на PowerBASIC.
Не тебе меня учить, не позорься.
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 10.05.06 17:36
Ну и к чему ты это привел?
Полный :lol:
Человек, который программирует 3 с половиной года на VB пишет
Ржунимагу! Ты случаем не фокусник?
Извини, но не верю я что программист даже с трехлетним стажем може написать такую чушь. И потом её еще отстаивать
Номер ответа: 9
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #9
Добавлено: 10.05.06 17:55
Надеюсь, ты различаешь класс и пользовательские типы, а следовательно и то, что именно подразумевалось под структурой.
Выполни этот код:
Option Explicit
Public Type SomeStruct
var1 As Long
var2 As String * 255
var3() As Byte
End Type
Public Function SomeFunc(ByRef SS As SomeStruct) As Long
'
SomeFunc = 1
End Function
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 10.05.06 18:04
Ну ты додумался - указать строку фиксированного размера. Замени её на String или () as Byte - и все выполнится
Тут проблема то в другом крылась
Номер ответа: 11
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #11
Добавлено: 10.05.06 18:11
Хм... Видимо, у нас разные компиляторы, ибо мой выдаёт ошибку "Cannot define a Public user-defined type within a private object module" - независимо от содержания структуры. Аналогично и с функцией - "Private Enum and user-defined types cannot be used as parameters or return types for public procedures…"
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 10.05.06 18:23
Жесть... Начиная с самого первого ответа я твердил одно - класс не может быть Private!
В общем, так
1. Создаешь новый проект, ActiveX.exe либо ActiveX.dll (ну или еще какой хечешь), свойство Instancing первого класса дефолтовое - MultiUse, копируешь туда код, компилишь - и все ок.
Ну а то что Public типы в объектных модулях имют свои ограничения - надеюсь ты не открыл Америку
ВБ - это COM язык, если параметр не поддерживается Automation - в VB с ним будет сложновато. Забавы ради - попробуй из C++ вернуть в VB простой байтовый массив char[] вместо SAFEARRAY или BSTR...
Номер ответа: 13
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #13
Добавлено: 10.05.06 19:31
Мда... Я хотел было дописать строку "Никакого отношения к GlobalMultiUse это не имеет", ибо знал, что ты именно так и ответишь.
Речь идёт _именно_ о тех ограничениях пользов. типов в классах, которые решаются за счёт передачи указателя структуры, а не самой структуры. Кроме того, мне нужно передавать структуры в несколько классов одновременно, в несколько _приватных_ классов, где и возникают те проблемы, о которых я упомянул в вопросе.
Насчёт формата VB строки - не вижу никаких проблем. Обрезание нулевого символа в конце и конвертация в Юникод.
Номер ответа: 14
Автор ответа:
BV
ICQ: 302392161
Вопросов: 2
Ответов: 28
Профиль | | #14
Добавлено: 10.05.06 19:35
Кстати, на этом форуме реально править свои сообщения?
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 10.05.06 21:12
>offtop
нет.
при этом...
Не тебе меня учить, не позорься.
не позорься - вот именно.
Если умеешь - молодец, но ненадо говорить "более чем просто", а то аж глаза режит...
по поводу ссылок на свой профиль и на кое-то там сообщение из другого форума - понт.
я на стрите скромный RUSYA :/ Почти такой же как BV на VBNet'e... только с народом там общаюсь чуть осторожней, без всяких
Релизуй то, что ты хочешь от VB на Си - на те же грабли наступишь. Если структура не объявлена в классе, то работать с этой структурой в том классе, в котором она не объявлена будет сложно (ИМХО + больше к VB отношу... Спор насчёт Си я вести не в состоянии, из за нехватки знаний)