Форум: "Начинающим";
Текущий архив: 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