Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Вниздинамические переменные Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c