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

Вниз

Функция 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
3-1207556648
Раиса
2008-04-07 12:24
2008.10.12
Full Join и условие = неверный результат?


2-1220272776
fellow
2008-09-01 16:39
2008.10.12
richedit и ??????? вместо кириллицы


2-1220626195
D7
2008-09-05 18:49
2008.10.12
Проверить Тип поля


2-1220073543
DarkLord
2008-08-30 09:19
2008.10.12
Имитация DblClick


15-1219198234
Slider007
2008-08-20 06:10
2008.10.12
С днем рождения ! 20 августа 2008 среда