
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Сообщ.
#1
,
|
|
|
шото ваще нипойму
после этой операции ![]() ![]() copyMemory(@cmd[5], @buf[0], ALength); обнуляется исходный буфер почему? Добавлено ![]() ![]() cmd, @buf: array ob byte |
Сообщ.
#2
,
|
|
|
А что у тебя является исходным ?
PS: На вский случай - СopyMemory(@cmd[5], @buf[0], ALength) в (не)лучших традициях Си копирует buf[0] в cmd[5], а не наоборот |
Сообщ.
#3
,
|
|
|
Цитата leo @ А что у тебя является исходным ? PS: На вский случай - СopyMemory(@cmd[5], @buf[0], ALength) в (не)лучших традициях Си копирует buf[0] в cmd[5], а не наоборот в этой ветке если не ошибаюсь говорят про винАпи. а вин апи говорит следующее Цитата The CopyMemory function copies a block of memory from one location to another. VOID CopyMemory ( PVOID Destination, // address of copy destination CONST VOID *Source, // address of block to copy DWORD Length // size, in bytes, of block to copy ); Parameters Destination Points to the starting address of the copied block's destination. Source Points to the starting address of the block of memory to copy. Length Specifies the size, in bytes, of the block of memory to copy. Return Values This function has no return value. Remarks If the source and destination blocks overlap, the results are undefined. For overlapped blocks, use the MoveMemory function. Добавлено проверил такая же бага проявляется при ипользовании сего: ![]() ![]() procedure TSmartCard.copyBuf(const src: array of byte; var dst: array of byte; s_count: word; s_from: word = 0; d_start: word = 0); var i: word; begin for i := 0 + s_from to s_count do dst[i + d_start] := src[i]; end; решается только заменой ![]() ![]() array of byte ![]() ![]() array[0..X] of byte и всё же непойму... кто-нить может дать толковый ответ? |
Сообщ.
#4
,
|
|
|
Цитата subdigger @ кто-нить может дать толковый ответ? Желательно задать толковый вопрос для начала. Покажи, как определены cmd и buf, в какой секции модуля. |
Сообщ.
#5
,
|
|
|
Цитата subdigger @ в этой ветке если не ошибаюсь говорят про винАпи. а вин апи говорит следующее Во-первых, я сказал то же самое, т.е. первый параметр - "куда копируем", второй - "откуда". Во-вторых, причем тут апи, если есть старая добрая дельфийская Move ![]() В-третьих, не забываем выделять память под дин.массив через SetLength ![]() ![]() procedure TForm1.Button1Click(Sender:TObject); var source,dest:array of byte; s:string; Alength:integer; begin s:='Hello, world!'; ALength:=Length(s)+1; SetLength(source,ALength); //!!! не забываем выделить память Move(s[1],source[0],ALength); //копируем через Move SetLength(dest,ALength); CopyMemory(@dest[0],@source[0],ALength); //копируем через CopyMemory ShowMessage('source = '+pChar(source)+#13#10+ 'dest = '+pChar(dest)); end; |
Сообщ.
#6
,
|
|
|
Цитата Демо Желательно задать толковый вопрос для начала. ![]() ![]() type TCmd = array[0..260] of byte; .... procedure TMyClass.WriteFile(buf: array of byte; cnt: word); var cmd: TCmd; AStart, ALength, t, d : word; begin ZeroMemory(@cmd, 256); ALength := cnt; copyMemory(@cmd[5], @buf[0], ALength); { тут: cmd - с 5-го символа - данные из buf buf - () или nil - тоесть дальнейшее оперирование с ним приводит к аксесс виолатион Alength - 0 - опять таки непойму каким образом } end; использование вместо copyMemory своей процедуры: ![]() ![]() procedure TSmartCard.copyBuf(const src: array of byte; var dst: array of byte; s_count: word; s_from: word = 0; d_start: word = 0); var i: word; begin for i := 0 + s_from to s_count do dst[i + d_start] := src[i]; end; приводит к такому же результату Цитата leo Во-вторых, причем тут апи, если есть старая добрая дельфийская Move не занаю как у вас а у мну ![]() ![]() unit Windows; ...... procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD); begin Move(Source^, Destination^, Length); end; procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD); begin Move(Source^, Destination^, Length); end; посему шо мув шо копи - это грубо говоря одно и то же. хотя на счёт апей таки наверно я ошибся Цитата leo В-третьих, не забываем выделять память под дин.массив через SetLength исходник заведомо непустой (считай, что выделил) а приёмник заведомо статической длины |