Страница: 1 | 2 | 3 |
Вопрос: Опять указатели и CopyMemory
Добавлено: 20.03.05 19:22
Автор вопроса: Neco | Web-сайт:
Ответы
Всего ответов: 31
Номер ответа: 16
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #16
Добавлено: 21.03.05 14:58
2cresta
Хе, сейчас сделал такой эксперимент:
1.В dll сделал два одинаковых байтовых массива. По 100 байт. Проверил - совпадают.
2.Один оставил как тестовый(проверочный). Адрес второго передал в VB. И тут же из VB вернул обратно этот адрес в dll (в проверочную ф-цию). Безо всяких CopyMemory, напрямую. Проверил адрес - тот же, что и передавал в VB. Не изменился. А содержимое первых 100 байт от этого адреса запорото напрочь Есть только небольшая последовательность от 18 до 31 байта, совпадающая с исходным содержимым. Вот так вот.
Код, пожалуйста, приведи.
VB работает с байтом 0-255, а char - -128-127
Это тоже может быть причина искажений.
Бред. В двоичном представлении нет различий. Диапазон изменения от 00000000 до 11111111. Других вариаций нет.
Номер ответа: 17
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #17
Добавлено: 21.03.05 15:15
Код, пожалуйста, приведи
LamerOnLine
Зачем тебе код? Чтобы назвать это бредом? Если ты знаешь разницу между памятью, выделяемой в стеке и памятью выделяемой в секции data, то тебе мой код не нужен. Если не знаешь - тебе и код не поможет.
Номер ответа: 18
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #18
Добавлено: 21.03.05 15:31
Разницу знаю. Потому код и спрашиваю.
Номер ответа: 19
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #19
Добавлено: 21.03.05 16:00
Повторюсь: если знаешь разницу между локальными и глобальными, код не нужен. Если не знаешь - читай пост № 14.
Что касается "бреда" про 0-255:
Набери в VB такой код:
Private Sub command1_Click()
Dim pArr As Long
pArr = GetArrAddr
Call CopyMemory(ByVal VarPtr(tmp(0)), ByVal pArr, ByVal 100)
For i = 0 To 99
tmp(i) = tmp(i) * 2
Debug.Print tmp(i)
Next i
Call CopyMemory(ByVal pArr, ByVal VarPtr(tmp(0)), ByVal 100)
CheckArr ByVal pArr
End Sub
В dll сделай две такие процедуры:
char ForCheck[100];
char ForVB[100];
//===============================================================
char* __declspec(dllexport) __stdcall GetArrAddr(){
char buffer[32];
for (char i=0; i<=99; i++){
ForCheck=ForVB=i;
if (ForCheck != ForVB) MessageBox(NULL,"error","error",0);
}
wsprintf(buffer,"%lu",&ForVB[0]);
MessageBox(NULL,buffer,"Address ForVB",0);
return &ForVB[0];
}
//===============================================================
void __declspec(dllexport) __stdcall CheckArr(char* FromVB){
char buffer[32];
char buffer1[32];
wsprintf(buffer,"%lu",FromVB);
MessageBox(NULL,buffer,"Address FromVB",0);
for (char i=0; i<=100; i++){
if ((2*ForCheck) != FromVB) {
wsprintf(buffer,"Error at FromVB[ %lu ]= %lu",i,FromVB);
MessageBox(NULL,buffer,"error",0);
break;
}
}
}
И посмотри, что из 64 элемента массива char считывается.
А затем измени объявления char и char* на unsigned char и unsigned char* соответственно и посмотришь разницу. Думаю будет понятно, о чем я говорю.
Номер ответа: 20
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #20
Добавлено: 21.03.05 16:20
Не уверен что у меня есть желание проверять подобные банальности. Просто повторюсь - при копировании блоков памяти (через CopyMemory или же иначе) VBшный Byte или Char - одно и то же. Никто не говорит о выполнении над ними каких-то других операций. Вопрос в самом представлении данных.
Номер ответа: 21
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #21
Добавлено: 21.03.05 16:39
Я тоже честно говоря не могу понять разницы между знаковым и беззнаковым байтом. Разве что воспроизводящей звук функции это не всё равно, либо какое то условие проверяет байт на знаковость. Но опять же это в Win32 API вряд ли где происходит, разве что в самом Си.
Номер ответа: 22
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #22
Добавлено: 21.03.05 16:54
Не уверен что у меня есть желание проверять подобные банальности
Если бы подобные банальности были для тебя очевидны, то не цеплялся бы к словам.
CyRax, если выполняется просто копирование, то разницы нет. А если в зависимости от содержимого ячейки выполняются разные действия (например условие if), то разница между представлением char и unsigned char есть.
Номер ответа: 23
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #23
Добавлено: 21.03.05 17:02
Ну так а я про что? Может сработать разве что где то стоит инструкция JS (и то я не знаю всех случаев её срабатывания) . Хотя наверное то что Win32 API не работают со знаковыми байтами я загнул - это я с ними не работаю
Номер ответа: 24
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #24
Добавлено: 21.03.05 17:04
Не, ну вобще да, называть советы товарищей по форуму бредом - это в духе vBSreets. Нам тут такого не нужно.
Номер ответа: 25
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #25
Добавлено: 21.03.05 17:05
если выполняется просто копирование, то разницы нет.
Так а тебе про что говорят? Вопрос про копирование массива байт. При чем тут содержимое ячейки и какие-то действия? Где ты их вообще нашел?
Номер ответа: 26
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #26
Добавлено: 21.03.05 17:08
CyRax, а это я у нашего памятного товарища под ником Nash Bridges научился. Он это слово дюжа любил применять на форуме. Кстати, помнится вы с ним как-то раз интересно побеседовали. Слова бред и ламерство там были основополагающими
Номер ответа: 27
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #27
Добавлено: 21.03.05 17:19
Ну зачем же брать пример с такого неуважаемого человека
Ну да, вспомнил, Nash Bridges - это типа такой крутой чел, который бегал за мной и искал к чему придраться Помню, помню, сначала я пытался с ним по культурно пообщаться, но он похоже был совсем невменяемым. В смысле чувство собственной значимости было явно переоцененно.
Номер ответа: 28
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #28
Добавлено: 21.03.05 17:40
LamerOnLine
Что будет делать Neco с массивом - неизвестно. Поэтому на всякий случай обратил внимание на разницу представления char/unsigned char. Всё. Что тут непонятного?
Или ты знаешь что-то о битовом представлении, чего я не знаю и просвещаешь меня ))
Спасибо за такую заботу о серых и неграмотных
Номер ответа: 29
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #29
Добавлено: 21.03.05 20:33
Млин, я когда почту принимал, удивился: чего это 16 новых сообщений?
А тут оказывается баталии развернулись. 8)
>Neco, я тут нашёл, почему массив искажался
Не ну я бы не сказал, что он у меня искажался - просто слышны были дополнительные нули, которые при маленьком размере буфера (что менимизировать разницу во времени говорящего и слушающего) становились похожими на шагающую роту солдат. 8)
По крайней мере я понял почему при копировании напрямую у меня этих помех не было. Просто я передавал тот же самый массив из входа на выход, не копируя - следовательно тот лишок, который возможно создавался при записи уходил на выход в том же виде и не было незаметно, а при копировании в буфер на его конце появлялся мусор (может VB его обнулял - он любитель это делать).
От unsigned'а ничего не изменилось. Ты конечно правильно сделал, что обратил на это внимание (теперь я знаю разницу между sign'ами и unsig'нами, спасибо), но видимо не мой случай.
В общем, всем спасибо - пойду затачивать.
Номер ответа: 30
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #30
Добавлено: 22.03.05 09:07
и искал к чему придраться
Он и не к тебе одному придирался Было и ко мне пытался