Конференція vbstreets - перегляд теми - тип даних string
Я, здається, здогадуюся, звідки він це взяв.
Точніше, звідки це взяв той, у кого він це взяв.
Якщо зробити ось так:
Код: Виділити все Type xx
a As String
b As Long
c As String * 10
d As Long
e () As Byte
End Type
Sub test ()
Dim s As String
Dim x As xx
Dim f As Long
s = "abcdef" + ChrW (H6DE)
f = FreeFile
Open "c: \ testfile" For Binary As f
Put #f. x
Close f
End Sub
То отримаємо в файлі вельми цікавий результат:
x.a буде виглядати ось так (hex): 07 00 61 62 63 64 65 66 3F
x.c - ось так: 61 62 63 64 65 66 3F 20 20 20
А x.e - ось так: 01 00 0E 00 00 00 00 00 00 00 61 00 62 00 63 00 64 00 65 00 66 00 DE 06
Тобто x.a записався як ansi, при цьому в самий початок додалася двухбайтовая довжина рядка.
x.c - теж як ansi, і відсутня частина рядка заповнилася пробілами.
А x.e - як масив байт (логічно, в общем-то), що складають цей рядок, предварённий якимось заголовком, розміром рівненько в 10 байт.
Втім, як це все пов'язано з тим, як vb зберігає рядки в пам'яті - не уявляю.
label:
cli
jmp label
Ну так при збереженні в файл відбувається якась ніяка сералізація (до речі корінням йде в зворотну сумісність з древніми версіями VB, в яких використовувалися ANSI-рядки), яка, так, мало спільного має з зайняттям місця в пам'яті.
-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.
Ще раз пропустивши повз вуха, сказане Хакером, у мене дещо зачепилося за мозок.
Оголосимо дві змінних типу String:
Код: Виділити все Dim strExemple_1 As String
Dim strExemple_2 As String * 10
Припустимо, що ми завантажуємо в змінні текст з файлу txtExemple.txt. розміром 20 кб.
Розмір strExemple_1 становить 4 байти і містить покажчик на BSTR-рядок розміром 4+ (20 * 1024 + 1) * 2 = 40 966 (байт).
Розмір strExemple_2 становить 4 байти і містить покажчик на BSTR-рядок розміром 4+ (10 + 1) * 2 = 26 (байт)
Маю велику надію, що зачепилося правильно і в потрібному порядку. Якщо немає, прошу поправити.
char * out = "| * 0> 78 -, +<|"; size_t cc = char_traits BV писал (а): Що таке 4 в останньому виразі? BV писал (а): а тим більше, множити на два -We separate their smiling faces from the rest of their body, Captain. Added char * out = "| * 0> 78 -, +<|"; size_t cc = char_traits З усього вищесказаного, у мене сформувалося таке: Код: Виділити все Option Explicit Public Type MyCustomType_01 Public Type MyCustomType_02 Public MyCustomer_01 As MyCustomType_01 Immediate писал (а): Розмір MyCustomer_01 в байтах: 24 Не зовсім. По-друге, оголошене As String * N дійсно займає 2L байт, але толку від цього мало: яким би чином ти не образается до фіксед-стринг-змінної або фіксед-стринг полю, воно ніколи не постане перед тобою в справжньому вигляді. Завжди буде створюватися звичайна BSTR-копія. -We separate their smiling faces from the rest of their body, Captain. Ох ох! Фіксованих рядків, подібних VB, афаік, немає в COM. -We separate their smiling faces from the rest of their body, Captain.
for (size_t i = 0; i
Довжина рядка, забудькуватий наш, що зберігається перед початком рядка.
Розмір WCHAR - 2 байта, так що потрібно.
-That's right! We decapitate them.
Про всяк випадок поясню: мені здалося, що 4 в дужках. І ця 4 вже була другою після згадки розміру префікса
for (size_t i = 0; i
Оголосимо в модулі два UDT і їх змінні.
varFixedString As String * 10
varString As String
End Type
varString_01 As String
varString_02 As String
End Type
Public MyCustomer_02 As MyCustomType_02
Для кнопки напишемо код:
Код: Виділити все Private Sub Command1_Click ()
Debug.Print "Розмір MyCustomer_01 в байтах:" vbTab LenB (MyCustomer_01)
Debug.Print "Розмір MyCustomer_02 в байтах:" vbTab LenB (MyCustomer_02)
End Sub
І отримуємо:
Розмір MyCustomer_02 в байтах: 8
Значить, розмір MyCustomer_01 складається з розміру поля MyCustomer_01.varFixedString 10 * 2 = 20 (байт) і розміру покажчика на BSTR -строку поля MyCustomer_01.varString 4 байта, що в сумі становить 24 байта.
Відповідно розмір MyCustomer_02 складається з суми покажчиків його полів: 8 байт.
По-перше, позбудься нарешті від фрази «займає в пам'яті».
-That's right! We decapitate them.
Мене не покидає стійке відчуття, що б розібратися з типами VB, треба зазирнути в нетрі COM і OLE Automation, а може і глибше.
Хакер, що не підкажеш що почитати на цю тему?
-That's right! We decapitate them.Схожі статті