Конференція 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:: length (out);
for (size_t i = 0; i((Out ?? (i ??) ?? '89)); ??> cout<

BV писал (а): Що таке 4 в останньому виразі?


Довжина рядка, забудькуватий наш, що зберігається перед початком рядка.

BV писал (а): а тим більше, множити на два


Розмір WCHAR - 2 байта, так що потрібно.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Added
Про всяк випадок поясню: мені здалося, що 4 в дужках. І ця 4 вже була другою після згадки розміру префікса

char * out = "| * 0> 78 -, +<|"; size_t cc = char_traits:: length (out);
for (size_t i = 0; i((Out ?? (i ??) ?? '89)); ??> cout<

З усього вищесказаного, у мене сформувалося таке:
Оголосимо в модулі два UDT і їх змінні.

Код: Виділити все Option Explicit

Public Type MyCustomType_01
varFixedString As String * 10
varString As String
End Type

Public Type MyCustomType_02
varString_01 As String
varString_02 As String
End Type

Public MyCustomer_01 As MyCustomType_01
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
І отримуємо:

Immediate писал (а): Розмір MyCustomer_01 в байтах: 24
Розмір MyCustomer_02 в байтах: 8


Значить, розмір MyCustomer_01 складається з розміру поля MyCustomer_01.varFixedString 10 * 2 = 20 (байт) і розміру покажчика на BSTR -строку поля MyCustomer_01.varString 4 байта, що в сумі становить 24 байта.
Відповідно розмір MyCustomer_02 складається з суми покажчиків його полів: 8 байт.

Не зовсім.
По-перше, позбудься нарешті від фрази «займає в пам'яті».

По-друге, оголошене As String * N дійсно займає 2L байт, але толку від цього мало: яким би чином ти не образается до фіксед-стринг-змінної або фіксед-стринг полю, воно ніколи не постане перед тобою в справжньому вигляді. Завжди буде створюватися звичайна BSTR-копія.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Ох ох!
Мене не покидає стійке відчуття, що б розібратися з типами VB, треба зазирнути в нетрі COM і OLE Automation, а може і глибше.
Хакер, що не підкажеш що почитати на цю тему?

Фіксованих рядків, подібних VB, афаік, немає в COM.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Схожі статті