Как передать функции пользовательский тип?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Как передать функции пользовательский тип?

Сообщение 0xy » 19.06.2006 (Пн) 13:58

Есть функция записи данных в файл:

Код: Выделить всё
Function Write2File(Data, FileName$) As Boolean

Есть необходимость передавать ей переменные с типами, описаными пользователем. К какому типу следует отнести Data, чтобы избежать несоответствия типов? Variant не катит (и не должон), а Any для внутрених процедур не допускается.

ЗЫ
Кстати, а что такое Any?

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

Сообщение GSerg » 19.06.2006 (Пн) 14:02

К какому типу следует отнести Data

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

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 19.06.2006 (Пн) 14:37

GSerg писал(а):
К какому типу следует отнести Data

К тому самому типу, описанному пользователем.

Так юзертипы нельзя вроде?

OVERPOST: Мммда?... откуда тогда я взял, что нельзя?...
Последний раз редактировалось Nicky 19.06.2006 (Пн) 15:10, всего редактировалось 1 раз.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 19.06.2006 (Пн) 14:49

Nicky писал(а):Так юзертипы нельзя вроде?


P.S.: за имена ногами не бейте (особенно fnew :oops: ), нужно срочно бежать :)
Вложения
Test.rar
(1.23 Кб) Скачиваний: 48
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 20.06.2006 (Вт) 2:50

GSerg писал(а):К тому самому типу, описанному пользователем.

Да эт понятно, но накой такое нужно? Ведь функция задумывалась как универсальная (т.е. для записи любых типов, в т.ч. стандартных).
Последний раз редактировалось 0xy 20.06.2006 (Вт) 3:04, всего редактировалось 2 раз(а).

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

Сообщение GSerg » 20.06.2006 (Вт) 2:53

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

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 20.06.2006 (Вт) 2:53

Тогда используй any. Как раз для записи любых типов.
Подпись проходит рефакторинг

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

Re: Как передать функции пользовательский тип?

Сообщение tyomitch » 20.06.2006 (Вт) 2:58

0xy писал(а):Any для внутрених процедур не допускается.
Изображение

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 20.06.2006 (Вт) 3:03

Может как-то можно сварганить ссылку на (ранее описаный) тип непосредственно перед вызовом функции?

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

Сообщение GSerg » 20.06.2006 (Вт) 3:10

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

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 20.06.2006 (Вт) 21:30

GSerg писал(а):As long, и передавать varptr.

А пример можно? А то у меня в доке нету varptr :(
Типа так:
Код: Выделить всё
Dim Data As UserType, DataLink&
DataLink=VarPtr(Data)
Write2File(DataLink,"FileName")
..........................
Function Write2File(DataLink&, FileName$) As Boolean
' НУ И ЧЕГО ТЕПЕРЬ ДЕЛАТЬ С ЭТИМ DataLink :?:
End Function

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

Сообщение BV » 20.06.2006 (Вт) 22:33

Теперь MoveMemory в структуру из адреса...
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;

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 20.06.2006 (Вт) 23:32

BV писал(а):MoveMemory в структуру из адреса...

В смысле RtlMoveMemory? Так опять же, длину нужно знать :x

PS
Наверное проще десяток процедур написать, под каждый тип :(

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

Сообщение tyomitch » 20.06.2006 (Вт) 23:47

0xy, а каким чудом твоя процедура сможет обработать структуру, если она не знает не то что её смысл, но даже её длину?
Как ты себе это представляешь?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.06.2006 (Ср) 1:33

Код: Выделить всё

Dim Data As UserType, DataLink&
DataLink=VarPtr(Data)

Write2File(DataLink, LenB(Data), "FileName")
..........................
Function Write2File(DataLink&, DataLengh&, FileName$) As Boolean
Dim aData() As Byte
Dim hFile    As Long
Redim aData(0 To DataLengh  - 1)
CopyMemory aData(0), ByVal DataLink&, DataLengh&
hFile = FreeFile
Open FileName$ For Binary as #hFile
Put #hFile, ,aData
Close #hFile
End Function
Последний раз редактировалось Хакер 21.06.2006 (Ср) 21:38, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 21.06.2006 (Ср) 21:26

tyomitch писал(а):0xy, а каким чудом твоя процедура сможет обработать структуру, если она не знает не то что её смысл, но даже её длину?
Как ты себе это представляешь?

Ну, длина "закодирована" в юзертайпе :) Get ее видит, а вот Len--нет :(
А предлагаеный способ передачи структуры процедуре предполагает указание ее длины.

Кстати, в Access 97 VarPtr ВРЁТ! Со всеми вытекающими :x Это нормально, или только у меня?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.06.2006 (Ср) 21:37

0xy писал(а):А предлагаеный способ передачи структуры процедуре предполагает указание ее длины.

А в чём сложность определения длины? И протестил и у меня всё работает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 22

    TopList