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

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


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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-битовое вычисление, а меньшее.
Go to the top of the page
 
+Quote Post
18 страниц V  « < 12 13 14 15 16 > »   
Start new topic
Ответов (195 - 209)
Golikov A.
сообщение Oct 12 2015, 19:40
Сообщение #196


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Меня можете не понимать, но то, что Вам сказал компилятор понимать просто ОБЯЗАНЫ

Вы даже не поняли что меня не понялиwink.gif ...

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

чтение из temp думаю знают процентов 10 если не меньше
а вот строку вида
Код
dummy = temp; //читаем temp в пустую переменную для правильной работы чего-то

правильно интерпретируют 99% (на вас я 1% запасwink.gif)

Это никак не связано с тем что temp должен быть объявлен как volatile и так далее, это из 2 разных частей. Для работы компилятора нужно одно, а для понимания проекта людьми, я убежден нужно другое.
То что надо обучать команду - здорово, но иногда от софта зависят жизни, в этом случае предпочту чтобы кто-то выжил, чем кто-то научился... Это не повод быдлокодить, но более развернутый код, не проигрывающий в производительности и не состоящий из заплаток по мне благо, и он лучше чем сокращенный до птичего языка. Есть любители которые в 2 строки впихивают по десятку операторов и очень этим горды, я бы им по рукам дал...


Цитата
Это, не одно и тоже. Прототипы появились позже. А необходимость декларировать тип возвращаемого значения функции таки была всегда

Я не застал время без стандартия и даже вроде как не первый стандарт застал. Потому мне не очень понятно что вы говорите, потому и примеры не столь наглядны....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2015, 06:03
Сообщение #197


Гуру
******

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



QUOTE (Golikov A. @ Oct 12 2015, 22:40) *
Вы даже не поняли что меня не понялиwink.gif ...

Да все я понял sad.gif. Это Вы упорно нелепость "оправдать" пытаетесь sad.gif. Уже до сохранении человеческих жизней при разработке софта недоучками договорились sad.gif - типа если писать больше говна, то это спасет мир sad.gif.
QUOTE
Я не застал время без стандартия и даже вроде как не первый стандарт застал. Потому мне не очень понятно что вы говорите, потому и примеры не столь наглядны....

Тогда, пожалуйста, просто подумайте, как до введения стандарта с прототипами, я должен был написать вызов функции находящейся в другом объекте компиляции и, например, возврашаюшей указатель на char. Прототипов нет. Написали вызов функции, а что она возвращает компилятору неведомо, ну точнее ведомо, что по умолчанию int. А если не int? Нужно как-то декларировать возвращаемое значение. Вызов компилятор по известым ему типам аргументов сделает, а что возвратят ему неведомо. Посему так:

char *function();
...
extern char *ptr;
...
ptr = function();
...
...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Oct 13 2015, 06:18
Сообщение #198


Местный
***

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



Цитата(Golikov A. @ Oct 12 2015, 22:40) *
чтение из temp думаю знают процентов 10 если не меньше

Двоечников всегда было больше... и что теперь... таблицу умножения переписывать заново... под каждого???
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 13 2015, 06:19
Сообщение #199


Универсальный солдатик
******

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



На что забивать голову былым? Все решалось теми способами, какие были доступны. Времена меняются, сущности совершенствуются...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2015, 06:24
Сообщение #200


Гуру
******

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



QUOTE (ViKo @ Oct 13 2015, 09:19) *
На что забивать голову былым? Все решалось теми способами, какие были доступны. Времена меняются, сущности совершенствуются...

но старые исходники все еще живут. Если не быть "чукча писатель", то читать и понимать написанное, тоже надо уметь.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 13 2015, 06:46
Сообщение #201


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Двоечников всегда было больше... и что теперь... таблицу умножения переписывать заново... под каждого???

Не надо путать теплое и мягкое, я не предлагаю ухудшать проект (это равносильно изменению таблицы умножения) я предлагаю писать его более защищено и от двоечников тоже, это равносильно раздать им калькуляторы.

Вот пример: все современные кассы в магазине имеют возможность ввести сколько дал клиент, и показать сколько надо дать сдачи. Это позволяет брать в кассиры людей по проще, и не доставлять неудобство клиентам. Понятно дело что таких самородков которые были в советское время и могли обсчитать так изящно что вы и не поймете не стало, но отрасль в целом по качеству улучшилась. Это как ремни безопасности, да где-то в единичных случаях они вредят, но в среднем помогают.


Цитата
Да все я понял sad.gif. Это Вы упорно нелепость "оправдать" пытаетесь sad.gif.

Да вы правы, это я зря пытался 2 раза стучать в закрытую дверь, не буду больше...

Цитата
char *function();

правильно я понимаю что функция могла принимать и не нулевой список параметров, и это получается такая служебная строчка в которой надо читать только выход?

Прикольно, я правда не застал времена без хедеров и прототипов, потому и не понимал, спасибо...
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Oct 13 2015, 06:56
Сообщение #202


Местный
***

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



Цитата(Golikov A. @ Oct 13 2015, 09:46) *
Не надо путать теплое и мягкое, я не предлагаю ухудшать проект (это равносильно изменению таблицы умножения) я предлагаю писать его более защищено и от двоечников тоже

Это и есть... из тёплого делать мягкое... вам просто это не понять... От незнаний и рождаются монстры... монстры порождают глюки... и т.д. ...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 13 2015, 07:05
Сообщение #203


Гуру
******

Группа: Свой
Сообщений: 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 монитора и огромного размера....

Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 13 2015, 07:21
Сообщение #204


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Oct 13 2015, 10:05) *
предпочту блок вида
Код
bus = get_addr(); // получаем адрес
if(bus !=0) //если не 0
   data = data_in; //забираем данные
else //для 0 адреса
  data = -1; //ставим флаг - 1

Посыл правильный, но с комментариями накосячили. Ну вот зачем писать "data = -1; //ставим флаг - 1" и т.д. и т.п.??? Одно из первых правил комментирования: не комментируйте то, что и так понятно (даже двоечнику).
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Oct 13 2015, 07:30
Сообщение #205


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2015, 08:10
Сообщение #206


Гуру
******

Группа: Свой
Сообщений: 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) *
Теперь приведите вы пример когда такой подход рождается монстра....

Так Вы уже и сами привели пример урода sad.gif. Вместо четкого и быстровоспринимаемого выражения нагородили сложное, которое быстро не воспирнимается, восприятие которого читающим зависит от форматирования, да еще утопили все это в ненужных комментариях отвлекажщих внимание читающего. Во всем этом буйстве букв, тем не менее остался отразчик классического дерьма:
-1
Может комментарии что-то прояснят?
//ставим флаг - 1

Потрясающе понятно sad.gif

Все это вместо того, что-бы написать одну строчку типа:

data = get_addr() ? data_in : END_DATA;












--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 13 2015, 08:12
Сообщение #207


Универсальный солдатик
******

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



Я выбираю первый вариант, что выдал Golikov, однозначно. Мне в нем все понятно, красиво, компактно. Комментарий написал бы перед строчкой, что-нибудь "прочитать шину".
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 13 2015, 08:26
Сообщение #208


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Oct 13 2015, 11:10) *
data = get_addr() ? data_in : END_DATA;

Минуточку! Там ещё было присваивание перед сравнением. А без присваивания я бы и сам так написал. ИМХО, тех, кто не понимает "?:", нельзя подпускать к клавиатуре.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 13 2015, 08:32
Сообщение #209


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Посыл правильный, но с комментариями накосячили. Ну вот зачем писать "data = -1; //ставим флаг - 1" и т.д. и т.п.??? Одно из первых правил комментирования: не комментируйте то, что и так понятно (даже двоечнику).

ну это так в спешке написанное.... имел ввиду что выдаем не значение а флаг, ну то есть что-то делаем и понятно комментируем

Цитата
Минуточку! Там ещё было присваивание перед сравнением

Именно меня бесят конструкции вида if(data = funct())
то есть вызываем функцию, ее результат присваиваем, и сразу используем в виде условия...

?: - хорошо, а когда это
? : ? : ? :....
да еще чтобы компактнее было пробелы повырезают....



Цитата
data = get_addr() ? data_in : END_DATA;

Кстати вот мы только что наблюдали типичную ошибку компактного стиля.
Человек с колосальным опытом, взглянув на его любимый стиль
Цитата
Вместо четкого и быстровоспринимаемого выражения нагородили сложное, которое быстро не воспирнимается,

и быстро воспринял конструкцию НЕ правильно.

так что дальше можно уже писать что угодно. Оно в жизьни именно так и бывает...



Цитата
Ну где-то так. В этом выражении () только для того, что-бы обозначить

Понятно, я такое реально не застал, познавательно, спасибо!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2015, 09:03
Сообщение #210


Гуру
******

Группа: Свой
Сообщений: 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())то есть вызываем функцию, ее результат присваиваем, и сразу используем в виде условия...

Это все от незнания языка sad.gif. Эллочка людоедка тоже владела небольшим подмножеством языка и ее тоже бесило, и на все ей непонятное отвечала что-то вроде "хаимишь парниша" sad.gif.
В языке абсолютно четко расписано что является результатом операции присваивания и порядок выполнения операций. Какие это дает поводы бесится, даже если написано
CODE
a = b = c = d;

?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

18 страниц V  « < 12 13 14 15 16 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:30
Рейтинг@Mail.ru


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