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

Вниз

динамические переменные   Найти похожие ветки 

 
Serguar ©   (2002-09-02 11:23) [0]

Привет Всем! Никак не могу разобраться почему вылетает программа на FreeMem(). У меня:

TKeyInfo = packed record
Id: Word;
NameId: String[32];
end;

PKeyInfoPack = ^TKeyInfoPack;
TKeyInfoPack = packed record
Count: Integer;
Data: array[1..MAX_ITEMS] of TKeyInfo;
end;

procedure TServer.WndProc(var AMsg: TMessage);
var
Pack: PKeyInfoPack;
begin
GetMem(Pack, KEY_PACK_SIZE);
try
Pack^.Count := Count;
for i := 0 to Pack^.Count - 1 do begin
Pack^.Data[i].Id := Gid;
Pack^.Data[i].NameId := GroupId;
end;
finally
FreeMem(Pack, KEY_PACK_SIZE);
end;
end;

После выхода из функции вылезает Access violation. Если пытаюсь что нибудь вывести перед FreeMem() - вылетает там.

Может кто посоветует что нибудь?
Заранее благодарен.


 
Skier ©   (2002-09-02 11:26) [1]

>Serguar
А это что такой KEY_PACK_SIZE ?


 
McSimm ©   (2002-09-02 11:28) [2]

KEY_PACK_SIZE надо вычислять в зависимости от Count


 
Skier ©   (2002-09-02 11:39) [3]

>Serguar
Видимо нужно так :

GetMem(Pack, Count * SizeOf(TKeyInfoPack));
//бла-бла-бла-бла-бла-
FreeMem(Pack, Count * SizeOf(TKeyInfoPack));



 
McSimm ©   (2002-09-02 11:42) [4]


> Serguar © (02.09.02 11:23)

Извиняюсь протормозил. Массив статический и KEY_PACK_SIZE расчитывать не надо.

Но убедиться что значение этой константы верно - нужно.


 
Serguar ©   (2002-09-02 11:43) [5]

const
KEY_PACK_SIZE: Integer = SizeOf(TKeyInfoPack);


 
Skier ©   (2002-09-02 11:45) [6]

>Serguar
Аналогично McSimm © (02.09.02 11:42),тоже торможу (НЕ ПРАВИЛЬНО), но всё-таки что же в KEY_PACK_SIZE. Загадка...


 
Anatoly Podgoretsky ©   (2002-09-02 11:50) [7]

Тут еще странные Count и MAX_ITEMS, про них ничего неизвестно, особенно странный Count, так как на ннего опирается цикл.
Короче срочно требуются телепаты, кто у нас вчера проявил замечательные способности в этом деле?


 
Skier ©   (2002-09-02 11:51) [8]

>Serguar
А теперь расскажи про Count и MAX_ITEMS...


 
McSimm ©   (2002-09-02 11:52) [9]

Ошибка в индексации.
Массив [1..MAX_ITEMS]
А цикл 0 to Pack^.Count - 1
-------------------------------------
Это не ошибка, но лучше
const
KEY_PACK_SIZE = SizeOf(TKeyInfoPack);

Иначе есть вероятность изменить эту кронстанту в run-time


 
Serguar ©   (2002-09-02 11:54) [10]

> Anatoly Podgoretsky ©
OK.
Здесь конечно не весь код, я выложил только то, что актуально на данный момент. Ну допустим Count = 32, const MAX_ITEMS = 256;
Разве это что то меняет?


 
Skier ©   (2002-09-02 11:56) [11]

>Serguar
Pack^.Data[i + 1].Id := Gid;
Pack^.Data[i + 1].NameId := GroupId;


 
Serguar ©   (2002-09-02 11:58) [12]

> McSimm ©
Да, согласен, но я уже пробовал делать индексацию с 1
for i := 1 to Pack^.Count do begin ;;; Результат тот же.



 
Ученик ©   (2002-09-02 12:01) [13]

procedure TServer.WndProc(var AMsg: TMessage);
странно это как-то


 
Skier ©   (2002-09-02 12:01) [14]

>Serguar

