Меню Закрыть

Delphi pchar to string

var buf:Pchar;
bufsize:integer;
BEGIN
GetMem(Buf,BufSize+1);
socket.ReceiveBuf(Buf^,BufSize);
memo1.lines.add(String(buf)); <ПРОГРАММА ВЫПОЛНИЛА НЕДОПУСТИМУЮ ОПЕРАЦИЮ>
END;

Почему ошибка ? И как преобразовать PChar в string ?


MBo ( 2002-10-01 14:39 ) [1]

ээээ.
в первой строке чему равен BufSize.

а третью можно и так (по желанию)
memo1.lines.add(buf);


Polevi ( 2002-10-01 14:48 ) [2]

BufSize:=socket.ReceiveLength;
GetMem(Buf,BufSize+1);
BufSize:=socket.ReceiveBuf(Buf^,BufSize);
Buf[BufSize]:=#0
memo1.lines.add(buf)


Forever ( 2002-10-01 17:31 ) [3]

Polevi, все равно на

программа выполняет недопустимую операцию.

MBo, BufSize равен 959

Видимо, глюк из-за того, что хранятся какие-то недопустимые символы в PChar"е. Потому что:

var s:string
.
s:=String(Buf);

тоже вызывает ошибку.

Прям не знаю что делать. Может у кого есть какие соображения ?


MBo ( 2002-10-01 17:34 ) [4]

В первой строке подпрограммы локальная переменная BufSize содержит мусор. Сначала инициализируй ее, как написал Polevi


Smithson ( 2002-10-01 17:34 ) [5]

приведение PChar -> String Delphi выполняет автоматически, при простом присваивании. Где-то ошибка в другом месте


AlexT1000 ( 2002-10-01 17:50 ) [6]

PC : PChar
s :string;
S := StrPas(PC);


han_malign ( 2002-10-01 17:58 ) [7]

вопервых String это тот же PChar, только преред блоком памяти на который указывает pointer(String) выделены еще 4 байта — длина("string[0]"), которые при прямом преобразовании s:=String(PChar)посредством " compiler magic(system.pas)" копируются из чужой области памяти (которая перед PChar),
во вторых единственный "недопустимый"(при преобразовании) символ в PChar это #0, поскольку он является терминирующим.


Игорь Шевченко ( 2002-10-01 18:00 ) [8]

В-третьих, обычно при таких проблемах очень хорошо помогает отладчик, а не форум.


Forever ( 2002-10-01 18:08 ) [9]

MBo, я ее, конечно, инициализировал первой строчкой как у Polevi, просто не перенес сюда.


Polevi ( 2002-10-01 18:27 ) [10]

Читайте также:  Deepcool atx tesseract bf


Forever ( 2002-10-01 18:46 ) [11]

Polevi, да. Тоже самое.


TTCustomDelphiMaster ( 2002-10-01 19:07 ) [12]

Посмотрите как реализовано это

function TCustomWinSocket.ReceiveText: string;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;


Forever ( 2002-10-02 00:26 ) [13]

Хотелось бы уточнить некоторые подробности.

Я вот хочу дописать в PChar какую-нибудь информацию.
P1 — куда хочу дописать, P2 — то, что хочу дописать.
Будем считать, что P1size — размер P1, P2size — размер P2.
То есть, было сделано GetMem(P1,P1size) и GetMem(P2,P2size);

GetMem(Dop,P1size);
Dop:=StrCopy(Dop,P1);
FreeMem(P1,P1size);
GetMem(P1,P1size+P2size);
P1size:=P1size+P2size;
P1:=strcat(dop,P2);
FreeMem(Dop);

То есть, пришлось прибегнуть к дополнительнйо переменной Dop типа PChar. Так как для прибавления к P1 чего-либо нужно увеличить размер этого самого P1, то я сначала делаю FreeMem, а потом GetMem уже с нужным количеством памяти, сохраняя прежний результат в dop.
Если что неправильно или кто знает способы получше — укажите, пожалуйста.


Forever ( 2002-10-02 19:46 ) [14]

Пожалуйста, постарайтесь вникнуть в пример. Скажите что-нибудь


Shrek ( 2002-10-02 21:02 ) [15]

да не надо здесь никакого переделывания строки.
в сокетах главное это правильно сщитать отправленое:

прим. прямо из работаещего кода:
отправка
ClientSocket1.Socket.SendBuf(Run, SizeOf(Run));
прийом
Socket.ReceiveBuf(buf, SizeOf(buf));

может быть реально ошыбка здесь: socket.ReceiveBuf(Buf^,BufSize);


Shrek ( 2002-10-02 21:07 ) [16]

дополнение
buf : array[1..200] of string[250];
Run : array[1..200] of string[250];

посмотри здесь, хорошый пример:
Program FilesBorlandDelphi6DemosInternetChat

Он может также использоваться для указания на символы в пределах строки, как в коде примера.

Как и с другими указателями, целочисленная арифметика, такая как Inc и Dec, может быть выполнена с PChar переменной, также показанной в примере.

Примечания PChar используется преимущественно при обработке строк закончиваемых пустым указателем.
Читайте также:  Скайрим обмен душ драконов на перки

В текущее время, переменные Char идентичны AnsiChar переменным, будучи размером 8 бит.

Похожие команды
$ExtendedSyntax Контроль обработки некоторых расширений Паскаля

Char Тип переменной для хранения простого символа

Dec Декремент порядковой переменной

Inc Увеличивает порядковую переменную

PAnsiChar Указатель на значение AnsiChar

PString Указатель на String значение

Я ведь считываю в Buff из файла?

Почему нет? Я ведь считываю в Buff из файла?

Считывать то ты считываешь, но в коде не видать ни одной проверки правильности операции, ошибок и т.д. Код чисто пионэрский. За исключением трех не значищих строчек его нельзя считать правильным и рабочим. Только на везение.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.