![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
очищение памяти, занимаемой переменной 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], если в после приема там окажется то что вновь туда записано в результате записи принятых данных ?