Консультация № 67326
17.12.2006, 03:04
0.00 руб.
0 4 2
Доброе время суток!
Проблема с извлечением данных из структуры, которая передается в LPARAM. Код в приложении.

Приложение:
Имеется структура:typedef struct the_MYSTRUCT {DWORD mydword;// только один член стр-ры - для теста} MY_STRUCT; В программе объявлена глобальная переменнаяLPARAM myparam;В функции1:MY_STRUCT * pmmm;MY_STRUCT mmm = {0};mmm.mydword=100;pmmm = &mmm;myparam = (LPARAM) pmmm;// при чем если прочитать здесь обратно// из myparam в структуру, то все ок, // и в отладчике видно что порядок///В функции2, которая вызывается после вызова функции1:MY_STRUCT * mystr = {0};mystr=(MY_STRUCT *)myparam;DWORD mynextdw = mystr->mydword;// В mynextdw уже мусор какой-то (или ноль)

Обсуждение

Неизвестный
17.12.2006, 11:55
общий
это ответ
Здравствуйте, Белкин Алексей!
Ты создаешь MY_STRUCT локально для одной функции, поэтому при выходе из нее она удаляется. И соотвественно адрес указателя который ты присвоил LPARAM еще какой-то есть, но память там уже особождена и в ней либо находится уже другие данные, либо мусор.

Выделяй для своей структуры память динамически, чтобы она осталась после выхода из функции и естественно не забывай удалять где-нибудь в другом месте (в данном случае, удобно это сделать во 2-ой функции).



Приложение:
В функции1:MY_STRUCT * mmm = 0;mmm = new MY_STRUCT;mmm->mydword=100;myparam = (LPARAM) mmm;В функции2, которая вызывается после вызова функции1:MY_STRUCT * mystr = 0;mystr=(MY_STRUCT *)myparam;DWORD mynextdw = mystr->mydword;delete my_str;
Неизвестный
17.12.2006, 16:32
общий
это ответ
Здравствуйте, Белкин Алексей!

Достаточно создать структуру mmm статической (со спецификатором static).

PS. Если все же не в этом ошибка, есть у меня другое подозрение, пишите в мини-форум
Неизвестный
17.12.2006, 20:47
общий
Так как все таки правильней - через динамическое выделение памяти или просто с помощью static? static пока не пробовал. new применил и это, как кажется, вполне решило проблему. Однако возникает вопрос как потом быть с памятью, чтоб не допустить утечек?на выходе проги буду делать тогда:delete (MY_STRUCT *)myparam;- это правильное освобождение памяти?
Неизвестный
17.12.2006, 22:26
общий
Я потому и написал, что правильнее static.Точнее, не правильнее, а надежнее.1) Память может не выделиться, а вы забудете сделать проверку;2) Вы можете забыть освободить выделенную память, или попытаетесь освободить ее дважды, или попытаетесь освободить не ту память;Ошибки редкие, но возможные.PS Удаление у вас правильное
Форма ответа