Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

перевести данные из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.045 c
6-1180940537
DVM
2007-06-04 11:02
2008.02.24
Винет поток на функции Socket().


15-1200905088
Washington
2008-01-21 11:44
2008.02.24
WMI SDK


2-1201937189
Urvin
2008-02-02 10:26
2008.02.24
Размер плюсиков в TTreeView


8-1174828087
KOSik
2007-03-25 17:08
2008.02.24
Скругление угла


15-1200454736
ply
2008-01-16 06:38
2008.02.24
MySQL компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский