Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
ВнизФункция Recv и PChar Найти похожие ветки
← →
Alral © (2008-08-30 18:36) [0]Здравствуйте.
У меня следующий вопрос: какой тип буфера необходим для функции Recv? При использовании PChar возвращается ошибка : "Acess violation...". При использовании Array of Char также возникает ошибка. Со статическим массивом всё работает, но я хотел бы иметь возможность либо самостоятельно задавать размер буфера, либо использовать String или PChar. Возможно ли это?
Спасибо.
← →
{RASkov} © (2008-08-30 18:38) [1]http://www.skif.bas-net.by/bsuir/base/node251.html
← →
Сергей М. © (2008-08-30 18:42) [2]
> какой тип буфера необходим для функции Recv?
Никакой.
Просто нетипизированный указатель, т.е. адрес чего угодно.
← →
Сергей М. © (2008-08-30 18:47) [3]
> я хотел бы иметь возможность либо самостоятельно задавать
> размер буфера
Для ф-ции recv() это необходимость, а не "возможность".
А ты вообще-то понимаешь, как компилятор интерпретирует конструкцию видаvar SomeIdentifier
фигурирующую как формальный параметр ф-ции recv(), в том виде как она декларирована в winsock[2].pas ?
Подозреваю что не понимаешь принципиально.
← →
Anatoly Podgoretsky © (2008-08-30 19:30) [4]Ты не понимаешь как работают указатели и видимо не умеешь выделять память для PCHar. Это прямо видно из твоего кода.
← →
Сергей М. © (2008-08-30 19:38) [5]
> Anatoly Podgoretsky © (30.08.08 19:30) [4]
> Это прямо видно из твоего кода
Я, по всей печальности, мартышка к старовти - в упор не вижу никакого кода от Автора ..
← →
Anatoly Podgoretsky © (2008-08-30 19:49) [6]А ты внимательно посмотри, вот например в 17 строке обращение по указателю PChar с невыделеной памятью.
← →
Сергей М. © (2008-08-30 19:51) [7]Ну точно - мартышка она и есть к старости)
Теперь вижу что нихрена не вижу)
← →
Anatoly Podgoretsky © (2008-08-30 19:52) [8]> Сергей М. (30.08.2008 19:51:07) [7]
Это для тех кто видит.
← →
Сергей М. © (2008-08-30 19:59) [9]
> Anatoly Podgoretsky © (30.08.08 19:52) [8]
Что ж .. Гарантирую немедленное исключение А.П. (С) из приватных списков мартышек без очков !
))
← →
Сергей М. © (2008-08-30 20:01) [10]Но там, думается, все гораздо проще - непонимание существования и сути разыменования указателей.
← →
Alral © (2008-08-30 20:16) [11]Раньше ответить не мог.
В данной теме я разбираюсь плохо, поскольку до её применения дело раньше не доходило, а соответствующей литературы у меня нет.
Если можно, не могли бы вы дать ссылки на данную тему, так как в тех книгах, которые у меня есть, я эту тему не нашёл.
Спасибо.
← →
Anatoly Podgoretsky © (2008-08-30 20:29) [12]> Alral (30.08.2008 20:16:11) [11]
Мало вероятно найти книгу по работе с указателями, слишком маленькая часть Паскаля, кроме того это относится к базовым знаниям.
← →
Сергей М. © (2008-08-30 20:37) [13]
> Alral © (30.08.08 20:16) [11]
Покажи свой код ..
← →
Alral © (2008-08-30 21:07) [14]В данный момент использую такой:
...
var chRecvBuf: Array [0..1024] of Char;
...
Recv(sClient, chRecvBuf, 1024, 0);
...
Максимальный размер полученных данных составляет при этом 1024 символа.
Как избавиться от этого ограничения?
← →
Юрий Зотов © (2008-08-30 21:18) [15]> Alral © (30.08.08 21:07) [14]
Работа с указателями и динамической памятью почти всегда происходит по одной и той же схеме:
var
Len: integer;
Buff: Pointer;
...
Len := Сколько_надо;
GetMem(Buff, Len);
try
Что-то делаем с Buff
finally
FreeMem(Buff)
end;
В реале, этот код может быть разнесен по разным местам программы, но его суть от этого не меняется.
← →
Германн © (2008-08-30 21:23) [16]
> Максимальный размер полученных данных составляет при этом
> 1024 символа.
> Как избавиться от этого ограничения?
>
var chRecvBuf: Array of Char;
SetLength(chRecvBuf,2098); 2098 просто для примера
Recv(sClient, chRecvBuf[0], 2098, 0);
← →
Сергей М. © (2008-08-30 21:26) [17]
> Как избавиться от этого ограничения?
А нахрена за 1 раз толкать в поток (!) более "кило символов" ?
← →
Alral © (2008-08-30 21:28) [18]О работе с памятью в той литературе, которая у меня есть, не сказано ничего.
> Юрий Зотов © (30.08.08 21:18) [15]
,
> Германн © (30.08.08 21:23) [16]
Спасибо.
С уважением, Александр.
← →
Alral © (2008-08-30 21:31) [19]
> Сергей М. © (30.08.08 21:26) [17]
Не собираюсь много. Просто не хочу резервировать килобайты данных, а выбирать в процессе работы программы по мере необходимости.
← →
Сергей М. © (2008-08-30 21:35) [20]
> Alral © (30.08.08 21:31) [19]
А вот ребята из бывшего Борланда "резервируют" всего 4Кб и в ус не дуют - и юзеры через ихние компоненты как-то умудряются гонять десятки гигабайт данных.
Чудеса в решете, да ?)
← →
Alral © (2008-08-30 21:43) [21]Нет. Просто зачем создавать массив размером 1 килобайт если можно создать динамический массив который будет гораздо меньше и настраивать его по своему усмотрению.
А передавать данные за несколько заходов я смысла не вижу, т.к. передавать большой обьём не планирую.
← →
Сергей М. © (2008-08-30 21:47) [22]
> А передавать данные за несколько заходов я смысла не вижу
А вот ребята из Борланда видят.
Вот ведь чудики они, да ?
← →
Сергей М. © (2008-08-30 21:51) [23]
> Alral © (30.08.08 21:43) [21]
Ты посмотри повнимательней на реализацию методов TCustomWinSocket.SendBuf/SerdStream (scktcop.pas) и удивись. и почеши репу. И задай вопросы. И сделай выводы)
← →
Anatoly Podgoretsky © (2008-08-30 21:52) [24]
> var chRecvBuf: Array [0..1024] of Char;
> ...
> Recv(sClient, chRecvBuf, 1024, 0);
> Как избавиться от этого ограничения?1.
var chRecvBuf: Array [0..1025 of Char;
Recv(sClient, chRecvBuf, 1025, 0);
...
2.
var chRecvBuf: string;
...
SetLength(chRecvBuf, 4096)
Recv(sClient, chRecvBuf[1], Length(chRecvBuf), 0);
← →
Сергей М. © (2008-08-30 21:55) [25]
3.
var pSomeRecvBuf: SomePointer;
ecv(sClient, pSomeRecvBuf^, скоко_надо_но_не_более_размера_буфера_адрес_которого_находится_в_переменной_pSom eRecvBuf, 0);
← →
Anatoly Podgoretsky © (2008-08-30 22:15) [26]> Сергей М. (30.08.2008 21:55:25) [25]
Другие методы я просто не затрагивал, его решение и необычное использование string
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.051 c