Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/128: Рейтинг темы: голосов - 128, средняя оценка - 4.76
Myshoit7
0 / 0 / 0
Регистрация: 16.07.2012
Сообщений: 91
1

Помощь в языке Си

15.01.2013, 01:39. Просмотров 23224. Ответов 62
Метки нет (Все метки)

Подскажите где в хелпах найти описание сишных команд и примеры кода, либо литературу, по форуму темку где-то видел. Но найти не смог. Только осваиваю Си для микрокотроллеров. Помогите.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 01:39
Ответы с готовыми решениями:

Помощь в самом языке
Объясните пожалуйста как писать на с++ программы.Всмысле какие нужно писать библиотеки,как написать...

как этот код на языке с++ будет выглядить на языке php?
#include <iostream> using namespace std; const int LEN = 80; class instrument{ private: ...

Конвертер для перевода программ на языке PHP в текст программы на языке Assembler
Всем привет. Как можно реализовать такую задачу? Разработать конвертор в языке Assembler для...

GeoTiff - примеры ее использования на языке c , желательно на русском языке
Добрый вечер. Дана курсовая с использованием библиотеки GeoTiff. Подскажите где можно прочитать про...

Создать шуточную программу, которая при вводе имени на русском языке выдаст, как оно звучит на японском языке
Такая задача была сегодня на программировании. Создать шуточную программу, которая при вводе имени...

62
OrtimKOD
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
04.02.2013, 03:50 41
Цитата Сообщение от Kymo
Если флеша много, то ...
Флеша много не бывает. Бывает мало фантазии/времени его весь забить. ;)
0
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
04.02.2013, 12:55 42
Кстати советую книжку Прата "Язык программирования C" (именно С, а не С++. Последнее издание 5)
Там классно всё расписано, указаны тонкости. Особенности стандартов C99, C89.
Например про память:
int i=1000;
for (int i=0; i<10; i++)
{
int i=100;
}
Будет проинициализировано 3 переменные и цикл выполнитрся 10 раз.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
04.02.2013, 13:09 43
за такие тонкости надо на лбу печать выжигать: говнокодер.
0
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
04.02.2013, 13:18 44
Цитата Сообщение от Ymk
за такие тонкости надо на лбу печать выжигать: говнокодер.
Ну не быдло ли ты?:)
Во-первых, в C89 в параметрах оператора инициализацию нельзя было сделать.
Во-вторых, это было не к тонкостям, а к вопросу про автоматические переменные и то что она затирается при выходе из блока.
0
Sym
0 / 0 / 0
Регистрация: 16.12.2016
Сообщений: 1
04.02.2013, 13:49 45
Цитата Сообщение от Striss
Кстати советую книжку Прата "Язык программирования C" (именно С, а не С++. Последнее издание 5)
Там классно всё расписано, указаны тонкости. Особенности стандартов C99, C89.
Например про память:
Код:
int i=1000;
for (int i=0; i<10; i++)
{
int i=100;
}
Будет проинициализировано 3 переменные и цикл выполнитрся 10 раз.

Количество переменных не важно, а вот количество выполнений не всегда угадаешь, обычно +-1 цикл, пользуюсь всем одновременно, си, макросы на бэйсике, и дельфи, но знаю одно, питон круче :)

Код
for (int i=0; i=10; i++)

for (int i=1; i>=10; i++)

for I:=0 to 10 do

for i=1 to 10
..
next I

While I>10 do
repeat

begin
until I<10
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
04.02.2013, 13:57 46
Цитата Сообщение от OrtimKOD
ЗЫ, Оптимизатор вообще шутник тот еще - он может выкидывать из кода целые куски программы если он посчитает, что выкидывание такого куска ничего не изменит.
Небольшое замечание: выкидывает только если изменит, а именно - уменьшит время выполнения/размер, но функционирование не изменится. А вот задача программиста - объяснить компилятору что нельзя оптимизировать.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
04.02.2013, 14:51 47
Цитата Сообщение от Striss
Ну не быдло ли ты?:)
не знаю:)
мой коммент был вот про это:
Цитата Сообщение от Striss
Например про память:
int i=1000;
for (int i=0; i<10; i++)
{
int i=100;
}
Будет проинициализировано 3 переменные и цикл выполнитрся 10 раз.
и мнения я своего не поменяю. круто себя убеждать, что ты понимаешь все эти тонкости, но как только с проектом захочет поработать кто-либо еще (или ты сам через 5 лет, когда уже подзабудешь детали) - то, что подобный код - говнокод - станет очевидно. да и напиши немного больше кода - сам же допустишь в нем ошибку, а потом будешь дебажить, почему у тебя вместо А получается Б. никогда такие хакерские приёмчики (аля "смотрите как я могу!") до добра не доводят.
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
04.02.2013, 15:07 48
Маскирование переменных - зло во плоти. После n-времени такое становится Write-only code даже для автора, потому что такое легче переписать по спецификации нежели дебажить. И молитесь что бы спецификация соответствовала коду, а не была тоже write-only, потому что баги могли быть учтены как фичи.
0
Myshoit7
0 / 0 / 0
Регистрация: 16.07.2012
Сообщений: 91
05.02.2013, 21:22 49
Вопрос резко в сторону, но может направите?!
Вот тут с прерываниями разбираюсь, все понятно в принципе, но вот с настройками упарился..... Может у Atmel есть какое нормальное описание настроечных регистров?! А то по даташиту надоело уже ползать(( . ATmega8.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
05.02.2013, 21:40 50
Цитата Сообщение от sym
TCCR1B = TCCR1B | (1 << CS12)|(0 << CS11)|(1 << CS10);

Очень громоздкие конструкции. Надо бы написать функцию и пользоваться, типа

Код:
SetByt(TCCR1B,CS12);
SetByt(TCCR1B,CS10);
ClrByt(TCCR1B,CS11);

Помоему намного нагляднее.

В итоге тот же самый код( в лучшем случае) обрастет оберткой из вызова и возврата .
Классика дурдуиноводства ...
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
05.02.2013, 21:50 51
инлайн решит проблему оберток.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
05.02.2013, 22:55 52
Цитата Сообщение от Ymk
инлайн решит проблему оберток.
У sym это не озвучено, не забываем что этим кто то может воспользоваться ...
0
Sym
0 / 0 / 0
Регистрация: 16.12.2016
Сообщений: 1
06.02.2013, 00:59 53
Цитата Сообщение от dosykus_2
Цитата Сообщение от sym
TCCR1B = TCCR1B | (1 << CS12)|(0 << CS11)|(1 << CS10);

Очень громоздкие конструкции. Надо бы написать функцию и пользоваться, типа

Код:
SetByt(TCCR1B,CS12);
SetByt(TCCR1B,CS10);
ClrByt(TCCR1B,CS11);

Помоему намного нагляднее.

В итоге тот же самый код( в лучшем случае) обрастет оберткой из вызова и возврата .

Ну и что? Зато так нагляднее и быстрее. А ошибка в одном бите может может обойтись в миллионные убытки, когда изделие пойдет в серию. Или при задержке проекта.

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

Классика дурдуиноводства ...
Во фразе нет логики, набор букв ))
0
OrtimKOD
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
06.02.2013, 02:58 54
Цитата Сообщение от sym
Зато так нагляднее и быстрее.
Не нагляднее, не быстрее, а иногда и просто недопустимо. Некоторые биты такими обертками вообще нельзя поменять.
Цитата Сообщение от sym
На ПК половина программ уже вообще не компилируется, на Питоне пишется байт код и упаковывается под видом исполняемого файла, например Dropbox наш любимый,
Компиляция в байт-код это такая-же компиляция как и в нативный. Разница лишь в том, что такая компиляция идет под виртуальную машину.
Цитата Сообщение от sym
и никто с производительностью не заморачивается, труд программистов дороже чем затраты на апгрейд компов.
"С какой скоростью должна работать корпорация Майкрософт, что-бы пользователи ПК не заметили постоянный рост их производительности"...

