Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
как известно, нельзя вызвать метод класса, где в качестве аргумента - структура

Откуда это известно? Мне, например, нет
А так же сами структуры в классах объявлять как Public - нельзя.

Если класс не Private - то кто мешает?
В общем, учить матчасть!

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 10.05.06 15:53
А так же сами структуры в классах объявлять как Public - нельзя. Мне это нужно обойти...


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/NET)


О VB6.

Долгая и геморная работа с указателями


Это почему же? Работать с указателями более чем просто, собственно, как и с памятью. Не вижу никаких оснований для таких заявлений.

Еще раз - структуры объявляются как Public и передаются как аргументы при декларации в любом Public классе.


Учи матчасть, и думай, перед тем как говорить.

Ответить

Номер ответа: 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 пишет
Собственно, как известно, нельзя вызвать метод класса, где в качестве аргумента - структура.

А так же сами структуры в классах объявлять как Public - нельзя.

Ржунимагу! Ты случаем не фокусник?
Извини, но не верю я что программист даже с трехлетним стажем може написать такую чушь. И потом её еще отстаивать :)

Ответить

Номер ответа: 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
Ну ты додумался - указать строку фиксированного размера. Замени её на String или () as Byte - и все выполнится ;)


Хм... Видимо, у нас разные компиляторы, ибо мой выдаёт ошибку "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

Offtop:

Кстати, на этом форуме реально править свои сообщения?

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 10.05.06 21:12
>offtop
нет.


Это почему же? Работать с указателями более чем просто, собственно, как и с памятью. Не вижу никаких оснований для таких заявлений.

при этом...
5 лет программирую на Basic-подобных языках и Borland C++, из них 3 с половиной года на VB, год на PowerBASIC.

Не тебе меня учить, не позорься.

не позорься - вот именно.

Если умеешь - молодец, но ненадо говорить "более чем просто", а то аж глаза режит...

по поводу ссылок на свой профиль и на кое-то там сообщение из другого форума - понт.

я на стрите скромный RUSYA :/ Почти такой же как BV на VBNet'e... только с народом там общаюсь чуть осторожней, без всяких
Не тебе меня учить


Релизуй то, что ты хочешь от VB на Си - на те же грабли наступишь. Если структура не объявлена в классе, то работать с этой структурой в том классе, в котором она не объявлена будет сложно (ИМХО + больше к VB отношу... Спор насчёт Си я вести не в состоянии, из за нехватки знаний)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам