![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамические переменные [D5, WinXP]
Serguar © (2002-09-02 11:23:00)Привет Всем! Никак не могу разобраться почему вылетает программа на 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() - вылетает там.
Может кто посоветует что нибудь?
Заранее благодарен.
Serguar (2002-09-02 15:33:00) [1]Здесь все нормально, ошибка была в другом месте. Моя ошибка. Извените что моричил вам голову. :-|
Skier (2002-09-02 14:50:00) [2]>Serguar
А в чём был "косяк" ? Как победил ?
Serguar (2002-09-02 14:48:00) [3]Все, вопрос решил. Всем большое спасибо за участие.
Serguar (2002-09-02 14:24:00) [4]>McSimm © (02.09.02 14:00)
Скажи, а переменная i тоже глобальная
А смысл ??? Конечно нет, i - объявлена локально, в следующий раз буду приводить код более подробно. Просто здесь я не сталь на этом акцентировать внимания, пото му как решил, что с этим вопросов ни у кого не будет. Мне вот что не понятно, даднный код четко работает если его повесить на кнопку, а по сообщению, как в моем случае вадает AV. Я даже пробовал использовать переменную типа TKeyInfoPack (глобальную). Тут память динамически конечно не выделяется и не освобождается. Но, результат тот же, после последнего end; вываливается: access violation at 0x0040673d: write of addres 0x00000000
McSimm (2002-09-02 14:00:00) [5]>Serguar © (02.09.02 12:42)
Не знаю.
Подозреваю, что требуется вызвать DefWindowProc, но не думаю, что отсутствие этого вызова может к AV привести.
Скажи, а переменная i тоже глобальная?
Serguar (2002-09-02 12:42:00) [6]>McSimm: ???????????
Anatoly Podgoretsky (2002-09-02 12:38:00) [7]Serguar © (02.09.02 11:54)
Меняет должно быть Count <= MAX_ITEMS
Кроме то все те замечания про индексацию, много поточность и рекурсивность, кругом глобальные переменные
Но для начала индексы привести к норме
McSimm (2002-09-02 12:37:00) [8]хотя, при чем здесь AV ...
McSimm (2002-09-02 12:37:00) [9]возможно требуется
DefWindowProc(FWinHwnd, AMsg.Msg, AMsg.WParam, AMsg.LParam);
Serguar (2002-09-02 12:31:00) [10]Попробовал вставить этот код на кнопочку - все работает четко... :-(
Serguar (2002-09-02 12:17:00) [11]> Skier: Ща попробую...
> Ученк, McSimm: Данная процедура вызывается когда клиент посылает SendMessage(), объявлена она в private части объекта TServer, присвоение ее следующее:
procedure TServer.Open;
begin
;;;;;
FWinHwnd := AllocateHWND(WndProc);
;;;;
end;
где FWinHwnd: Hwnd;
McSimm (2002-09-02 12:04:00) [12]
> Serguar © (02.09.02 11:58)
Других ошибок, похоже нет. ( Если только Count <= MAX_ITEMS )
А у тебя случайно нет многопоточности?
Приведенный код не threadsafe. Если несколько нитей будут выполнять эту процедуру одновременно, возможно будет ошибка
Skier (2002-09-02 12:01:00) [13]>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;
Ученик (2002-09-02 12:01:00) [14]procedure TServer.WndProc(var AMsg: TMessage);
странно это как-то
Serguar (2002-09-02 11:58:00) [15]> McSimm ©
Да, согласен, но я уже пробовал делать индексацию с 1
for i := 1 to Pack^.Count do begin ;;; Результат тот же.
Skier (2002-09-02 11:56:00) [16]>Serguar
Pack^.Data[i + 1].Id := Gid;
Pack^.Data[i + 1].NameId := GroupId;
Serguar (2002-09-02 11:54:00) [17]> Anatoly Podgoretsky ©
OK.
Здесь конечно не весь код, я выложил только то, что актуально на данный момент. Ну допустим Count = 32, const MAX_ITEMS = 256;
Разве это что то меняет?
McSimm (2002-09-02 11:52:00) [18]Ошибка в индексации.
Массив [1..MAX_ITEMS]
А цикл 0 to Pack^.Count - 1
-------------------------------------
Это не ошибка, но лучше
const
KEY_PACK_SIZE = SizeOf(TKeyInfoPack);
Иначе есть вероятность изменить эту кронстанту в run-time
Skier (2002-09-02 11:51:00) [19]>Serguar
А теперь расскажи про Count и MAX_ITEMS...
Anatoly Podgoretsky (2002-09-02 11:50:00) [20]Тут еще странные Count и MAX_ITEMS, про них ничего неизвестно, особенно странный Count, так как на ннего опирается цикл.
Короче срочно требуются телепаты, кто у нас вчера проявил замечательные способности в этом деле?