Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

перевести данные из pChar в array of Byte [D6, XP, 2003]


Страницы:   1 2

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо