Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1219992531
mefodiy
2008-08-29 10:48
2008.10.12
Выгрузка картинки из поля MSSQL в jpg файл


2-1220512873
harisma
2008-09-04 11:21
2008.10.12
Поиск фразы в бинарном файле


1-1199872215
tytus
2008-01-09 12:50
2008.10.12
ListView и фоновая картинка


4-1197470220
Unknown user
2007-12-12 17:37
2008.10.12
Зависает API функция EnterCriticalSection


15-1219088046
Тимохов
2008-08-18 23:34
2008.10.12
Helpdesk и работа с пользователями





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