![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перевести данные из pChar в array of Byte [D6, XP, 2003]
noi © (2008-01-28 21:48:00)собственно сабж.
делал так:
var
pCharBuf : pChar;
BufByte : array of Byte;
begin
BufByte := @pCharBuf;
получаю пустой буффер.
научите как правильно. мастера. спс.
Германн (2008-01-29 02:59:00) [1]
> Джо © (29.01.08 02:12) [26]
> Джо © (29.01.08 02:13) [27]
Ес-сно.
И директивой absolute я пользовался всегда. И сейчас достаточно часто пользуюсь.
Но ведь если абстрагироваться от данного случая, где обе переменные объявлены в одном блоке, то как?
Джо (2008-01-29 02:13:00) [2]> BufByte: PArray absolute pCharBuf;
Конечно,
BufByte: PBufByteabsolute pCharBuf
Джо (2008-01-29 02:12:00) [3]> [23] Германн © (29.01.08 01:24)
>
> > Семеныч (29.01.08 01:03) [20]
>
>
> > У тех, для кого в Delphi нет адресной арифметики.
>
> Не только. Адресная арифметика была и в ТП. И похоже многих
> ныне учат чему-нибудь и как-нибудь именно на ТП. А потом
> эти многие берут Делфи и тупо переносят старые методы на
> новую реальность. Ведь написавший сабж знает символ @. Т.е.
> не совсем чайник.
> Ведь в ТП вполне бы было нормально следущее:
> var
> pCharBuf : pChar;
> BufByte : ^array[0..65535] of Byte;
> begin
> BufByte := @pCharBuf;
В TP достаточно было сделать так:
type
TBufByte = array [0..65535] of Byte;
PBufByte = ^TBuffArray;
var
pCharBuf: PChar;
BufByte: PArray absolute pCharBuf;
И присваивание было бы уже ненужным :)
Германн (2008-01-29 02:01:00) [4]
> Семеныч (29.01.08 01:29) [24]
Типичная ошибка Копи-пасты. Прими мои извинения.
P.S.
Очень много дел надо сделать до 14:27 29.01.08. Уезжаю в Халтуркомандировку. :)
Семеныч (2008-01-29 01:29:00) [5]> Германн © (29.01.08 01:24) [23]
Только собачку надо бы все же убрать. А то косвенная адресация получается.
:о)
Германн (2008-01-29 01:24:00) [6]
> Семеныч (29.01.08 01:03) [20]
> У тех, для кого в Delphi нет адресной арифметики.
Не только. Адресная арифметика была и в ТП. И похоже многих ныне учат чему-нибудь и как-нибудь именно на ТП. А потом эти многие берут Делфи и тупо переносят старые методы на новую реальность. Ведь написавший сабж знает символ @. Т.е. не совсем чайник.
Ведь в ТП вполне бы было нормально следущее:
var
pCharBuf : pChar;
BufByte : ^array[0..65535] of Byte;
begin
BufByte := @pCharBuf;
Семеныч (2008-01-29 01:19:00) [7]Кстати, в [17] я тоже по невнимательности накосячил, когда в комментарии написал: "Адрес, записанный в BufByte хоть и указывает на правильные данные..."
Не указывает он на правильные данные. Он указывал бы на правильные данные, если бы было написано так: BufByte := pCharBuf.
А там написано BufByte := @pCharBuf. После чего BufByte содержит не адрес правильных данных, а адрес АДРЕСА правильных данных.
В общем, хороший совет человеку дали, что и говорить...
Джо (2008-01-29 01:10:00) [8]Мде...Ребята, вспомните все-же название конференции и проверяйте сами то, что советуете...
Семеныч (2008-01-29 01:03:00) [9]> Германн © (29.01.08 00:57) [19]
Будет утечка памяти, AV или все вместе. У тех, для кого в Delphi нет адресной арифметики.
:o)
Германн (2008-01-29 00:57:00) [10]
> homm © (28.01.08 22:07) [6]
>
> > [5] DVM © (28.01.08 22:04)
>
> Не надо никакого CopyMemory, pChar это и так array of Byte.
>
>
Только хотел было ответить, но
> Семеныч (28.01.08 23:01) [17]
уже оказывается уже высказался по поводу особенностей указателей на динамические массивы. Страшно подумать что в случае
> BufByte := @pCharBuf;
будет.
Семеныч (2008-01-28 23:08:00) [11]> _Mike_ (28.01.08 22:35) [15]
> арифметику указателей, которая напроч в Delphi отсутствует
Она отсутствует для тех, кто указателей Delphi не знает и не понимает (но почему-то считает для себя возможным рассуждать о том, чего не знает и не понимает). Для остальных же Delphi предоставляет полную свободу в работе с указателями. Хоть арифметику, хоть алгебру. Точно так же, как это делает Си.
Семеныч (2008-01-28 23:01:00) [12]> _Mike_ (28.01.08 22:35) [15]
function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
type
TByteArray = array of Byte;
var
BufByte: TByteArray;
begin
BufByte := TByteArray(pCharBuf);
....
end;
А кто же будет заполнять длину и счетчик ссылок. Динамический массив - это ведь не просто указатель, а указатель на определенную структуру.
> noi (28.01.08 22:18) [11]
Давайте посмотрим, что происходит без CopyMem:
function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
var
BufByte : array of Byte; // BufByte - уже указатель.
begin
SetLength(BufByte, pCharBufSize);
// Теперь память под массив выделена, в BufByte записан ее адрес. Все ОК.
BufByte := @pCharBuf;
// Теперь BufByte получил новое значение, а старое пропало. Выделенная
// под массив память "повисла" (утечка памяти). Адрес, записанный в
// BufByte хоть и указывает на правильные данные, но по сути все равно
// неверен, потому что динамическим массивом не является.
....
end;
DVM (2008-01-28 22:41:00) [13]
> Эмулировать арифметику указателей
это догадки
> которая напроч в Delphi отсутствует
и слава богу
_Mike_ (2008-01-28 22:35:00) [14]
> function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
>
> var
> BufByte : array of Byte;
> begin
> SetLength(BufByte, pCharBufSize);
> BufByte := @pCharBuf;
> ....
> end;
function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
type
TByteArray = array of Byte;
var
BufByte: TByteArray;
begin
BufByte := TByteArray(pCharBuf);
....
end;
> Что ты дальше с ним делать будешь?
Эмулировать арифметику указателей, которая напроч в Delphi отсутствует
noi (2008-01-28 22:31:00) [15]
> Если тебе нужна копия данных в массиве - то делай CopyMemory.
вот оно)). теперь все отлично. данные те что и ожидались. спасибо. извините если заморочил голову.
DVM (2008-01-28 22:25:00) [16]
> noi (28.01.08 22:18) [11]
Если тебе нужна копия данных в массиве - то делай CopyMemory. Если нет, то я вообще не вижу смысла в этом массиве. Что ты дальше с ним делать будешь?
homm (2008-01-28 22:20:00) [17]> [11] noi (28.01.08 22:18)
> SetLength(BufByte, pCharBufSize);
> BufByte := @pCharBuf;
Т.е. ты выделяеш память и кидаеш единственный указывающий на нее указатель? Похвально.
noi (2008-01-28 22:18:00) [18]разволновался. простите)
function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
var
BufByte : array of Byte;
begin
SetLength(BufByte, pCharBufSize);
BufByte := @pCharBuf;
....
end;
noi (2008-01-28 22:17:00) [19]поправка
function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
DVM (2008-01-28 22:16:00) [20]
> noi (28.01.08 22:13) [8]
> SetLength(NewBuf, pCharBufSize);
Эта строка вообще к чему тут?