Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

очищение памяти, занимаемой переменной String


Alral ©   (2009-03-17 21:50:00) 

Здравствуйте.
У меня следующая проблема: переменной String задаётся определённая длина с помощью SetLength (переменная используется в качестве буфера для функции Recv). После обработки данных, попавших в неё, переменная очищается для приёма следующих данных, и процесс повторяется. Проблема заключается в том, что данные, хранившиеся в переменной, удаляются из самой переменной, но в последствии при установке длины этой переменной эти данные "всплывают" в переменной опять. Как можно нормально удалить данные из переменной, не прибегая к посимвольному удалению в цикле?
Спасибо.


Германн   (2009-03-18 00:21:00) [1]


> Eraser ©   (17.03.09 22:24) [10]
>
> > [8] Alral ©   (17.03.09 22:10)
>
> вообще данные хранить в строках - не очень удачная мысль.
>  например, при переходе на Д2009 могут быть проблемы, прийедтся
> переписывать, т.к. length для строки будет возвращать не
> количество байт, а количество символов.

Даже для AnsiString?

А в целом, мне лично, очень часто было удобно в качестве буферов приёмника/передатчика именно строки (и короткие и длинные).


Медвежонок Пятачок   (2009-03-17 22:59:00) [2]

проблема конечно не в двоичке внутри строки.
если сделать зеромемори перед реисппользованием, то strpas вернет то что надо и без сетленса.
ну или что-то вместо стрпас если там не анси строка.


Jeer   (2009-03-17 22:53:00) [3]


> Eraser ©   (17.03.09 22:24) [10]
>
> > [8] Alral ©   (17.03.09 22:10)
>
> вообще данные хранить в строках - не очень удачная мысль.
>


Надеюсь мне никто из новомодных компиляторов не запретит хранить в строках числовые данные..


Eraser   (2009-03-17 22:24:00) [4]

> [8] Alral ©   (17.03.09 22:10)

вообще данные хранить в строках - не очень удачная мысль. например, при переходе на Д2009 могут быть проблемы, прийедтся переписывать, т.к. length для строки будет возвращать не количество байт, а количество символов.


Alral   (2009-03-17 22:10:00) [5]


> Сергей М. ©   (17.03.09 22:06) [4]


точно,упустил.
Спасибо.


Сергей М.   (2009-03-17 22:10:00) [6]

SetLength(s, N);
BytesRead := Recv(PChar(s)^, N, 0);
case BytesRead of
-1: ошибка
0: соединение закрыто
else
 SetLength(s, BytesRead);
 вот теперь "отображай" на здоровье BytesRead байт в своей строке, что бы в ней ни было до вызова Recv !
end;


Юрий Зотов   (2009-03-17 22:09:00) [7]

Ничего не надо ни очищать, ни удалять. Надо принять новые данные, они и затрут старые. А длину новой порции полученных данных вернет сама  функция.

var
 ReceivedData: string;
=================
var
 Buffer: array[0..1023] of byte; // Длину надо взять с запасом
 N: integer;
 S: string;
==============
N := Recv(Socket, Buffer, SizeOf(Buffer), 0);
if N  = SOCKET_ERROR then
begin
 ... // Обработка ошибки
end
else
 if N > 0 then
 begin
   SetString(S, PChar(@Buffer[0]), N);
   ReceivedData := ReceivedData + S
 end


Anatoly Podgoretsky   (2009-03-17 22:09:00) [8]

> Alral  (17.03.2009 22:06:05)  [5]

Проблема только в твоей голове.


Сергей М.   (2009-03-17 22:06:00) [9]


> если я приму строку, например, abc, то отобразится abcT


С какого перепугу "отобразится" abcT (4 байта), если ты принял abc (3 байта) ?
Нафига "отображать" 4 байта, если реально тобой принято всего три?
Ты вообще в курсе, что Recv - это функцияи что она возвращает размер действительно записанных данных в указанный тобой строковый буфер ?


Alral   (2009-03-17 22:06:00) [10]


> Anatoly Podgoretsky ©   (17.03.09 22:03) [3]


пугаться-то не надо, но делать что-то надо, т.к. проблема есть и мешает.


Anatoly Podgoretsky   (2009-03-17 22:03:00) [11]

> Alral  (17.03.2009 21:50:00)  [0]

Ничего делать не надо и пугаться тоже.


Alral   (2009-03-17 22:01:00) [12]

Проблема в том, что если я задаю строку, которая короче предыдущей, то выглядит всё следующим образом:

//somevar="tesT"
somevar:='';
...
SetLength(somevar, 5);
//somevar уже tesT, так что если я приму строку, например, abc, то отобразится abcT

то есть при SetLength в переменную записываются старые данные


Сергей М.   (2009-03-17 21:56:00) [13]


> переменная очищается для приёма следующих данных


А что принять данные в "грязную" переменную уже некошерно ?
Какая нафих разница, что раньше было в MyString[N], если в после приема там окажется то что вновь туда записано в результате записи принятых данных ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо