реклама на сайте
подробности

 
 
7 страниц V  « < 4 5 6 7 >  
Reply to this topicStart new topic
> Вопросы по изучению Си
ReAl
сообщение Nov 9 2009, 14:34
Сообщение #76


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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;
}
и это должен нормально отработать любой компилятор.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
arm123
сообщение Nov 9 2009, 14:37
Сообщение #77


Участник
*

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



С точки зрения быстродействия все таки да мне кажется переменные нужно объявлять как можно локальнее... к примеру тогда максимальное число переменных будут загружаться через регистры а не через память. Прав я или нет? В чем ещё преимущества объявления переменных как можно локальнее.

Сообщение отредактировал arm123 - Nov 9 2009, 15:05
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 9 2009, 15:30
Сообщение #78


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(arm123 @ Nov 9 2009, 17:37) *
С точки зрения быстродействия все таки да мне кажется переменные нужно объявлять как можно локальнее... к примеру тогда максимальное число переменных будут загружаться через регистры а не через память. Прав я или нет? В чем ещё преимущества объявления переменных как можно локальнее.


Я привел ссылку на конкретную книгу где все по пунктам расписано. Наверное не сложно эту книгу найти и прочесть.
Go to the top of the page
 
+Quote Post
arm123
сообщение Nov 9 2009, 15:52
Сообщение #79


Участник
*

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



Цитата(sergeeff @ Nov 9 2009, 18:30) *
Я привел ссылку на конкретную книгу где все по пунктам расписано. Наверное не сложно эту книгу найти и прочесть.

Там анализ идет в первую очередь касательно удобочитаемости и большей вероятностью ошибится нежели вопрос оптимизации и быстродействия.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Nov 9 2009, 16:05
Сообщение #80


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Не забудьте инициализировать переменную, т.е. должно быть как-то так
Код
какие-то действия
if (условие) {
   uint32_t count = SOME_VALUE; // какое-то нужно Вам значение
   ***
}
else {
  ***
}

У Вас тут ошибки не закралось? Я хочу сказать, что за переделами if(){} не будет существовать такой переменной как count или будет использована переменная из глобальной области видимости.
Как дальше по тексту будет использоваться переменная count?
Go to the top of the page
 
+Quote Post
arm123
сообщение Nov 9 2009, 19:41
Сообщение #81


Участник
*

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



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

ну если быть точным то ситуация такая
Код
uint32_t count;
какие-то действия
if( условие )
{
   *** (тут count используется)
}
else
{
  *** (тут count не используется)
}
***
(тут count не используется)


Ну я для себя ответ понял, переменные нужно делать максимально локальнее, за исключением циклов smile.gif
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 13 2009, 15:13
Сообщение #82


Местный
***

Группа: Свой
Сообщений: 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(); но тут отдельный объект с отдельными переменными - неправильно
    }
}

Так вот ВНИМАНИЕ ВОПРОС: как правильно описать классы, если мне надо чтоб дочерние объекты не копировали родительский метод и переменные, а пользовались ими, влияли на них.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 13 2009, 22:34
Сообщение #83


фанат дивана
******

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



Наследовать кнопку от клавиатуры - это, имхо, переборsmile.gif Достаточно хранить в кнопке ссылку на клавиатуру.
Типа так:
Код
// шаблон кнопки
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())
    {
    }
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 13 2009, 22:40
Сообщение #84


Гуру
******

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



Цитата(Waso @ Nov 13 2009, 17:13) *
чтоб дочерние объекты не копировали родительский метод и переменные, а пользовались ими, влияли на них.
Делать такие функции-члены и переменные родителя статическими. Если родитель может существовать более чем в одном экземпляре - надо вместо наследования использовать указатель или ссылку. Т.е. кнопка живет отдельным объектом и в конструкторе получает ссылку или указатель на клавиатуру. Или кнопка является членом класса клавиатуры, и для доступа к клавиатуре получает ссылку или указатель в конструкторе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 15 2009, 10:34
Сообщение #85


Местный
***

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



Хорошо, но тогда эти ссылки будут храниться в ОЗУ, а ето непозволительный оверхед! Если даже в классе кнопки ссылку обьявить как константу и задавать в конструкторе, компилятор всеравно ее пихает в ОЗУ.. sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2009, 18:14
Сообщение #86


Гуру
******

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



Цитата(Waso @ Nov 15 2009, 12:34) *
Если даже в классе кнопки ссылку обьявить как константу и задавать в конструкторе, компилятор всеравно ее пихает в ОЗУ.. sad.gif
А что ему еще делать? Если клавиатура одна - делайте ее члены и функции-члены статическими в базовом классе. Если клавиатур у вас несколько - кнопка должна знать, к какой имеено обращаться. Значит, ей нужна переменная для хранения указателя или ссылки. Даже если этот указатель компилятор расположит во флеше (и таких указателей несколько, ведь клавиатур тоже несколько) - ему надо как-то эти указатели различать, значит он вынужден будет хранить в кнопке какие-то данные, позволяющие выбрать нужный указатель.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kurtis
сообщение Nov 17 2009, 22:33
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Встретил в исходниках такую вот конструкцию
Код
#define putnstr(str,n)  do {            \
        printf ("%.*s", n, str);    \
    } while (0)

Почему использован цикл do-while ведь все-равно printf() один раз будет вызвано, как с ним, так и без него?
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 18 2009, 07:39
Сообщение #88


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Nov 18 2009, 14:51
Сообщение #89


Начинающий профессионал
*****

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



Код
do { aa(a); bb(a); } while(0)

Уже обсуждалось, поиск в помощь, сообщение от Сергея Борща было.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Herz
сообщение Nov 18 2009, 15:39
Сообщение #90


Гуру
******

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



Цитата
if (some) func2(a); else blablabla(a); // Syntax error

Разве? Почему?
Go to the top of the page
 
+Quote Post

7 страниц V  « < 4 5 6 7 >
Reply to this topicStart new topic
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01531 секунд с 7
ELECTRONIX ©2004-2016