procedure TServer.WndProc(var AMsg: TMessage);
var
Pack: PKeyInfoPack;
begin
Inherited;
GetMem(Pack, KEY_PACK_SIZE);
try
Pack^.Count := Count;
for i := 0 to Pack^.Count - 1 do begin
Pack^.Data[i + 1].Id := Gid;
Pack^.Data[i + 1].NameId := GroupId;
end;
finally
FreeMem(Pack, KEY_PACK_SIZE);
end;
end;


 
McSimm ©   (2002-09-02 12:04) [15]


> Serguar © (02.09.02 11:58)

Других ошибок, похоже нет. ( Если только Count <= MAX_ITEMS )

А у тебя случайно нет многопоточности?
Приведенный код не threadsafe. Если несколько нитей будут выполнять эту процедуру одновременно, возможно будет ошибка


 
Serguar ©   (2002-09-02 12:17) [16]

> Skier: Ща попробую...
> Ученк, McSimm: Данная процедура вызывается когда клиент посылает SendMessage(), объявлена она в private части объекта TServer, присвоение ее следующее:
procedure TServer.Open;
begin
;;;;;
FWinHwnd := AllocateHWND(WndProc);
;;;;
end;
где FWinHwnd: Hwnd;


 
Serguar ©   (2002-09-02 12:31) [17]

Попробовал вставить этот код на кнопочку - все работает четко... :-(


 
McSimm ©   (2002-09-02 12:37) [18]

возможно требуется
DefWindowProc(FWinHwnd, AMsg.Msg, AMsg.WParam, AMsg.LParam);


 
McSimm ©   (2002-09-02 12:37) [19]

хотя, при чем здесь AV ...


 
Anatoly Podgoretsky ©   (2002-09-02 12:38) [20]

Serguar © (02.09.02 11:54)
Меняет должно быть Count <= MAX_ITEMS
Кроме то все те замечания про индексацию, много поточность и рекурсивность, кругом глобальные переменные
Но для начала индексы привести к норме


 
Serguar ©   (2002-09-02 12:42) [21]

>McSimm: ???????????


 
McSimm ©   (2002-09-02 14:00) [22]

>Serguar © (02.09.02 12:42)

Не знаю.
Подозреваю, что требуется вызвать DefWindowProc, но не думаю, что отсутствие этого вызова может к AV привести.

Скажи, а переменная i тоже глобальная?


 
Serguar ©   (2002-09-02 14:24) [23]

>McSimm © (02.09.02 14:00)
Скажи, а переменная i тоже глобальная

А смысл ??? Конечно нет, i - объявлена локально, в следующий раз буду приводить код более подробно. Просто здесь я не сталь на этом акцентировать внимания, пото му как решил, что с этим вопросов ни у кого не будет. Мне вот что не понятно, даднный код четко работает если его повесить на кнопку, а по сообщению, как в моем случае вадает AV. Я даже пробовал использовать переменную типа TKeyInfoPack (глобальную). Тут память динамически конечно не выделяется и не освобождается. Но, результат тот же, после последнего end; вываливается: access violation at 0x0040673d: write of addres 0x00000000


 
Serguar ©   (2002-09-02 14:48) [24]

Все, вопрос решил. Всем большое спасибо за участие.


 
Skier ©   (2002-09-02 14:50) [25]

>Serguar
А в чём был "косяк" ? Как победил ?


 
Serguar ©   (2002-09-02 15:33) [26]

Здесь все нормально, ошибка была в другом месте. Моя ошибка. Извените что моричил вам голову. :-|



Страницы: 1 вся ветка

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
4-35952
CAHbKA
2002-07-22 05:12
2002.09.12
Где лежит Winamp?


8-35821
maxon
2002-05-10 13:51
2002.09.12
mediaplayer


6-35842
Diamond Dog
2002-07-09 01:19
2002.09.12
Синхронизация слиента и сервера на TClient и TServer-Socket-ах


1-35691
Serguar
2002-09-02 11:23
2002.09.12
динамические переменные


14-35850
RV
2002-08-16 13:13
2002.09.12
Выскажите соображения