Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Внизочищение памяти, занимаемой переменной 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c