Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Динамический массив...


Автор: Кощей 27.12.2009, 23:27
Ошибка:"First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 004062F5 in module 'Server.exe'. Read of address 50FF7EFC'. Process Server.exe (3576)"

Начала выкидоватся когда ввел динамический массив, давно была в точности такая же ошибка, но я на неё банально забил. Сейчас стороной обойти мне совсем не улыбается, да и хочется понять что может быть не так...

Код

procedure TForm_Server.Server1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Buf: array of byte;
  BufCount: Integer;

begin
BufCount:= Socket.ReceiveLength;
Socket.ReceiveBuf(Buf, BufCount);
SetLength(Buf, BufCount);
end;

Автор: volvo877 27.12.2009, 23:34
Ну, а сначала выделить память под буфер, и только потом вызвать ReceiveBuf - не догадался?

Автор: DarkProg 27.12.2009, 23:42
Цитата(Кощей @  27.12.2009,  23:27 Найти цитируемый пост)
давно была в точности такая же ошибка


Инересно и как же ты на неё забил ведь с этой ошибкой ничего не работает????  smile 


Цитата(volvo877 @  27.12.2009,  23:34 Найти цитируемый пост)
Ну, а сначала выделить память под буфер, и только потом вызвать ReceiveBuf - не догадался? 


Абсолютно согласен.

Нужно запомнить одну вещь: пытаться что-то присвоить динамическому массиву без указания его длины невозможно, т.к. присваивать некуда, не выделено под него памяти, максимум что можно с ним сделать это узнать, что что под него не выделена память

Автор: Кощей 27.12.2009, 23:43
Оу, стыдно, не внимателен...поменял местами...но от ошибки не избавился...со статическим все проходило нормально...

Ошибка:"First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 0046B48C in module 'Server.exe'. Read of address 4DFF7F00'. Process Server.exe (464)

указывает на последнюю строчку в этом листинге:

Код

procedure TForm_Server.Server1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Buf: array of byte;
  BufCount: Integer;
  i: Integer;
  Auth: Boolean;
  Mess: String;

begin
Auth:= false;
BufCount:= Socket.ReceiveLength;
SetLength(Buf, BufCount);
Socket.ReceiveBuf(Buf, BufCount);
for i := 0 to 8 do
  begin
    if Socket.SocketHandle = ServersSocketHandle[i] then
    Auth:= true;
  end;
if Auth = false then
begin
  if BufCount > 2 then
    begin
      if Buf[0] = 0 then
"

Добавлено @ 23:44
Цитата


Инересно и как же ты на неё забил ведь с этой ошибкой ничего не работает????


Знаю я...сори..не внимателен...там была ошибка когда присваивал размерность массива...в общем что-то такое...

Автор: DarkProg 27.12.2009, 23:59
А ты побовал трассировкой???
Поставь breakpoint на 20 строчку и потом через F8 и посмотри значения, просто я может туплю но вроде как бы всё впорядке

Автор: Кощей 28.12.2009, 00:20
решил нулевому байту пришить значение...

Код

Auth:= false;
BufCount:= Socket.ReceiveLength;
SetLength(Buf, BufCount);
Buf[0]:= 0;  //ошибки нет
Socket.ReceiveBuf(Buf, BufCount);
Buf[0]:= 0;  //ошибка есть

Автор: DarkProg 28.12.2009, 00:32
Интересно

Судя по всему поблема возникает с ReceiveBuf

Я не знаю но ты этот метод сам писал или он Делфикофский, я просто не всё знаю

Если сам то посмотри его внимательно, если Дельфиковский то посмотри по нему Хелп или всплывающую подсказку, для чего нужен в точности первый аргумент

Автор: Кощей 28.12.2009, 01:19
Это стандартный serverSocket ....первое значение это  байты...второе значение нужно, если я правильно понял, чтобы собрать полный пакет-т.е. количество байт...самое забавное, что со статическим массивом все прекрасно работает...

Автор: dvamaster 28.12.2009, 06:35
В динамическом массиве типа array of (т.е. без размерности) в начале стоит служебная информация.

можно такой вариант
Код

var
  Buf: Pointer;
begin
  ...
  GetMem(Buf, BufCount);
  ...
  Socket.ReceiveBuf(Buf^, BufCount);
  ...
  FreeMem(Buf);
  ...
end;

Автор: CodeMonkey 28.12.2009, 11:53
http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html (http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html#references).

Автор: artsb 28.12.2009, 12:10
Недавно с эти столкнулся. Обсуждали в http://forum.vingrad.ru/forum/topic-285484.html.
Код

Auth:= false;
BufCount:= Socket.ReceiveLength;
SetLength(Buf, BufCount);
Buf[0]:= 0;  //ошибки нет
Socket.ReceiveBuf(Buf[0], BufCount); // так должно работать
Buf[0]:= 0;  //ошибка есть

Автор: Кощей 18.1.2010, 00:13
Спасиб, огромное. В следующий раз буду до дыр разбиратся с мануалами...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)