Действительно, куда заморачиваться если ограничений на производительность/память/потребление/реакцию/размеры нет. Особенность в том, что тут обсуждаем не программирование под ПК, а программирование под устройства которые имеют память и тактовую частоту в несколько тысяч раз меньше и очень часто непрерывно молотить бесполезный код они не имеют права(обязаны спать и не рыпаться).
0
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
06.02.2013, 13:46 55
Цитата Сообщение от sym
Надо бы написать функцию и пользоваться, типа

Код:
SetByt(TCCR1B,CS12);
SetByt(TCCR1B,CS10);
ClrByt(TCCR1B,CS11);

Помоему намного нагляднее.
Да-да-да... осталось только дописать коменты...
Код
SetByt(TCCR1B,CS12);    // Устанавливаем бит CS12 регистра TCCR1B
SetByt(TCCR1B,CS10);    // Устанавливаем бит CS10 регистра TCCR1B
ClrByt(TCCR1B,CS11);     // Сбрасываем бит CS11 регистра TCCR1B
... и получаем наглядный пример быдлокодоламерописательства... ))))))
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
06.02.2013, 15:44 56
Цитата Сообщение от sym
Во фразе нет логики, набор букв ))
Кто бы спорил .
Не забываем , что само понятие логика - для вас нонсенс...
0
Myshoit7
0 / 0 / 0
Регистрация: 16.07.2012
Сообщений: 91
07.02.2013, 17:09 57
Ребята как в этом коде определяется разряд и его значение? Блин. На асме делали раньше, но вот я чето запамятовал как =\

PORTD = ~(SEGMENT[dysplay1 % 10000 / 1000]); // здесь раскладываем число на разряды

Понял уже =) Столько нужно держать в голове. Тут же при выполнении арифметического оператора "/" не учитывается дробная часть)
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
07.02.2013, 17:18 58
Берём остаток от деления на 10000 и получаем число от 0 до 9999, затем делим на 1000 и получаем количество тысяч. Ну а значение берётся из массива а потом инвертируется.
0
Myshoit7
0 / 0 / 0
Регистрация: 16.07.2012
Сообщений: 91
07.02.2013, 17:48 59
Цитата Сообщение от omx
Берём остаток от деления на 10000 и получаем число от 0 до 9999, затем делим на 1000 и получаем количество тысяч. Ну а значение берётся из массива а потом инвертируется.
Пасиба)
0
Myshoit7
0 / 0 / 0
Регистрация: 16.07.2012
Сообщений: 91
09.04.2013, 18:24 60
Вот тут вопрос возник. Разбирал по примерам библиотеку для работы с RTC DS1307. Там функция странненько так обьявлена:

Код
// Функция чтения данных из DS1307
uint8_t DS1307Read(uint8_t address,uint8_t *data)
{
uint8_t res; // Результат
I2CStart(); // START
res = I2CWriteByte(0b11010000); // адрес DS1307 + бит W
if(!res)    return 0; // ОШИБКА
// Передача адреса необходимого регистра
res = I2CWriteByte(address);
if(!res)    return 0; // ОШИБКА
I2CStart(); // Повторный START
res = I2CWriteByte(0b11010001); // адрес DS1307 + бит R
if(!res)    return 0; // ОШИБКА
// Чтение данных с NOASK
res = I2CReadByte(data,0);
if(!res)    return 0; // ОШИБКА
I2CStop(); // STOP
return 1;
}
Вопрос собственно таков: что за спецификатор типа: "uint8_t ?" Что-то я не понимаю....
И еще: uint8_t res; // Результат - это одно название переменной?
0
09.04.2013, 18:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 18:24

На русском языке или языке программирования
Опишите на русском языке или на одном из языков программирования алгоритм получения из...

В чем разница между "Порядок выполнения программ на языке C" и "Структура программы на языке C"
в конспектах у себя не нашел, хоть и записывал все, что объяснял преподаватель. вот, собственно,...

1с Помощь
Проблема такая.. Открываю журнал-ордер счета по субконтам, а затем пытаюсь сохранить как таблицу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru