|
|
  |
Вопросы по изучению Си |
|
|
|
Nov 9 2009, 14:34
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(WHALE @ Nov 9 2009, 15:02)  Дык в топике вроде речь идет о С? И если компилятор не поддерживает С99,то тогда без вариантов.. В начале блока { } можно объявлять хоть в до-ансишном K&R, у которого ещё прототипов функций не было, так что в данном случае именно Код if( условие ) { uint32_t count; *** } else { *** } или, к примеру, так Код switch( aaa ) { case bbb: { uint32_t count; *** } break; case ccc: { float sum; *** } break; } и это должен нормально отработать любой компилятор.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 9 2009, 14:37
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
С точки зрения быстродействия все таки да мне кажется переменные нужно объявлять как можно локальнее... к примеру тогда максимальное число переменных будут загружаться через регистры а не через память. Прав я или нет? В чем ещё преимущества объявления переменных как можно локальнее.
Сообщение отредактировал arm123 - Nov 9 2009, 15:05
|
|
|
|
|
Nov 9 2009, 15:52
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
Цитата(sergeeff @ Nov 9 2009, 18:30)  Я привел ссылку на конкретную книгу где все по пунктам расписано. Наверное не сложно эту книгу найти и прочесть. Там анализ идет в первую очередь касательно удобочитаемости и большей вероятностью ошибится нежели вопрос оптимизации и быстродействия.
|
|
|
|
|
Nov 9 2009, 16:05
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Не забудьте инициализировать переменную, т.е. должно быть как-то так Код какие-то действия if (условие) { uint32_t count = SOME_VALUE; // какое-то нужно Вам значение *** } else { *** } У Вас тут ошибки не закралось? Я хочу сказать, что за переделами if(){} не будет существовать такой переменной как count или будет использована переменная из глобальной области видимости. Как дальше по тексту будет использоваться переменная count?
|
|
|
|
|
Nov 9 2009, 19:41
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
Цитата(kurtis @ Nov 9 2009, 20:05)  У Вас тут ошибки не закралось? Я хочу сказать, что за переделами if(){} не будет существовать такой переменной как count или будет использована переменная из глобальной области видимости. Как дальше по тексту будет использоваться переменная count? ну если быть точным то ситуация такая Код uint32_t count; какие-то действия if( условие ) { *** (тут count используется) } else { *** (тут count не используется) } *** (тут count не используется) Ну я для себя ответ понял, переменные нужно делать максимально локальнее, за исключением циклов
|
|
|
|
|
Nov 13 2009, 15:13
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
Добрый день! или не день =) ... Влеплю сюда вопрос по Си++. Не пойму как реализовать следующую идею: Заводим класс клавиатуры, в котором описан метод(процедура) опроса клавиатуры, которая обновляет находящуюся в этом-же классе переменную - битовую маску нажатых клавиш. (сколько клавиш-столько бит) Код class MtxKeypad { private: volatile KeyMapType NewKeyMap; // считываемая в данный момент карта клавиш public: volatile KeyMapType KeyMap; // последняя считанная карта клавиш
// typedef Mtx_Button<1,1> Key_1; // !! эти строки относятся к вопросу сабжа // typedef Mtx_Button<1,2> Key_2; // тут объявляются все кнопки и их расположение (строка,столбец) // typedef Mtx_Button<2,1> Key_Enter; // typedef Mtx_Button<4,1> Key_Cancel;
void Scan() { // метод опроса клавиатуры // .... KeyMap=NewKeyMap; // .... } }; далее заводим шаблон класса отдельной кнопки, который умеет сообщать, нажата эта кнопка или нет: Код template <int Col, int Row> class Mtx_Button : public MtxKeypad { //friend class MtxKeypad; // это вот ХЗ надо тут или нет private: static const KeyMapType mask=(1UL<<(Row*5+Col)); public: inline uint8_t Pressed() {return (MtxKeypad::KeyMap & mask)!=0;} }; И нужно использовать потом так: Код int main() { MtxKeypad Keys; Mtx_Button<4,1> Key_A; for(;;) { Keys.Scan(); if(MtxKeypad::Key_1::Pressed()) pin2.Toggle(); // ошибка if(Key_A.Pressed()) pin2.Toggle(); // работает если добавить Key_A.Scan(); но тут отдельный объект с отдельными переменными - неправильно } } Так вот ВНИМАНИЕ ВОПРОС: как правильно описать классы, если мне надо чтоб дочерние объекты не копировали родительский метод и переменные, а пользовались ими, влияли на них.
|
|
|
|
|
Nov 13 2009, 22:34
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Наследовать кнопку от клавиатуры - это, имхо, перебор  Достаточно хранить в кнопке ссылку на клавиатуру. Типа так: Код // шаблон кнопки template<int row, int col, typename matrix> class button { private: matrix& m_; // ссылка на клавиатуру public: button(matrix& M): m_(M) {} bool pressed() { return m_.keymap & (row*5+col); } };
// класс клавиатуры class kbd { public: button<0, 0, kbd> Enter(this); void Scan(); }
void main() { kbd Kbd; Kbd.Scan(); if (Kbd.Enter.presed()) { } }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 15 2009, 18:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Waso @ Nov 15 2009, 12:34)  Если даже в классе кнопки ссылку обьявить как константу и задавать в конструкторе, компилятор всеравно ее пихает в ОЗУ..  А что ему еще делать? Если клавиатура одна - делайте ее члены и функции-члены статическими в базовом классе. Если клавиатур у вас несколько - кнопка должна знать, к какой имеено обращаться. Значит, ей нужна переменная для хранения указателя или ссылки. Даже если этот указатель компилятор расположит во флеше (и таких указателей несколько, ведь клавиатур тоже несколько) - ему надо как-то эти указатели различать, значит он вынужден будет хранить в кнопке какие-то данные, позволяющие выбрать нужный указатель.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 17 2009, 22:33
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Встретил в исходниках такую вот конструкцию Код #define putnstr(str,n) do { \ printf ("%.*s", n, str); \ } while (0) Почему использован цикл do-while ведь все-равно printf() один раз будет вызвано, как с ним, так и без него?
|
|
|
|
|
Nov 18 2009, 07:39
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(kurtis @ Nov 18 2009, 01:33)  Встретил в исходниках такую вот конструкцию Код #define putnstr(str,n) do { \ printf ("%.*s", n, str); \ } while (0) Почему использован цикл do-while ведь все-равно printf() один раз будет вызвано, как с ним, так и без него? Такая конструкция применяется если в теле макроса более одной операции (в данном случае эта конструкция излишняя). Пример: Код #define func(a) do { aa(a); bb(a); } while(0) #define func2(a) { aa(a); bb(a); }
if (some) func(a); else blablabla(a); // Ok if (some) func2(a); else blablabla(a); // Syntax error
|
|
|
|
|
Nov 18 2009, 14:51
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Код do { aa(a); bb(a); } while(0) Уже обсуждалось, поиск в помощь, сообщение от Сергея Борща было.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|