Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2012, 04:46   #1
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию Директива #pragma pack MS 2010

Подскажите пожалуйста, в каких случаях необходимо использование директивы #pragma pack.

У меня есть 2 структуры:

Код:
#pragma pack(1)

typedef struct NPKDIR{
	int Sz;
	WORD sLen;
	char* dirName;
} *LPNPKDIR;

typedef struct NPKFILE{
	int Sz;
	int fStart;
	int fSize;
	WORD sLen;
	char* fileName;
} *LPNPKFILE;

#pragma pack()
При попытке заполнить память

Код:
memset(dir, 0, sizeof(NPKDIR));
студия ругается:

Код:
warning C4789: конечная область для копирования памяти слишком мала
ну и соответственно программа не работает.
Скажите пожалуйста что я делаю не так.
crymchanin вне форума Ответить с цитированием
Старый 22.02.2012, 13:04   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

pack задает выравнивание полей структуры по х-байтной границе.

и ошибка никак не связана с pack. как обычно, наверно объявили указатель вместо того чтобы структуру объявить.
f.hump вне форума Ответить с цитированием
Старый 22.02.2012, 19:36   #3
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Да, я уже понял что дело не в директиве.
Цитата:
Сообщение от f.hump
наверно объявили указатель вместо того чтобы структуру объявить
Да, указатель, но я выделяю под него память.
Но все-же как решить эту проблему? Вот кусок кода побольше:
Код:
#pragma pack(1)

typedef struct _NPKDIR{
	int Sz;
	WORD sLen;
	char* dirName;
} NPKDIR, *LPNPKDIR;

typedef struct _NPKFILE{
	int Sz;
	int fStart;
	int fSize;
	WORD sLen;
	char* fileName;
} NPKFILE, *LPNPKFILE;

#pragma pack()

.........

	if(buff == *(DWORD*)"ELIF")
	{
		LPNPKFILE file = new NPKFILE;
		memset(&file, 0, sizeof(NPKFILE));

		fread(&file->Sz, 1, 4, npk);
		fread(&file->fStart, 1, 4, npk);
		fread(&file->fSize, 1, 4, npk);
		fread(&file->sLen, 1, 2, npk);

		file->fileName = new char[file->sLen + 1];
		fread(&file->fileName, 1, file->sLen, npk);
		file->fileName[file->sLen] = '\0';

		LVITEM lvi;
		memset(&lvi, 0, sizeof(LVITEM));
		lvi.mask = LVIF_TEXT | LVIF_COLUMNS | LVIF_COLFMT;
		lvi.pszText = file->fileName;
		int nNum = main->m_ListCtrl.InsertItem(&lvi);
		main->m_ListCtrl.SetItemData(nNum, (DWORD_PTR)file);
	}

Последний раз редактировалось crymchanin; 22.02.2012 в 19:47.
crymchanin вне форума Ответить с цитированием
Старый 22.02.2012, 19:50   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

обратите внимание что именно вы хотите заполнить нулями.

вы не заметили, а студия заметила.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.02.2012, 19:54   #5
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Цитата:
Сообщение от Пепел Феникса
обратите внимание что именно вы хотите заполнить нулями
Спасибо большое. Много раз пересматривал код, но на амперсанд не обращал внимания
crymchanin вне форума Ответить с цитированием
Старый 22.02.2012, 19:54   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
LPNPKFILE file = new NPKFILE;
memset(&file, 0, sizeof(NPKFILE));
Переменная file это уже указатель, зачем же брать адрес указателя в memset?
EUGY вне форума Ответить с цитированием
Старый 22.02.2012, 20:00   #7
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Цитата:
Сообщение от EUGY
Переменная file это уже указатель, зачем же брать адрес указателя в memset?
Да-да, уже исправил. Банальная невнимательность
crymchanin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
#pragma once optimator Общие вопросы C/C++ 8 01.12.2010 16:46
#pragma argsused Syltan Общие вопросы C/C++ 25 24.02.2010 14:35
pragma Witaliy Общие вопросы Delphi 1 31.07.2008 16:00
MediaPlayer и кодеки вроде K-Lite codec pack, xp codec pack Rend1 Мультимедиа в Delphi 2 03.02.2008 20:17