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]
← →
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 переменной, также показанной в примере.
В текущее время, переменные Char идентичны AnsiChar переменным, будучи размером 8 бит.
Char Тип переменной для хранения простого символа
Dec Декремент порядковой переменной
Inc Увеличивает порядковую переменную
PAnsiChar Указатель на значение AnsiChar
PString Указатель на String значение
Я ведь считываю в Buff из файла?
Почему нет? Я ведь считываю в Buff из файла?
Считывать то ты считываешь, но в коде не видать ни одной проверки правильности операции, ошибок и т.д. Код чисто пионэрский. За исключением трех не значищих строчек его нельзя считать правильным и рабочим. Только на везение.