Пользовательский тип данных

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

Пользовательский тип данных

Сообщение Kolobuk » 04.02.2007 (Вс) 14:33

Зравствуйте.
Наткнулся на такую проблему.

Мой тип данных:

Код: Выделить всё
Type Zz
FLAG As Integer
RAZMER1 As Long
IMYA1 As String
RAZMER2 As Long
IMYA2 As String
End Type
Public MYTIP As Zz


Оказывается нельзя указывать размер для текстовых строк - IMYA1 и IMYA2. Т.е. сделать вот так:

Код: Выделить всё
IMYA1 = Space(RAZMER1)
IMYA2 = Space(RAZMER2)


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

P.S.: Пример упрощённый.
Последний раз редактировалось Kolobuk 04.02.2007 (Вс) 16:00, всего редактировалось 1 раз.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 04.02.2007 (Вс) 15:09

IMYA1 as string*5

Kolobuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 24.10.2006 (Вт) 20:03

Сообщение Kolobuk » 04.02.2007 (Вс) 15:14

:shock:
так размер же разный может быть

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

Сообщение Amed » 04.02.2007 (Вс) 15:30

Код: Выделить всё
Const IMYAMaxLength=255

Type ...
IMYA1 As String*IMYAMaxLength
End Type


Задайте максимальную длину имени, к примеру, равную 255.
Зачем это вообще нужно - для чтения типизированных файлов?

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.02.2007 (Вс) 15:33

Если размер известен заранее, то ...string*5, а если нет
то MyTip.IMYA1=Space$(MyTip.RAZMER1) и tercium non datur

А в чем суть проблемы? в том, чтобы бейсик читая запись через binary режим оператором get хватая данные в этот тип сам делал выводы о том сколько ему считать байт - не выйдет... ? Все равно придется указывать отдельной строкой сколько же именно байт считать

Amed писал(а):
Код: Выделить всё
Const IMYAMaxLength=255
Но тогда ведь и размер файла возрастает до неприличных размеров - если там каждая запись стока весить будет?

Если уж так важно хранить данные в типах, то вместо бинари и гет придется писать свою процедуру и ориентироваться на какие-либо символы - указатели т.е. [new]флаг*имя1*имя2[new]флаг*имя1*имя2
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Kolobuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 24.10.2006 (Вт) 20:03

Сообщение Kolobuk » 04.02.2007 (Вс) 16:09

Если размер известен заранее, то ...string*5, а если нет
то MyTip.IMYA1=Space$(MyTip.RAZMER1) и tercium non datur


В том то и дело, что так не получается :(


Вообще странно почему Len(MYTIP) показывает 18 байт???

Ведь -
Код: Выделить всё
Type Zz
FLAG As Integer
RAZMER1 As Long
IMYA1 As String
RAZMER2 As Long
IMYA2 As String
End Type
Public MYTIP As Zz
- должен занимать 10 байт

и пиши хоть MyTip.IMYA1=Space$(5), хоть MyTip.IMYA1=Space$(25) - всёравно Len(MyTip) будет = 18


----------


tercium non datur это что?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 04.02.2007 (Вс) 16:58

tercium non datur это что?

Третьего не дано.
Salus populi suprema lex

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.02.2007 (Вс) 17:32

Вообще странно почему Len(MYTIP) показывает 18 байт???

ИМХО
Код: Выделить всё
Type Zz
FLAG As Integer '2 байта
RAZMER1 As Long '4 байта
IMYA1 As String  '4 байта
RAZMER2 As Long '4 байта
IMYA2 As String '4 байта
End Type

Это поскольку строки храняться в куче.
Если явно указать размер строки, то проблема отпадает
Код: Выделить всё
Option Explicit
Private Type Zz
FLAG As Integer
RAZMER1 As Long
IMYA1 As String * 10
RAZMER2 As Long
IMYA2 As String * 10
End Type

Len(z) = 13
Поскольку в даном случае, строки имеет фиксированый размер и храняться целиком в структуре.

Вроде бы так.
الفيجوال بيسك الرابح


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

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

Сейчас этот форум просматривают: серверянин, Google-бот, SemrushBot и гости: 2

    TopList