Как элементарно обработать 1 гиг?

Тема в разделе "WASM.A&O", создана пользователем kibernetics, 3 май 2006.

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    kibernetics

    > "мне нравится в бейсике простоту реализации кода"

    Ну положим бэйсик не проще паскаля (Delphi), а вот "подебильнее" и потормознее это точно ;))

    (этот бэсик меня просто бе-е-сит :))



    > "вот если бы научится использовать апи функции в том же басике"

    Дык, учись :))

    Во-первых, ты не на тот форум забрался - лучше бы погуглил и нашел братьев по разуму (или по несчастью :). Наверняка есть готовые API-шные либы (tlb) для васика или модули импорта API-функций

    Во-вторых, для конкретной задачки и самому ничего не стоит объявить несколько функций API. Берешь объявление функции из MSDN, вставляешь в свой проект и "разукрашиваешь" в соответствии с "васькиными" требованиями. Например импорт ReadFile будет выглядеть так:
    Код (Text):
    1. Declare Function ReadFile Lib "kernel32.dll" ( _
    2.   ByVal hFile as Long, _
    3.   ByVal lpBuffer as Long, _
    4.   ByVal nNumberOfBytesToRead as Long, _
    5.   ByRef nNumberOfBytesRead as Long, _
    6.   ByVal lpOverlaped as Long) as boolean
    Все In-параметры, включая указатели и строки передаются по значению (ByVal)

    Out-параметры (кроме строк) - по ссылке ByRef. В данном случае в API должен передаваться указатель lpNumberOfBytesRead на dword, в который будет записано число прочитанных байт, поэтому мы просто объявлем его ByRef

    Ну и т.д. и т.п.
     
  2. ash

    ash New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2004
    Сообщения:
    52
    Адрес:
    Latvia
    kibernetics



    Да, если переход -- на Lisp.



    В случае перехода на pascal/delphi получишь только позитивные ощущения. Переход на C сравним с переходом на ASM.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Приступ тошноты - это что, позитивное ощущение?
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Идем в Add-In Manager

    Включаем VB 6 API Viewer

    все объявления для Win API берем из него,

    для этого собственно и предназначен :derisive:
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    cresta

    Тут вроде речь идет не об освоении VCL, а об языке программирования, так что не понятно от чего должна быть тошнота. Вот когда я рассматриваю некоторые сорцы на Си++, чувствую легкое головокружение:

    <font size=1>
    Код (Text):
    1.  
    2.         ios_base::iostate _State = ios_base::goodbit;
    3.         const sentry _Ok(*this);
    4.  
    5.         if (_Ok)
    6.             {   // state okay, use facet to insert
    7.             const _Nput& _Nput_fac = _USE(ios_base::getloc(), _Nput);
    8.             ios_base::fmtflags _Bfl =
    9.                 ios_base::flags() & ios_base::basefield;
    10.             long _Tmp = (_Bfl == ios_base::oct
    11.                 || _Bfl == ios_base::hex)
    12.                 ? (long)(unsigned int)_Val : (long)_Val;
    13.  
    14.             _TRY_IO_BEGIN
    15.             if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
    16.                 _Myios::fill(), _Tmp).failed())
    17.                 _State |= ios_base::badbit;
    18.             _CATCH_IO_END
    19.             }
    20.  
    </font><!--size-->



    А сколько замечательных граблей ждет новичка, при освоении оператора ==...

    Впрочем подобные разговоры, опять приведут к холивару и кучи флейма, так что возвращаться к нему больше не буду.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta, alpet

    Вот уж действительно незачем в очередной раз затевать бессмысленную дискуссию Pascal vs C++

    А "позитивные ощущения" нужно понимать не вообще, а с точки зрения перехода с васика на паскаль, т.к. с точки зрения синтаксиса у них больше сходства, чем различий (чего не скажешь о С++)



    Asterix

    Видать ты знаком с этим чудо языком :)

    Может подскажешь автору топика и мне заодно - есть ли в васике приведение типов и работа с указателями. В частности: допустим используя API выделили блок памяти и прочитали в него кусок файла - как теперь на васике обратится к первому байту или дворду блока ?
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    leo





    только на уровне минимальной программы, причем

    подглядывая в доку :derisive:



    Есть такая книжка(в сети точно есть в doc формате):

    Евангелос Петрусос

    Visual Basic 6

    Руководство разработчика

    Перевод с английского под редакцией Ю.М. Зорина

    Том 2




    в ней немного про работу с Win API в VB 6

    один из подразделов называется

    • Передача аргументов по значению и по ссылке



    копипастить не решился
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Да есть полно примеров работы с файлами на VB, стандартно примерно так:
    Код (Text):
    1. Dim buf() As Byte
    2. Open  filename For Binary
    3.       Put #filename,,buf
    4. Close filename
    Или через API:
    Код (Text):
    1. ReadFile hFile, buf, 100, dwBytesRead, ByVal 0&
    К первому байту обратится через buf(0), но точый код я уже сам не напишу, несколько лет VB не запускал
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix, bogrus

    С передачей аргументов и обращением к "родному" массиву и так ясно - в любом хэлпе к VBA MS Office расписано, да и в MSDN кое что есть. Мне интересно (для общего развития ;)как обращаться к динамическому блоку памяти, например:
    Код (Text):
    1. Dim pMem as long,...
    2. pMem = MapViewOfFile(...)
    и как теперь с этим pMem работать ?

    Хотя возможно kibernetics знает, но молчит :)
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Почти для всех API-функций необходимо передавать параметры по значению.

    Только те параметры, которые изменяются самой функцией, необходимо

    передавать по ссылке. По умолчанию, Visual Basic передает аргументы

    по ссылке, поэтому для передачи аргументов по значению необходимо

    использовать ключевое слово ByVal.
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    с указателями просто так не работается.

    надо копировать (RtlMoveMemory) в промежуточную переменную (буфер), и работать с буфером. Затем обратно буфер копировать на место

    Примерно так:
    Код (Text):
    1. Dim buffer(1023) As Byte
    2. RtlMoveMemory buffer(0), pMem+offset, LenB(buffer)
    3. ;тут что-нибудь сделали с буфером
    4. ;и затем копируем на место
    5. RtlMoveMemory pMem+offset ,buffer(0), LenB(buffer)




    Таким же образом работается и с указателями, передаваемыми например в WndProc как lParam. Копия в соотвествующего типа локальную переменную, обработка переменной, и при необходимости копия обратно по адресу в lParam.
     
  12. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Это почему-это?
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Вот вариант попроще:
    Код (Text):
    1. Declare Function RtlMoveMemory Lib "kernel32.dll" ( _
    2.   Destination() As Byte, _
    3.   Source As Long, _
    4.   ByVal Length As Long) As Long
    5. Declare Function LocalAlloc Lib "kernel32.dll" ( _
    6.   ByVal uFlags As Long, _
    7.   ByVal uBytes As Long) As Long
    8. Declare Function LocalFree Lib "kernel32.dll" ( _
    9.   ByVal hMem As Long) As Long
    10.  
    11. Private var_ptr(6) As Long
    12.  
    13. Sub Main()
    14. Dim pMem, i As Long
    15. Dim Array1() As Byte
    16.  
    17.     pMem = LocalAlloc(0, 8)
    18.     Call Bind(Array1, pMem)
    19.     ' Работаем с pMem через Array1
    20.     Array1(5) = 10
    21.     Call Unbind(Array1)
    22.     LocalFree (pMem)
    23.  
    24. End Sub
    25.  
    26. Sub Bind(Some_Array() As Byte, ByVal hMem As Long)
    27. Dim i As Long
    28.  
    29.     i = VarPtr(var_ptr(0))
    30.     var_ptr(3) = hMem
    31.     Call RtlMoveMemory(Some_Array, i, 4)
    32.  
    33. End Sub
    34.  
    35. Sub Unbind(Some_Array() As Byte)
    36. Dim i As Long
    37.  
    38.     i = 0
    39.     Call RtlMoveMemory(Some_Array, i, 4)
    40.    
    41. End Sub


    Достаточно вызвать функцию Bind чтобы превратить укзатель типа Long в динамический массив. Unbind желательно вызывать перед освобождением динамического массива.



    ЗЫ: Я тут LocalAlloc вместо MMF использую, чтоб кода было меньше.

    ЗЫЫ: В .Net это работать не будет.

    ЗЫЫЫ: Вот ещё статья в тему про указатели в VB и почему с ними "трудно" работать.
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Смотришь - все тут гуры визуального бейсика, а до сих пор шифровались конкретно :)))
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    Идея понятна, вот только реализацию ты привел чересчур упрощенную ;)

    При обращении к массиву VB проверяет попадание индекса в допустимый диапазон, поэтому кроме указателя на память нужно еще устанавливать число элементов массива SAFEARRAY.rgsabound[0].cElements - в твоем варианте var_ptr(4).

    Ну и разумеется если использовать такой подход "всерьез и надолго", то конечно нужны доп.навороты - проверка переданного указателя, замена глобальной переменной var_ptr на динамическую и т.п.



    PS: набрел на пару ссылочек: Сущность массивов в VB, Variant и SafeArray

    PSS: Мы тут понимаешь рассуждаем ради спортивного интереса, а куда интересно kibernetics пропал ? Не иначе как последовал доброму совету и увяз в непролазных дебрях С++ ? :))))
     
  16. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    leo

    нет. я незнаю. сам пытаюсь вывести пацанов, чтоб рассказали. кто-то пробовал файл-маппинг. в басике непонятно как использовать указатели.
     
  17. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    kibernetics

    > "задал вопрос по васику здесь ..."

    Насколько я понимаю, первый вопрос по обработке файла решен и значит отпадает



    > "в басике непонятно как использовать указатели"

    В первом приближении уже понятно ;)

    Если начнешь разбираться сам и задавать конкретные вопросы, то может что-то сдвинется с места. Под лежачий камень вода не течет :))
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo

    Кажется, в .Net уже убрали поддержку VarPtr. Так что использовать "такой подход всерьез и надолго" уже не получится. Да и работает он по понятным причинам только в скомпилированном экзешнике.





    Да, надо было глубже трассировать. Виноват.



    kibernetics

    Не помню всплывал такой совет уже или нет... Можно сделать обработку файлов на C/Delphi/asm/etc, скомпилировать в DLL и потом использовать эту DLL в приложении на VB. Лёгкое надругательство над линкером VB позволяет использовать даже статические либы.
     
  20. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Еще здесь надо использовать MMX/SSE для повышения быстродействия, да так и удобней копировать данные размером 512 байт.