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

Вниз

как преобразовать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
1-45369
Deke
2002-10-05 17:14
2002.10.14
Работа с DLL в Delphi. Помогите С-программеру.


1-45452
icar
2002-10-03 20:35
2002.10.14
тип pchar


14-45571
Ketmar
2002-09-18 14:19
2002.10.14
господа, а как зовут книжечку, по мотивам которой Half-Life...


14-45584
Alx2
2002-09-20 10:22
2002.10.14
ОСКОЛКИ РАЗБИТОГО ВДРЕБЕЗГИ


14-45541
Undert
2002-09-19 23:12
2002.10.14
Midi Музыка с любимых открыток





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский