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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов про массив хэндлеров, и инициализацию структуры нулевыми знач. 
:(
    Опции темы
djamshud
Дата 30.4.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



>отличная аргументация

Не аргументация, а поправка.

>а вот хотелось бы поподробней узнать, что имелось ввиду.. 

С виртуальными функциями я погорячился. А имелось в виду:

Код

class Class{
public:
//virtual void foo(){}
void bar(){}
int data;
Class(){this->data=5;}
};

int data;
memcpy(&data,new Class,sizeof(int));
printf("%d\n",data);//print 5


Но это уже хаки, на них рассчитывать не нужно, конечно.

>По второму вопросу, с хэндлерами, есть мысли?

Вами же предложенный массив, чем не решение?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 30.4.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SABROG @  30.4.2010,  13:35 Найти цитируемый пост)
Разве стандарт гарантирует, что все значения будут инициализированы нулями?


Цитата

8.5 Initializers

To default initialize an object of type T means:
— if T is a nonPOD class type (clause 9), the default constructor for T is called (and the initialization is ill formed if T has no accessible default constructor);
— if T is an array type, each element is default initialized;
— otherwise, the storage for the object is zero initialized.



Это сообщение отредактировал(а) azesmcar - 30.4.2010, 14:36
PM   Вверх
SABROG
Дата 30.4.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(azesmcar @  30.4.2010,  14:31 Найти цитируемый пост)
— otherwise, the storage for the object is zero initialized.


Ага, значит, если типы в структуре Plain Old Data (POD - int, char и т.д.), то они должны автоматически инициализироваться нулями. Значит в моем случае следующий код сделает всё сам:

Код

void testFn(MyStruct ms = MyStruct())
{
}


Цитата(djamshud @  30.4.2010,  14:29 Найти цитируемый пост)
Вами же предложенный массив, чем не решение?


Да какое-то он в стиле Си. Я конечно ничего против языка Си не имею, но думал, может функторы какие-нибудь применить можно, классы, stl.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 14:55


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  13:15 Найти цитируемый пост)
Осталось понять насчет константности ссылки и почему static_cast'ом нельзя привести безымянную структуру к нужному типу.

Код


int f();

int r& = f(); 

 почему здесь нельзя инизиализировать ссылку значением понятно  ? ну а константную можно, и сделано для того, чтоб можно было, в частности :
Код

int f();
int crf ( int const& );

crf ( f() );


Добавлено через 42 секунды
Цитата(SABROG @  30.4.2010,  13:49 Найти цитируемый пост)
Значит в моем случае следующий код сделает всё сам:

 smile 


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @  30.4.2010,  14:52 Найти цитируемый пост)
почему здесь нельзя инизиализировать ссылку значением понятно  ?

Об этом я знал, просто меня удивил твой комментарий насчет "не эквивалентности". Я ведь о другой эквивалентности говорил, о приведении (объявлении?) безымянной структуры к нужному типу или нужного типа, а не о правах доступа/свойстве объекта. Я так до сих пор в этом не разобрался, что там происходит "(int){0}" толи объявление, толи приведение.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 15:02


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 30.4.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



SABROG

Да, впрочем к агрегатам (?) можно и такой способ применить
Код

MyStruct t = {0};

Цитата(aggregate)

An aggregate is an array or a class (clause 9) with no userdeclared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).

можешь тут почитать, тоже доп. информация.
http://forum.vingrad.ru/forum/topic-257566...y1856934/0.html
PM   Вверх
SABROG
Дата 30.4.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(azesmcar @  30.4.2010,  15:17 Найти цитируемый пост)
Да, впрочем к агрегатам (?) можно и такой способ применить

У меня ситуация несколько иная, есть несколько функций, где идет вызов другой функции, в которую нужно передать структуру инициализированную нулями. Поэтому я хотел от такого избавиться:

Код

void foo1()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo2()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo3()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo4()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 30.4.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Код

void foo1()
{
    myfunc(MyStruct());
}
void foo2()
{
    myfunc(MyStruct());
}
void foo3()
{
    myfunc(MyStruct());
}
void foo4()
{
    myfunc(MyStruct());
}

ну или с default значением, но это только для POD структур.

а зачем нужны несколько функций, которые делают тоже самое? smile 

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 15:27
PM   Вверх
mes
Дата 30.4.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я ведь о другой эквивалентности говорил, 


ну так мой комментарий относился к слову "аналогично", которое в свою очередь относилось к строке 
Код

void foo(int &arg = (int) {0})...

т.е.  я подчеркнул , что она не аналогична
Код

void foo(const int &arg = (int) {0})...



Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я ведь о другой эквивалентности говорил, о приведении (объявлении?) безымянной структуры к нужному типу или нужного типа,

{0,0} - не есть безымянная структура, и создать объект без указания типа по такому определению не получится.

Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
а не о правах доступа/свойстве объекта. 

о правах доступа в этой теме вообще никто не говорил smile

Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я так до сих пор в этом не разобрался, что там происходит "(int){0}" толи объявление, толи приведение.

создание безымянной структуры инициализированной списком параметров, но, на сколько я знаю, такой подход нежелателен по стандарту.. 



--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(azesmcar @  30.4.2010,  15:25 Найти цитируемый пост)
ну или с default значением, но это только для POD структур.

Код

class MyClass {
private:
    int member;
};

MyClass ведь не POD тип? Но член member все-равно будет проиницилизирован нулем, так как он POD?

Цитата(azesmcar @  30.4.2010,  15:25 Найти цитируемый пост)
а зачем нужны несколько функций, которые делают тоже самое?

Функция принимает в качестве параметров структуру с указателями на callback функции для установки перехватчика. Иногда есть необходимость снимать ранее установленые перехватчики, чтобы вызывался оригинальный хендлер, для того, чтобы избежать рекурсии. Можно конечно написать новую функцию типа uninstallFilter(). Но я решил вместо этого вызывать функцию типа setFilter() без параметров, чтобы снять ранее установленные обработчики.

Пока подержу тему открытой, нужны мысли по поводу массива хэндлеров. Неужели это единственно верный и самый компактный вариант?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  14:23 Найти цитируемый пост)
У меня ситуация несколько иная, 

ну так Вы столько воды в этой теме налили, что в ее расплывах и не видно где у Вас проблема то..
smile

Добавлено через 2 минуты и 52 секунды
Цитата(SABROG @  30.4.2010,  14:47 Найти цитируемый пост)

Функция принимает в качестве параметров структуру с указателями на callback функции для установки перехватчика.

а чем виртуальные функции не угодили то ?

Добавлено через 4 минуты и 7 секунд
Цитата(SABROG @  30.4.2010,  14:47 Найти цитируемый пост)
Иногда есть необходимость снимать ранее установленые перехватчики, чтобы вызывался оригинальный хендлер, для того, чтобы избежать рекурсии.

тут не понятно о чем Вы.. отдалено предполагаю, что хандлер при вызове сам устанавливает хандлеры..


Это сообщение отредактировал(а) mes - 30.4.2010, 15:50


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 30.4.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SABROG @  30.4.2010,  15:47 Найти цитируемый пост)
Но член member все-равно будет проиницилизирован нулем, так как он POD?

нет, не будет.
Цитата

A POD-struct is an aggregate class that has no nonstatic data members of type pointer to member, non-PODstruct, nonPOD-union (or array of such types) or reference, and has no user-defined copy assignment operator and no user-defined destructor.

Цитата

An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).

можно проверить
Код

struct MyStruct
{
    friend int main();
private:
    int a;
    int b;
    int c;
};

int main()
{
    MyStruct t = MyStruct();
    std::cout << t.a << t.b << t.c << std::endl; // нулей уже нет
}


Добавлено через 3 минуты и 23 секунды
Цитата(SABROG @  30.4.2010,  15:47 Найти цитируемый пост)
Неужели это единственно верный и самый компактный вариант?

откровенно говоря я не совсем понял суть задачи, если можно глобальнее и подробнее.
PM   Вверх
SABROG
Дата 30.4.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
и не видно где у Вас проблема то

