Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.007 c
1-35775
ev
2002-08-30 19:12
2002.09.12
ламерский вопрос по TSrtingGrid...


1-35649
Mazenrat
2002-08-31 15:40
2002.09.12
Как зарегистрировать гарячие клавиши в приложении???


1-35736
RV
2002-08-30 14:04
2002.09.12
CreateProcess, как узнать код ошибки


4-35969
Groove
2002-06-07 15:02
2002.09.12
Alt+Ctrl+Del


14-35913
Ыукпун
2002-08-20 13:44
2002.09.12
Програмная реализация процесса стыковки, help!!!





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