|
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Aug 28 2015, 11:21
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Делаю функцию программной задержки. (Длинная не нужна, естественно, но вопрос уже академический, захотел дойти до предела.) Каждый цикл выполняется за 4 такта, отсюда и деление на 4000. Нюансы не интересны, не в этом дело. Код #define SYSCLK 48000000ULL #define _NS 1 #define _US 1000 #define _MS 1000000 #define _SS 1000000000
#define DELAY(VALUE, UNIT); \ /* DelayFourCycles(VALUE * UNIT * (SYSCLK / 1000000) / 4000); */ \ DelayFourCycles((SYSCLK / 1000000) * VALUE * UNIT / 4000);
DELAY(50, _SS); Так вот, когда сделал, как в закомментированной строке, Кейл ругается на то, что число не влазит в int. И загружает в функцию абы что. Если же сделать, как в строке без комментария, то все вычисляется правильно. Выходит, Кейл видит что последовательность операций равнозначна, что со скобками, что без, и лихо их отбрасывает. Возникает переполнение. Хотя не понятно, отчего возникает, 64 битов должно хватать (на компьютерном калькуляторе хватает). Как будто у Кейла не 64-битовое вычисление, а меньшее.
|
|
|
|
|
 |
Ответов
(195 - 209)
|
Oct 12 2015, 19:40
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Меня можете не понимать, но то, что Вам сказал компилятор понимать просто ОБЯЗАНЫ Вы даже не поняли что меня не поняли  ... явное присвоение переменной - это не для компилятора а для других людей, чтобы не зависимо от их знания стандарта они видели что идет явное чтение. Вы может удивитесь, но то что строка вида Код temp; чтение из temp думаю знают процентов 10 если не меньше а вот строку вида Код dummy = temp; //читаем temp в пустую переменную для правильной работы чего-то правильно интерпретируют 99% (на вас я 1% запас  ) Это никак не связано с тем что temp должен быть объявлен как volatile и так далее, это из 2 разных частей. Для работы компилятора нужно одно, а для понимания проекта людьми, я убежден нужно другое. То что надо обучать команду - здорово, но иногда от софта зависят жизни, в этом случае предпочту чтобы кто-то выжил, чем кто-то научился... Это не повод быдлокодить, но более развернутый код, не проигрывающий в производительности и не состоящий из заплаток по мне благо, и он лучше чем сокращенный до птичего языка. Есть любители которые в 2 строки впихивают по десятку операторов и очень этим горды, я бы им по рукам дал... Цитата Это, не одно и тоже. Прототипы появились позже. А необходимость декларировать тип возвращаемого значения функции таки была всегда Я не застал время без стандартия и даже вроде как не первый стандарт застал. Потому мне не очень понятно что вы говорите, потому и примеры не столь наглядны....
|
|
|
|
|
Oct 13 2015, 06:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Golikov A. @ Oct 12 2015, 22:40)  Вы даже не поняли что меня не поняли  ... Да все я понял  . Это Вы упорно нелепость "оправдать" пытаетесь  . Уже до сохранении человеческих жизней при разработке софта недоучками договорились  - типа если писать больше говна, то это спасет мир  . QUOTE Я не застал время без стандартия и даже вроде как не первый стандарт застал. Потому мне не очень понятно что вы говорите, потому и примеры не столь наглядны.... Тогда, пожалуйста, просто подумайте, как до введения стандарта с прототипами, я должен был написать вызов функции находящейся в другом объекте компиляции и, например, возврашаюшей указатель на char. Прототипов нет. Написали вызов функции, а что она возвращает компилятору неведомо, ну точнее ведомо, что по умолчанию int. А если не int? Нужно как-то декларировать возвращаемое значение. Вызов компилятор по известым ему типам аргументов сделает, а что возвратят ему неведомо. Посему так: char *function(); ... extern char *ptr; ... ptr = function(); ... ...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 13 2015, 06:18
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Golikov A. @ Oct 12 2015, 22:40)  чтение из temp думаю знают процентов 10 если не меньше Двоечников всегда было больше... и что теперь... таблицу умножения переписывать заново... под каждого???
|
|
|
|
|
Oct 13 2015, 06:46
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Двоечников всегда было больше... и что теперь... таблицу умножения переписывать заново... под каждого??? Не надо путать теплое и мягкое, я не предлагаю ухудшать проект (это равносильно изменению таблицы умножения) я предлагаю писать его более защищено и от двоечников тоже, это равносильно раздать им калькуляторы. Вот пример: все современные кассы в магазине имеют возможность ввести сколько дал клиент, и показать сколько надо дать сдачи. Это позволяет брать в кассиры людей по проще, и не доставлять неудобство клиентам. Понятно дело что таких самородков которые были в советское время и могли обсчитать так изящно что вы и не поймете не стало, но отрасль в целом по качеству улучшилась. Это как ремни безопасности, да где-то в единичных случаях они вредят, но в среднем помогают. Цитата Да все я понял sad.gif. Это Вы упорно нелепость "оправдать" пытаетесь sad.gif. Да вы правы, это я зря пытался 2 раза стучать в закрытую дверь, не буду больше... Цитата char *function(); правильно я понимаю что функция могла принимать и не нулевой список параметров, и это получается такая служебная строчка в которой надо читать только выход? Прикольно, я правда не застал времена без хедеров и прототипов, потому и не понимал, спасибо...
|
|
|
|
|
Oct 13 2015, 06:56
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Golikov A. @ Oct 13 2015, 09:46)  Не надо путать теплое и мягкое, я не предлагаю ухудшать проект (это равносильно изменению таблицы умножения) я предлагаю писать его более защищено и от двоечников тоже Это и есть... из тёплого делать мягкое... вам просто это не понять... От незнаний и рождаются монстры... монстры порождают глюки... и т.д. ...
|
|
|
|
|
Oct 13 2015, 07:05
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
не надо крайностей, я всего лишь пытаюсь сказать что строчке вида Код data = (bus=get_addr()) ? data_in : -1; предпочту блок вида Код bus = get_addr(); // получаем адрес if(bus !=0) //если не 0 data = data_in; //забираем данные else //для 0 адреса data = -1; //ставим флаг - 1 Просто потому что читать легче и понять легче, даже тем кто не знает язык, но и тем кто знает проследить алгоритм легче, поддерживать легче, значит и ошибок в итоге меньше. Теперь приведите вы пример когда такой подход рождается монстра.... Только не надо про строчки на экран, сейчас можно по 2 монитора и огромного размера....
|
|
|
|
|
Oct 13 2015, 07:30
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Golikov A. @ Oct 13 2015, 10:05)  когда такой подход рождается монстра.... Одна строчка... или несколько??? Чудесно... когда незнания прикрываются "для лучшего понимания"... Ещё веселей... когда эмбеддерство сравнивают с работой кассира... Поменяйте их местами... Эмбеддер спросит... "Куда здесь подключиться, мне шрифт на чеке не нравится?"... кассир спросит... "Что нажать, чтобы выехал чек с уже готовой программой?"... Цитата(scifi @ Oct 13 2015, 10:21)  Одно из первых правил комментирования: не комментируйте то, что и так понятно (даже двоечнику). Просто... Одно из первых правил... двоечники не знают правил...
Сообщение отредактировал HHIMERA - Oct 13 2015, 07:31
|
|
|
|
|
Oct 13 2015, 08:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Golikov A. @ Oct 13 2015, 09:46)  правильно я понимаю что функция могла принимать и не нулевой список параметров, и это получается такая служебная строчка в которой надо читать только выход? Ну где-то так. В этом выражении () только для того, что-бы обозначить, что это имя функции, а не имя переменной. Соответственно передаваемым параметрам это просто никак не отосится. QUOTE (Golikov A. @ Oct 13 2015, 10:05)  Теперь приведите вы пример когда такой подход рождается монстра.... Так Вы уже и сами привели пример урода  . Вместо четкого и быстровоспринимаемого выражения нагородили сложное, которое быстро не воспирнимается, восприятие которого читающим зависит от форматирования, да еще утопили все это в ненужных комментариях отвлекажщих внимание читающего. Во всем этом буйстве букв, тем не менее остался отразчик классического дерьма: -1 Может комментарии что-то прояснят? //ставим флаг - 1 Потрясающе понятно  Все это вместо того, что-бы написать одну строчку типа: data = get_addr() ? data_in : END_DATA;
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 13 2015, 08:32
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Посыл правильный, но с комментариями накосячили. Ну вот зачем писать "data = -1; //ставим флаг - 1" и т.д. и т.п.??? Одно из первых правил комментирования: не комментируйте то, что и так понятно (даже двоечнику). ну это так в спешке написанное.... имел ввиду что выдаем не значение а флаг, ну то есть что-то делаем и понятно комментируем Цитата Минуточку! Там ещё было присваивание перед сравнением Именно меня бесят конструкции вида if(data = funct()) то есть вызываем функцию, ее результат присваиваем, и сразу используем в виде условия... ?: - хорошо, а когда это ? : ? : ? :.... да еще чтобы компактнее было пробелы повырезают.... Цитата data = get_addr() ? data_in : END_DATA; Кстати вот мы только что наблюдали типичную ошибку компактного стиля. Человек с колосальным опытом, взглянув на его любимый стиль Цитата Вместо четкого и быстровоспринимаемого выражения нагородили сложное, которое быстро не воспирнимается, и быстро воспринял конструкцию НЕ правильно. так что дальше можно уже писать что угодно. Оно в жизьни именно так и бывает... Цитата Ну где-то так. В этом выражении () только для того, что-бы обозначить Понятно, я такое реально не застал, познавательно, спасибо!
|
|
|
|
|
Oct 13 2015, 09:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (scifi @ Oct 13 2015, 11:26)  Минуточку! Там ещё было присваивание перед сравнением. А без присваивания я бы и сам так написал. ИМХО, тех, кто не понимает "?:", нельзя подпускать к клавиатуре. Там было CODE bus = get_addr(); // получаем адрес if(bus !=0) //если не 0 data = data_in; //забираем данные else //для 0 адреса data = -1; //ставим флаг - 1 Я не вижу никакого другого использования bus для чего либо. Еще вопросы? QUOTE (Golikov A. @ Oct 13 2015, 11:32)  Именно меня бесят конструкции вида if(data = funct())то есть вызываем функцию, ее результат присваиваем, и сразу используем в виде условия... Это все от незнания языка  . Эллочка людоедка тоже владела небольшим подмножеством языка и ее тоже бесило, и на все ей непонятное отвечала что-то вроде "хаимишь парниша"  . В языке абсолютно четко расписано что является результатом операции присваивания и порядок выполнения операций. Какие это дает поводы бесится, даже если написано CODE a = b = c = d; ?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|