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

 
 
> Вопросы по изучению Си
Владимир_2010
сообщение Mar 8 2009, 07:13
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087



Здравствуйте.
Месяца два назад сел за изучение микроконтроллеров AVR. Почитал книгу «Белов А. В. Создаём устройства на микроконтроллерах. 2007», проделал примерчики в CodeVisionAVR, пощупал аврстудию, погонял схемки в протеусе, попрошивал мегу8 на stk500, на макетке собрал. Чувствую что знаний по языку Си не хватает. Имеет ли смысл на некоторое время забыть про микроконтроллеры, установить что-нибудь вроде Microsoft Visual Studio и начать изучать язык Си по книге про чистый Си без привязки к микроконтроллерам, например, по книге 1) Керниган&Ритчи в списке?! Но не знаю, хватит ли на чистый Си сил и энтузиазма, без привязки к микроконтроллерам читать тяжело, да и времени на чтение мало – микроконтроллеры это пока хобби. Или может быть продолжать читать книги по микроконтроллерам?! Но там язык Си рассмотрен поверхностно – пролетарская суть не ясна.
Поискал в сети книги по чистому Си (без плюсов), литературы на русском – мало. Вот что удалось найти:
1) Керниган, Ритчи. Язык Си
2) Керниган, Ритчи. Язык программирования Си
3) Керниган, Пайк. Практика программирования
4) Шилдт. Полный справочник по C
Остальная доступная в сети литература по Си с первого взгляда менее привлекательна:
5) Афанасьев. Программирование на языке Си
6) Богатырев. Руководство полного идиота по программированию на C
7) Болский. Язык программирования Си
8) Бочков. Язык программирования Cи для ПК
9) Голицина. Основы алгоритмизации и программирования
10) Крупник. Изучаем Си
11) Подбельский. Программирование на языке Си
12) Фьюэр. Задачи по языку С
14) Хэзфилд. Искусство программирования на C
13) Шилтд. С для профессиональных программистов
Отдельный вопрос по классической книге:
15) «Роберт Седжвик. Фундаментальные алгоритмы на C. Части 1 - 5. Анализ. Структуры данных. Сортировка. Поиск. Алгоритмы на графах» Книга того же автора с тем же названием встречались мне для С++ - изучать ли ее или попытаться найти эту книгу для чистого Си в бумажном виде?! Верно ли утверждение: «Седжвика можно брать и с "C++" в названии. На самом деле там все равно чистый C». Что еще из книг маскирующихся в названии под «С++» пригодно для изучения про чистый Си?!
Если что-то из доступных в сети электронных книг по чистому Си пропустил, пожалуйста, дополните.
Может быть есть что то из достойных «бумажных» книг по Си, что не выложено в сеть и стоит найти?! Наверное, нужны книги не просто справочник и не с примитивом, а книга учебная, что бы много различных примеров разобрано, приложений, от простого к сложному и через них вся суть и обобщения. Вот например книги с громкими и многообещающими аннотациями:
16) Прата. Язык программирования C (Си). Лекции и упражнения
h**p://www.livelib.ru/book/1000163060
17) Кочан. Программирование на языке C (Си)
h**p://www.williamspublishing.com/Books/5-8459-1088-9.html
Но за громкими и красивыми обложками, аннотациями, часто бывают пустышки которые лучше даже не читать.
Вечные вопросы: что делать и стоит ли вообще читать или может так и ходить неграмотным и программировать методом тыка?! Как развиваться дальше, что читать, в каком порядке читать и что в первую очередь читать?!
Спасибо за внимание и советы.

Сообщение отредактировал Владимир_2010 - Mar 8 2009, 07:15
Go to the top of the page
 
+Quote Post
7 страниц V  « < 4 5 6 7 >  
Start new topic
Ответов (75 - 89)
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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