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

Вниз

очищение памяти, занимаемой переменной String   Найти похожие ветки 

 
Alral ©   (2009-03-17 21:50) [0]

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


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


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


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


 
Alral ©   (2009-03-17 22:01) [2]

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

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

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


 
Anatoly Podgoretsky ©   (2009-03-17 22:03) [3]

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

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


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


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


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


 
Alral ©   (2009-03-17 22:06) [5]


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


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


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

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

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) [7]

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

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


 
Alral ©   (2009-03-17 22:10) [8]


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


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


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

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


 
Eraser ©   (2009-03-17 22:24) [10]

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

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


 
Jeer ©   (2009-03-17 22:53) [11]


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


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


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

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


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


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

Даже для AnsiString?

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



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1236067326
SKIPtr
2009-03-03 11:02
2009.04.26
Как программно свернуть программу


2-1237215031
пикассо
2009-03-16 17:50
2009.04.26
Что не так с utf8?


15-1235652901
Максим
2009-02-26 15:55
2009.04.26
ADOConnection не видит базы созданные на SQL сервере


15-1235654209
Кто б сомневался
2009-02-26 16:16
2009.04.26
Анабиоз. Сон разума.


3-1219755637
Курдль
2008-08-26 17:00
2009.04.26
Очистить всю таблицу DBF с помощью SQL