Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.59.163] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, Source As Any, ByVal Length As Long) Private Type struT1 b1 as Byte b2 as Byte End Type Private Type struT2 b1 as Byte b2 as Byte s1 as String End Type Dim V1 as struT1, V2 as struT2 Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2? |
Сообщ.
#2
,
|
|
|
А кто сказал, что компоненты структуры обязаны располагаться именно в том порядке, в каком объявлены, и с тем же выравниванием? А CopyMemory работает, только копировать она тебе будет, мягко говоря, "что-то"...
|
Сообщ.
#3
,
|
|
|
Цитата BlackSun @ Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2? Когда я через memcpy делал интерфейсы, к которым кастовались структурные классы в 98 сях, так же недоумевал со скрытых механизмов) Хотя, в сях есть возможность устроить структуры правильно, в твоём же случае, ты лишь описываешь что будешь использовать внутри type, но не как ни то что там будет в реальности) Akina дело говорит. |
Сообщ.
#4
,
|
|
|
Впрочем, не вижу большой проблемы... можно же взять экземпляр структуры, взять байтовый массив поболе, да скопировать первое во второе с запасиком - и наслаждаться.
|
Сообщ.
#5
,
|
|
|
ИМХО, проще не извращаться вот так на VB, а вынести уже всю эту шаманскую часть которую он вообще хочет реализовать "для того что было быстро" в динамическую библиотеку, и решить эти вопросы на низком уровне.
|
Сообщ.
#6
,
|
|
|
VisualProg
Не, это я к тому, что просто убедиться, что не всё так гладко на разных структурах. А по делу - так я, например, считаю, что в подавляющем большинстве случаев желание "сползти пониже" просто не оправдано. |
Сообщ.
#7
,
|
|
|
Цитата Akina @ желание "сползти пониже" просто не оправдано. То есть, городить велосипеды из побайтного копирования структур - это лучше? Это всё будет напоминать борьбу с самим языком, нежели написание чего то на нём... Сама суть VB была в сокрытии и автоматизации этих страшных механизмов, и, естественно, при попытке в них вмешаться - борьба с языком неизбежна. |
Сообщ.
#8
,
|
|
|
Цитата BlackSun @ Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2? Работает. Ну здесь имеет место быть конверсия строки UNICODE->ANSI на входе и ANSI->UNICODE на выходе. Чтобы такого не было нужно передавать ByVal VarPtr(v1). Цитата Akina @ А кто сказал, что компоненты структуры обязаны располагаться именно в том порядке, в каком объявлены, и с тем же выравниванием? Именно в том порядке и с тем же выравниванием Byte-1байт, Integer-2, Long - 4 etc. |
Сообщ.
#9
,
|
|
|
Цитата VisualProg @ То есть, городить велосипеды из побайтного копирования структур - это лучше? А кто мешал использовать первый тип во втором? Private Type struT1 b1 as Byte b2 as Byte End Type Private Type struT2 b as struT1 s1 as String End Type Dim V1 as struT1, V2 as struT2 ' ... V2.b = V1 |
Сообщ.
#10
,
|
|
|
Первый тип во втором сразу не был использован, а теперь чтобы так сделать, нужно переписать кучу кода и дай Бог, не наловить ошибок. Структура располагается в памяти именно так, как описана, иначе надо добавлять доп. служеб. данные и зачем её перекручивать??? В файл же она пишется именно как описана, хоть там и есть немного преобразования над строками переменной длины, но порядок тот же.
Цитата TheTrik @ там строка лежит в хвосте приёмника и никак не должна влиять на процесс. Но, похоже, там пишутся ещё какие-то служеб. данные в её указатель от struT1 (выравнивание? здесь приведён пример с потолка - может и работать, в реал. проекте не работает). LenB даёт размер без выравнивания, как получить размер структуры с выравниванием в памяти или только вручную? онверсия строки UNICODE->ANSI |
Сообщ.
#11
,
|
|
|
Цитата BlackSun @ там строка лежит в хвосте приёмника и никак не должна влиять на процесс. Какая разница? Ты передаешь структуру в API и VB6 выполняет конверсию. Цитата BlackSun @ В файл же она пишется именно как описана, хоть там и есть немного преобразования над строками переменной длины, но порядок тот же. В файл пишется сериализованная структура, при желании можно сделать запись в массив сериализованной структуры. Цитата BlackSun @ Но, похоже, там пишутся ещё какие-то служеб. данные в её указатель от struT1 (выравнивание? здесь приведён пример с потолка - может и работать, в реал. проекте не работает). Так приведи пример структуры которая вызывает сбой. Цитата BlackSun @ LenB даёт размер без выравнивания, как получить размер структуры с выравниванием в памяти или только вручную? Как раз дает размер с выравниванием. |
Сообщ.
#12
,
|
|
|
Цитата TheTrik @ и в результате конверсии она меняет позицию, а точнее указатель на строку? VB6 выполняет конверсию |
Сообщ.
#13
,
|
|
|
Цитата BlackSun @ и в результате конверсии она меняет позицию, а точнее указатель на строку? Позицию не меняет, указатель меняет. Фиксированные строки соответственно уменьшаются в 2 раза. |
Сообщ.
#14
,
|
|
|
А если указатель не меняет позицию, то как конверсия может повлиять на его изменение?
|
Сообщ.
#15
,
|
|
|
Цитата BlackSun @ А если указатель не меняет позицию, то как конверсия может повлиять на его изменение? К примеру если строка содержит символы из разных кодовых страниц. Для фиксированных строк это соответственно сжимает размер структуры. |