Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1235299343
Den_
2009-02-22 13:42
2009.04.26
Что бы придумать для своей программы (не совсем шароварное)?


8-1192972332
varmer
2007-10-21 17:12
2009.04.26
Прорисовка строк на канвасе, после чтения их из файла


3-1220248448
Dagir
2008-09-01 09:54
2009.04.26
Задать цикл


6-1200754867
guard_gg
2008-01-19 18:01
2009.04.26
icmp result после udp send


15-1235672067
Кое кто
2009-02-26 21:14
2009.04.26
англо-русский сайт





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