Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к структуре, у которой единственное поле - массив? 
:(
    Опции темы
NiJazz
  Дата 28.9.2003, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



PSID pSid;

PSID_IDENTIFIER_AUTHORITY SidNTAuth;

/* что-то...*/

// Хотим узнать autority
SidNTAuth = GetSidIdentifierAuthority(pSid);

Нам нужен SECURITY_NT_AUTHORITY, поэтому нужно сравнить результат. Но как? Ведь SidNTAuth - указатель на структуру, а SECURITY_NT_AUTHORITY - это определённый набор элементов массива:

#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5}

и ещё:

typedef struct _SID_IDENTIFIER_AUTHORITY {
BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY; // структура с массивом


Вот как мне сделать сравнение? Приведением типов?
PM MAIL   Вверх
mr.DUDA
Дата 28.9.2003, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Используя memcmp, сравнивай 2 участка памяти длиной по 6 байт - по адресу структуры, и по адресу, где лежит то "с чем сравнивать".


--------------------
user posted image
PM MAIL WWW   Вверх
NiJazz
Дата 28.9.2003, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



mr.DUDA, можно, конечно, но хотелось бы более понятно и наглядно сделать. Есть ли другие, более "легальные", способы?
PM MAIL   Вверх
mr.DUDA
Дата 28.9.2003, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Сделай свой тип, производный от SID_IDENTIFIER_AUTHORITY, в котором добавь поддержку операторов "==" и "!=".


--------------------
user posted image
PM MAIL WWW   Вверх
NiJazz
Дата 28.9.2003, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



mr.DUDA, а это как? smile.gif Есть предложения?
PM MAIL   Вверх
NiJazz
Дата 28.9.2003, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



А может есть какая API функция, сравнивающая и выдающая результат?
PM MAIL   Вверх
mr.DUDA
Дата 28.9.2003, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Можно так:
Код
struct  MY_SID_IDENTIFIER_AUTHORITY:
public SID_IDENTIFIER_AUTHORITY
{
    bool operator == (SID_IDENTIFIER_AUTHORITY &ob)
    {
          return memcmp(&ob, this, sizeof(SID_IDENTIFIER_AUTHORITY)) == 0;
    }
    bool operator != (SID_IDENTIFIER_AUTHORITY &ob)
    {
          return !operator== (ob);
    }
};
#define SID_IDENTIFIER_AUTHORITY  MY_SID_IDENTIFIER_AUTHORITY
#define PSID_IDENTIFIER_AUTHORITY  MY_SID_IDENTIFIER_AUTHORITY*

// ......


PSID_IDENTIFIER_AUTHORITY SidNTAuth;
SidNTAuth = GetSidIdentifierAuthority(pSid);

if(SidNTAuth == SECURITY_NT_AUTHORITY)
{
  //  ...
}
else
{
  // ...
}



--------------------
user posted image
PM MAIL WWW   Вверх
NiJazz
Дата 28.9.2003, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



mr.DUDA, а operator - это что? Это зарезервированное слово? По какому принципу так определять операции? Я не умею, а хотел бы научиться. smile.gif Спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 28.9.2003, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Во, наладил VS.NET (хехе smile.gif) и нашёл более оптимальный способ сравнения двух структур, без дочерних классов и #define'ов. Просто положи этот код куда-нибудь сразу после #includ'ов:
Код
bool operator== (SID_IDENTIFIER_AUTHORITY &s1, SID_IDENTIFIER_AUTHORITY &s2)
{return memcmp(&s1, &s2, sizeof(SID_IDENTIFIER_AUTHORITY)) == 0;}

bool operator== (PSID_IDENTIFIER_AUTHORITY &s1, SID_IDENTIFIER_AUTHORITY &s2)
{return memcmp(s1, &s2, sizeof(SID_IDENTIFIER_AUTHORITY)) == 0;}

bool operator== (SID_IDENTIFIER_AUTHORITY &s1, PSID_IDENTIFIER_AUTHORITY &s2)
{return memcmp(&s1, s2, sizeof(SID_IDENTIFIER_AUTHORITY)) == 0;}

bool operator!= (SID_IDENTIFIER_AUTHORITY &s1, SID_IDENTIFIER_AUTHORITY &s2)
{return !operator==(s1, s2);}

bool operator!= (PSID_IDENTIFIER_AUTHORITY &s1, SID_IDENTIFIER_AUTHORITY &s2)
{return !operator==(s1, s2);}

bool operator!= (SID_IDENTIFIER_AUTHORITY &s1, PSID_IDENTIFIER_AUTHORITY &s2)
{return !operator==(s1, s2);}

Сравнивай так:
Код
SID_IDENTIFIER_AUTHORITY SidCmp = SECURITY_NT_AUTHORITY;

////////////////// Вот так: /////////////////////////

PSID_IDENTIFIER_AUTHORITY MySid;
if(MySid == SidCmp)
{
    // ...........
}

/////////////////    Или вот так: ///////////////////////////

SID_IDENTIFIER_AUTHORITY MyOtherSid;
if(SidCmp != MyOtherSid)
{
    // ...........
}


Фишка здесь в том, что нельзя сравнить напрямую с SECURITY_NT_AUTHORITY, т.к. этот макрос - просто список инициализирующих значений для структуры. Поэтому сначала нужно присвоить SECURITY_NT_AUTHORITY какой-нибудь переменной (в примере это SidCmp), а потом можно сравнивать. Обрати внимание на то, что набор операторов позволяет сравнивать:
- структуру со структурой,
- структуру с указателем на структуру,
- и указатель на структуру со структурой.

Насчёт вопроса:
Цитата
а operator - это что? Это зарезервированное слово?

боюсь, что это уже вопрос для отдельного топика.

Но если кратко и по существу - оператор есть функция особого вида, задача которой состоит в выполнении заданной операции над одним (двумя, тремя) аргументами, в том месте программы, где стоит соответствующий оператор (равно, плюс, "a?b:c", ">>" и т.д.), и типы аргументов совпадают с теми, что описаны в заголовке оператора (если сделать "operator== (TYPE1 arg1, TYPE2 arg2)", то действие этого оператора будет распространяться только на аргументы типа TYPE1 и TYPE2 слева и справа от "==").

Это сообщение отредактировал(а) mr.DUDA - 28.9.2003, 17:14


--------------------
user posted image
PM MAIL WWW   Вверх
NiJazz
Дата 29.9.2003, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Тут поступило предложение воспользоваться memcpy... smile.gif
PM MAIL   Вверх
NiJazz
Дата 29.9.2003, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



BYTE ScurityNtAuthArray[6] = {0, 0, 0, 0, 0, 5};

/* что-то */

if (memcmp(pSidNTAuth->Value, ScurityNtAuthArray, 6) != 0)
{
return false;
}

вот и всё... и зачем было так сложнить, а? Что скажешь, mr.DUDA? smile.gif
Но спасибо тебе большое за помощь.
PM MAIL   Вверх
mr.DUDA
Дата 29.9.2003, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
вот и всё... и зачем было так сложнить, а?

Сам просил же:
Цитата
Используя memcmp, сравнивай 2 участка памяти длиной по 6 байт - по адресу структуры, и по адресу, где лежит то "с чем сравнивать".
Код
mr.DUDA, можно, конечно, но хотелось бы более понятно и наглядно сделать. Есть ли другие, более "легальные", способы?



ИМХО, проще один раз описАть 6 операторов и юзать потом простой "==", чем каждый раз писАть одно и то же "memcpy". А твой
Код
BYTE ScurityNtAuthArray[6] = {0, 0, 0, 0, 0, 5};

ничем не лучше моего
Код
SID_IDENTIFIER_AUTHORITY SidCmp = SECURITY_NT_AUTHORITY;



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.