Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

перевести данные из pChar в array of Byte   Найти похожие ветки 

 
noi   (2008-01-28 21:48) [0]

собственно сабж.
делал так:
var
pCharBuf : pChar;
BufByte : array of Byte;
begin
BufByte := @pCharBuf;

получаю пустой буффер.
научите как правильно. мастера. спс.


 
homm ©   (2008-01-28 21:53) [1]

> [0] noi   (28.01.08 21:48)
> BufByte : array of Byte;

Типа так может быть?
BufByte : ^array of Byte;


 
DVM ©   (2008-01-28 21:54) [2]

Память под массив пушкин выделать будет?


 
Германн ©   (2008-01-28 21:57) [3]


> DVM ©   (28.01.08 21:54) [2]

Дык кто ж ему выделит память в том месте, которое уже занято PChar"ом?


 
DVM ©   (2008-01-28 21:59) [4]


> Германн ©   (28.01.08 21:57) [3]

в его коде еще и под pCharBuf не выделил никто


 
DVM ©   (2008-01-28 22:04) [5]

var
 pCharBuf: pChar;
 BufByte: array of Byte;
begin
 PCharBuf := "Delphi";
 SetLength(BufByte, StrLen(PCharBuf));
 CopyMemory(BufByte, pCharBuf, StrLen(PCharBuf));


 
homm ©   (2008-01-28 22:07) [6]

> [5] DVM ©   (28.01.08 22:04)

Не надо никакого CopyMemory, pChar это и так array of Byte.


 
DVM ©   (2008-01-28 22:10) [7]


> homm ©   (28.01.08 22:07) [6]

Да кто его поймет, что ему надо. Он две переменных разного типа завел, ни под одну память не выделил и ничего в них не клал. Причем удивляется что там пусто.


 
noi   (2008-01-28 22:13) [8]

ммм. я наверно вёл вас в заблуждение. дело обстоит так.

function Con(pCharBuf: pChar; pCharBufSize): Integer;
var
  BufByte : array of Byte;
begin
  SetLength(NewBuf, pCharBufSize);
  BufByte := @pCharBuf;
  ....
end;

функция вызывается с заполненным pCharBuf. pCharBufSize - размер массива.
буфер переноситься, но данные какие то не такие получаются в BufByte. )


 
DVM ©   (2008-01-28 22:16) [9]


> noi   (28.01.08 22:13) [8]


> SetLength(NewBuf, pCharBufSize);

Эта строка вообще к чему тут?


 
noi   (2008-01-28 22:17) [10]

поправка

function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;


 
noi   (2008-01-28 22:18) [11]

разволновался. простите)

function Con(pCharBuf: pChar; pCharBufSize: Integer): Integer;
var
 BufByte : array of Byte;
begin
 SetLength(BufByte, pCharBufSize);
 BufByte := @pCharBuf;
 ....
end;


 
homm ©   (2008-01-28 22:20) [12]

> [11] noi   (28.01.08 22:18)
> SetLength(BufByte, pCharBufSize);
> BufByte := @pCharBuf;

Т.е. ты выделяеш память и кидаеш единственный указывающий на нее указатель? Похвально.


 
DVM ©   (2008-01-28 22:25) [13]


> noi   (28.01.08 22:18) [11]

Если тебе нужна копия данных в массиве - то делай CopyMemory. Если нет, то я вообще не вижу смысла в этом массиве. Что ты дальше с ним делать будешь?


 
noi   (2008-01-28 22:31) [14]


> Если тебе нужна копия данных в массиве - то делай CopyMemory.

вот оно)). теперь все отлично. данные те что и ожидались. спасибо. извините если заморочил голову.


 
_Mike_   (2008-01-28 22:35) [15]


> 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 отсутствует


 
DVM ©   (2008-01-28 22:41) [16]


> Эмулировать арифметику указателей

это догадки

> которая напроч в Delphi отсутствует

и слава богу


 
Семеныч   (2008-01-28 23:01) [17]

> _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;


 
Семеныч   (2008-01-28 23:08) [18]

> _Mike_   (28.01.08 22:35) [15]
> арифметику указателей, которая напроч в Delphi отсутствует

Она отсутствует для тех, кто указателей Delphi не знает и не понимает (но почему-то считает для себя возможным рассуждать о том, чего не знает и не понимает). Для остальных же Delphi предоставляет полную свободу в работе с указателями. Хоть арифметику, хоть алгебру. Точно так же, как это делает Си.


 
Германн ©   (2008-01-29 00:57) [19]


> 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-29 01:03) [20]

> Германн ©   (29.01.08 00:57) [19]

Будет утечка памяти, AV или все вместе. У тех, для кого в Delphi нет адресной арифметики.
:o)


 
Джо ©   (2008-01-29 01:10) [21]

Мде...Ребята, вспомните все-же название конференции и проверяйте сами то, что советуете...


 
Семеныч   (2008-01-29 01:19) [22]

Кстати, в [17] я тоже по невнимательности накосячил, когда в комментарии написал: "Адрес, записанный в BufByte хоть и указывает на правильные данные..."

Не указывает он на правильные данные. Он указывал бы на правильные данные, если бы было написано так: BufByte := pCharBuf.

А там написано BufByte := @pCharBuf. После чего BufByte содержит не адрес правильных данных, а адрес АДРЕСА правильных данных.

В общем, хороший совет человеку дали, что и говорить...


 
Германн ©   (2008-01-29 01:24) [23]


> Семеныч   (29.01.08 01:03) [20]


> У тех, для кого в Delphi нет адресной арифметики.

Не только. Адресная арифметика была и в ТП. И похоже многих ныне учат чему-нибудь и как-нибудь именно на ТП. А потом эти многие берут Делфи и тупо переносят старые методы на новую реальность. Ведь написавший сабж знает символ @. Т.е. не совсем чайник.
Ведь в ТП вполне бы было нормально следущее:
var
pCharBuf : pChar;
BufByte : ^array[0..65535] of Byte;
begin
BufByte := @pCharBuf;


 
Семеныч   (2008-01-29 01:29) [24]

> Германн ©   (29.01.08 01:24) [23]

Только собачку надо бы все же убрать. А то косвенная адресация получается.
:о)


 
Германн ©   (2008-01-29 02:01) [25]


> Семеныч   (29.01.08 01:29) [24]

Типичная ошибка Копи-пасты. Прими мои извинения.

P.S.
Очень много дел надо сделать до 14:27 29.01.08. Уезжаю в Халтуркомандировку. :)


 
Джо ©   (2008-01-29 02:12) [26]

> [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:13) [27]

> BufByte: PArray absolute pCharBuf;

Конечно,
BufByte: PBufByte absolute pCharBuf


 
Германн ©   (2008-01-29 02:59) [28]


> Джо ©   (29.01.08 02:12) [26]


> Джо ©   (29.01.08 02:13) [27]

Ес-сно.
И директивой absolute я пользовался всегда. И сейчас достаточно часто пользуюсь.
Но ведь если абстрагироваться от данного случая, где обе переменные объявлены в одном блоке, то как?



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
2-1201612458
Sonia
2008-01-29 16:14
2008.02.24
Вызов процедуры


6-1181070583
Samael6
2007-06-05 23:09
2008.02.24
Скорость приема писем в Indy 9


2-1201510223
AndrewK
2008-01-28 11:50
2008.02.24
Как раскрасить заголовок в DBGridEh


2-1201780574
mikola
2008-01-31 14:56
2008.02.24
коментарий к картинке


2-1201507003
sergeii
2008-01-28 10:56
2008.02.24
Подсчёт разницы дат