Если брать вопрос про инициализацию структуры нулевыми значениями, то проблема в читабельности кода. Подход с классом выглядит не читабельно и громоздко по сравнению со структурой с 4мя указателями.

Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
а чем виртуальные функции не угодили то ?

Функция библиотеки (не моей) принимает в качестве аргумента структуру в которой нужно передать 4 указателя на обычные статические функции. Я не могу этого изменить, но могу обернуть этот вызов в свои функции.

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
{0,0} - не есть безымянная структура, и создать объект без указания типа по такому определению не получится.

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
создание безымянной структуры инициализированной списком параметров

Чего-то я запутался smile В чем разница между первой и второй цитатой?

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
о правах доступа в этой теме вообще никто не говорил

Короче речь о const-correctness, уж не знаю как это правильно перевести.

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
но, на сколько я знаю, такой подход нежелателен по стандарту

Ага, то есть еще одна дверь закрывается и остается полагаться на default constructed value для POD типов или как более универсальный, но слишком громоздкий и нечитабельный вариант с классом как в первом моем посте.

Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
тут не понятно о чем Вы.

Не заморачивайся, у меня самого сейчас та еще каша в голове. Просто даже по логике необходимость подготавливать аргумент, значение которого заранее известно, в функцию или метод кажется не совсем правильной. Зачем писать лишний код где-то отдельно, если можно поставить значение по умолчанию или инициализировать структуру сразу при вызове функции?

Цитата(azesmcar @  30.4.2010,  16:05 Найти цитируемый пост)
откровенно говоря я не совсем понял суть задачи, если можно глобальнее и подробнее. 

ОС присылает int'овые состояния, которых больше 30, на кажое состояние отдельные функции, которые запрашивают от ОС дополнительную информацию о них у той же ОС. Вот я и не хочу делать 30 и более case'ов.

Цитата(azesmcar @  30.4.2010,  16:05 Найти цитируемый пост)
нет, не будет.

А это уже проблема. Значит между этими двумя вариантами большая разница:

Код

void testFn(MyStruct ms = MyStruct()) // стандарт гарантируется инициализацию POD типов-членов структуры нулями
{
}

void testFn(MyClass ms = MyClass()) // стандарт не гарантирует инициализацию членов нулями
{
}


Я правильно понял?

Это сообщение отредактировал(а) SABROG - 30.4.2010, 16:42


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 30.4.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SABROG @  30.4.2010,  16:39 Найти цитируемый пост)
А это уже проблема. Значит между этими двумя вариантами большая разница:

нет, на самом деле между классом и структурой только одна разница, по умолчанию все члены класса являются private и наследование по умолчанию от класс - private. Все остальное тоже самое. В примере выше проблема не в использовании ключевого слова class, а в приватности члена класса.

Цитата(SABROG @  30.4.2010,  16:39 Найти цитируемый пост)
ОС присылает int'овые состояния, которых больше 30, на кажое состояние отдельные функции, которые запрашивают от ОС дополнительную информацию о них у той же ОС. Вот я и не хочу делать 30 и более case'ов.

map или массив+указатель на функцию. А причем тут инициализация структур?

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 16:48
PM   Вверх
SABROG
Дата 30.4.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(azesmcar @  30.4.2010,  16:46 Найти цитируемый пост)
В примере выше проблема не в использовании ключевого слова class, а в приватности члена класса.

Значит тут такая ситуация?
Код

class MyClass {
public:
    int var1;
};

void foo(MyClass mc = MyClass()) // всё ок
---
class MyClass {
    int var1;
};

void foo(MyClass mc = MyClass()) // проблема?
---
class MyClass {
    int var1'
public:
    int var2;
};

void foo(MyClass mc = MyClass()) // var2 инициализирована нулем, var1 - undefined


Так чтоль?

Цитата(azesmcar @  30.4.2010,  16:46 Найти цитируемый пост)
А причем тут инициализация структур?

Я уже путаюсь о чем вы меня спрашиваете.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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