AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
максим-ка
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс фев 28, 2010 13:11:58
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение максим-ка »

ворос, почему не работает это выражение

Код: Выделить всё

PORTC = Dig[(lvl/255)*10];

а именно участок

Код: Выделить всё

(lvl/255)*10
результат выражения постоянно не правильный(0).
переменная lvl типа int может меняться в промежутке от 0 до 255.
она берётся из АЦП, если это важно.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

максим-ка писал(а):а именно участок

Код: Выделить всё

(lvl/255)*10
результат выражения постоянно не правильный(0).
переменная lvl типа int может меняться в промежутке от 0 до 255.
она берётся из АЦП, если это важно.

результат постоянно правильный - НОЛЬ, если в lvl у вас не 255. а важно совсем другое: что вы, не изучив язык Си, бросаетесь писать программы. интересно, какое число вы надеялись получить при целочисленном делении, например, 10 на 255? если НЕ НОЛЬ - то бегом читать букварь по Си!!!
битва с дураками проиграна, победители торжествуют. слава победителям!
максим-ка
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс фев 28, 2010 13:11:58
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение максим-ка »

а как тогда можно реализовать это?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

вам как, побыстрее или все-таки правильно? ;)
битва с дураками проиграна, победители торжествуют. слава победителям!
максим-ка
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс фев 28, 2010 13:11:58
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение максим-ка »

хотелось бы правильно
максим-ка
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс фев 28, 2010 13:11:58
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение максим-ка »

сделал так:

Код: Выделить всё

lvl = (lvl1/255)*10;
PORTC = Dig[lvl];

где переменная lvl1 типа double берётся из АЦП.
это работает.
но правильно ли? может можно проще?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

максим-ка писал(а):хотелось бы правильно
тогда скачиваете книжку "Язык Си" Кернигана и Ритчи (основателей языка) и внимательно-внимательно читаете про то, как Си работает с числами и константами разных типов, какие вобще бывают типы чисел и чем они отличаются, как вычисляются выражения и т.п. можно и другие книги (лучше зарубежных авторов). когда сами сможете ответить на вопрос, почему у вас получался ноль - тогда можно будет считать, что цель почти достигнута.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

максим-ка писал(а):сделал так:


но правильно ли? может можно проще?

Код: Выделить всё

PORTC = Dig[lvl*10/255];//LVL по любому придется double делать
В поисках истины человек развивается.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

vitalik_1984 писал(а):

Код: Выделить всё

PORTC = Dig[lvl*10/255];//LVL по любому придется double делать
нет, чтобы книжку почитать...

Код: Выделить всё

PORTC = Dig[(lvl*10)/255];//LVL по любому НЕ придется double делать
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

Мастер Ломастер писал(а):
vitalik_1984 писал(а):

Код: Выделить всё

PORTC = Dig[lvl*10/255];//LVL по любому придется double делать
нет, чтобы книжку почитать...

Код: Выделить всё

PORTC = Dig[(lvl*10)/255];//LVL по любому НЕ придется double делать

герой мастер говорит загадками.
сказал бы что нужно бит выставить, чтоб перевести сохранение данных ацп в формат 8старших бит,тогда не придется.
Подробнее можно почитать в литературе для контроллера.
В поисках истины человек развивается.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: AVR studio 4 в вопросах и ответах

Сообщение BerZerK-ku »

vitalik_1984 писал(а):

Код: Выделить всё

PORTC = Dig[lvl*10/255];//LVL по любому придется double делать
Мастер Ломастер писал(а):

Код: Выделить всё

PORTC = Dig[(lvl*10)/255];//LVL по любому НЕ придется double делать
Может поясните чем отличаются эти строки? На мой взгляд ничем :)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

vitalik_1984 писал(а):герой мастер говорит загадками.
сказал бы что нужно бит выставить, чтоб перевести сохранение данных ацп в формат 8старших бит,тогда не придется.
если бы я хотел сказать про аппаратную часть МК, я бы сказал про аппаратную. но я хотел сказать про программу - и я про нее сказал. проблема автора этой строчки кода в том, что он не понимает, как в Си вычисляются выражения... что при целочисленном делении МЕНЬШЕГО числа на БОЛЬШЕЕ всегда получается ноль, который потом как ни умножай - будет ноль. и аппаратура МК тут совершенно ни при чем.
BerZerK-ku писал(а):Может поясните чем отличаются эти строки? На мой взгляд ничем
тогда скажите, какой из вариантов будет считать хоть как-то (может, и не так, как желал бы автор, но давать не всегда нулевой результат):
1. PORTC = Dig[(lvl*10)/255];
2. PORTC = Dig[(lvl/255)*10];
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: AVR studio 4 в вопросах и ответах

Сообщение BerZerK-ku »

:))) вообще речь шла немного о других строках, не правда ли?
Оба выражения не будут давать всегда 0 результат, даже в том что вы привели.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

вы в своем амплуа :) даже скучновато становится. ладно, закроем тему:
1. в Си не определен однозначно порядок вычисления равноприоритетных операций. поэтому я не надеюсь на весьма шаткий шанс, что выражение будет вычисляться слева направо и ставлю скобки - приоритет операции в скобках становится выше и можно быть уверенным, что она выполнится обязательно раньше, чем заскобочная.
2. в стандарте Си сказано, что все значения выражений, которые МОГУТ быть вычислены на этапе компиляции (или обработки препроцессором), на самом деле МОГУТ быть вычислены именно на этом этапе. поэтому я считаю весьма опасной запись x*10/255, потому как слово "МОГУТ" означает, что не исключен тот факт, что компилятор вычислит 10/255 на этапе компиляции и далее... сами понимаете :) поэтому я опять-таки ставлю скобки, повышая приоритет умножения и снижая вероятность подозрительных действий компилятора.
3. с учетом ранее сказанного мною про ненулевой результат поясняю два варианта из предыдущего моего поста: первый вариант будет давать результат в диапазоне от 0 до 10 в зависимости от значения переменной lvl, а второй - только 0 или 10, причем 0 для большинства значений переменной, а 10 - для единственного.

удовлетворены? еще вопросы есть?
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: AVR studio 4 в вопросах и ответах

Сообщение BerZerK-ku »

1. Приведите пожалуйста источник в котором говорится о том что порядок вычисления равноприоритетных операций не определен. Мне очень интересно взглянуть на используемый вами стандарт С. Согласно моим сведениям выполнение идет слева направо, исключение из правила знаю только одно.
2. Какой-то сумбур, без скобок компилятор поделит, а со скобками не станет? вот бы взглянуть на теорию, к сожалению даже не задумывался о подобном.
3. цитирую ваш вопрос:
Мастер Ломастер писал(а):тогда скажите, какой из вариантов будет считать хоть как-то (может, и не так, как желал бы автор, но давать не всегда нулевой результат)
мой ответ:
BerZerK-ku писал(а):оба выражения не будут давать всегда 0 результат, даже в том что вы привели.
Чего я не правильно сказал-то? Зачем этот пункт в вашем посте? Вы же сами пишите что есть один вариант ненулевой :dont_know:
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

1. ищите сами, если вам это надо. мне и так хорошо.
2. см. п.1
3. есть разница между "сказать то" и "не сказать не то".

на ваш вопрос о том, чем различаются эти строки с моей точки зрения - я ответил? чего вам нужно еще? я вам свою т.з. не навязываю - вы можете поступать, как сочтете нужным. и даже не сообщать об этом на форуме :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: AVR studio 4 в вопросах и ответах

Сообщение BerZerK-ku »

1. http://sanych99.narod.ru/New_Site/books/kr/035.html Ознакомьтесь с табличкой и примите к сведению на будущее.
2. См. пункт 1.
3. Это был ответ на конкретный вопрос, о каких недоговорках речь идет :dont_know:
К сожалению "моя точка зрения" и реальность зачастую различаются. А "моя точка зрения" которую не можешь обосновать, вообще ничего не стоит.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Мастер Ломастер »

1. вы же вроде как взывали к стандарту Си? а привели выдержку из книжки, в которой даже нет и словечка о порядке вычисления подряд идущих одноприоритетных операций! тем более с участием констант! :))) это в вашем стиле, браво!
2. см. п.1
3. у вас, конечно, может вызывать сожаление упомянутый вами же факт, а я стараюсь таких "сожалений" избегать путем простой перестраховки со скобками. придерживаюсь шутливого правила "много скобок не бывает" :) и знаете, сильно помогает не сожалеть о чем-то!
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: AVR studio 4 в вопросах и ответах

Сообщение BerZerK-ku »

Т.е. выдержка из книги одних из основоположников современного Си ничего не стоит против вашего мнения?
Мастер Ломастер писал(а):даже нет и словечка о порядке вычисления подряд идущих одноприоритетных операций
Да как нет-то? У вас наверное фильтр стоит, настроенный на ваше мнение. Вы вглядитесь получше в англицкие буковки и может они у вас в слова сложатся.
Хотя начинаю понимать, вы учились программировать по внегласным правилам, это там сказано что надо всегда ляпать скобки чтобы все работало как задумано?
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: AVR studio 4 в вопросах и ответах

Сообщение ВитГо »

А чем плохо использование скобок ?

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

p.s. пошел зализывать обиду :-)
Ответить

Вернуться в «AVR»