Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Опять указатели и CopyMemory Добавлено: 20.03.05 19:22  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 

Ответить

  Ответы Всего ответов: 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 такой код:

Dim tmp(0 To 99) As Byte
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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #23
Добавлено: 21.03.05 17:02
Ну так а я про что? Может сработать разве что где то стоит инструкция JS (и то я не знаю всех случаев её срабатывания) :). Хотя наверное то что Win32 API не работают со знаковыми байтами я загнул - это я с ними не работаю :)

Ответить

Номер ответа: 24
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #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
Nash Bridges - это типа такой крутой чел, который бегал за мной
и искал к чему придраться :)

Он и не к тебе одному придирался :) Было и ко мне пытался ;)

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам