Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.14;
Скачать: CL | DM;

Вниз

как преобразовать PChar в string   Найти похожие ветки 

 
Forever   (2002-10-01 14:37) [0]

Вот такой код:

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, все равно на

memo1.lines.add(buf)

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

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]

Buf[BufSize]:=#0 сделал ?


 
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 Files\Borland\Delphi6\Demos\Internet\Chat



Страницы: 1 вся ветка

Текущий архив: 2002.10.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-45441
Демонов Е.В.
2002-10-03 12:08
2002.10.14
Вопрос О Процессах


14-45512
BigBadMutuh
2002-09-17 16:38
2002.10.14
Вопросы по биологии.


1-45434
zje
2002-10-03 15:04
2002.10.14
Как можно достать все иконы из dll или exe файла?


1-45376
lety
2002-10-04 00:11
2002.10.14
таблица с заголовком в 2 уровня


1-45432
vads
2002-10-03 15:22
2002.10.14
Использую TInplaceEdit для создания своего Grid а