|
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
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-битовое вычисление, а меньшее.
|
|
|
|
|
 |
Ответов
(135 - 149)
|
Oct 8 2015, 13:31
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(GetSmart @ Oct 8 2015, 14:55)  На тему нововведений хочется прояснить ещё один любопытный нюанс. В интернете написано, что до стандарта 89 года пустой список аргументов функций объявлялся пустыми скобками. А что стали обозначать пустые скобки со стандарта 89 года, там написано?
|
|
|
|
|
Oct 10 2015, 05:46
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(den_po @ Oct 8 2015, 17:31)  А что стали обозначать пустые скобки со стандарта 89 года, там написано? Видимо некорректно и неточно написал, скопипастив источник интернета. Void навязывается только в прототипах функций. Но из-за этого он допускается и во всех остальных местах объявления заголовков функций. И эта полумера/полутребование кривое вдвойне. Либо что-то важное ещё не озвучено. Golikov A. Невозможно забыть/опечататься в определении функции с её телом, а так же при её вызове, т.к. у компилятора есть вся информация для выявления ошибки. В прототипе тоже сомнительно.
Сообщение отредактировал GetSmart - Oct 10 2015, 05:51
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 10 2015, 06:59
|

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

|
QUOTE (GetSmart @ Oct 10 2015, 08:46)  Невозможно забыть/опечататься в определении функции с её телом, Это Вы за себя говорите, или за всяких "кодеров" (не понимаюших правил хрошего тона в языке но наплодивших и продлжкющих плодить всякое) тоже? Вот что это: smart(); 1) Вызов функции; 2) Опредеоение функции; 3) Макрос; QUOTE а так же при её вызове, т.к. у компилятора есть вся информация для выявления ошибки. Нету. Как Вы не можете без void отличить быдлокодеровское определение функции с возвращаемым int от вызова функции, так и компилятор этого не может. Посему ныне требуемое определение функции: void function(void); вполне логично, void function(); нелогично, а function(); использовать нельзя, по тому, что это на самом деле, благодаря  изначально заложенной глупости, совсем другая функция: int function(void); зато, блин, оталась возможноcть писать: function(void); Проблема в том, что изменения ( изменения, а не дополнения ) в стандарте страдают полумерами  - вводя тот-же void, надо было запрешать и по умолчанию возвращаемое int. Но ведь сколько "кодеров" такое УЖЕ размножили в мириадах строк, как и дикое while(1)  . Вот и тянут
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 10 2015, 07:50
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(zltigo @ Oct 10 2015, 10:59)  нелогично, а function(); использовать нельзя, по тому, что это на самом деле, благодаря  изначально заложенной глупости, совсем другая функция: int function(void); int function(); и int function(void); это в си совсем не одно и то же
|
|
|
|
|
Oct 10 2015, 15:12
|

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

|
QUOTE (den_po @ Oct 10 2015, 10:50)  int function(); и int function(void); это в си совсем не одно и то же Да ну! Не дайте помереть невежей - поведайте в чем-же это было раньше отличие. QUOTE (ViKo @ Oct 10 2015, 10:09)  В С99 неявный возвращаемый int убрали. А вы все старье обсуждаете. Убрали убрали так, что какой-нибудь GCC максимум предупреждение выдает, да и то подавлнное.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 10 2015, 15:40
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(zltigo @ Oct 10 2015, 19:12)  Да ну! Не дайте помереть невежей - поведайте в чем-же это было раньше отличие. Отличие и сейчас есть. Первый вариант позволяет вызвать функцию с любым числом аргументов.
|
|
|
|
|
Oct 10 2015, 16:20
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(den_po @ Oct 10 2015, 19:40)  Отличие и сейчас есть. Первый вариант позволяет вызвать функцию с любым числом аргументов. В какого года стандарте это определено? int function(); На этот вариант 4-ый Кейл выдаёт варнинг - "deprecated". Ругается даже на static-прототип без void в пустом списке аргументов. zltigo void в месте возвращаемого функцией значения к делу отношения не имеет. Там void ни с чем не конфликтует. Странно только, что неявным там был int, а не отсутствие возвращаемого значения (aka void в будущем).
Сообщение отредактировал GetSmart - Oct 10 2015, 16:45
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 10 2015, 17:08
|

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

|
QUOTE (den_po @ Oct 10 2015, 18:40)  Первый вариант позволяет вызвать функцию с любым числом аргументов. Разумеется нет. И вообще "любое" в Cи вообще не сущесвует, ибо даже funсtion(...); , если компилятор и не выдаст ошибку, как минимум бессмысленна, посему - funсtion( param, .... ); То есть не менее одного. QUOTE (GetSmart @ Oct 10 2015, 19:20)  void в месте возвращаемого функцией значения к делу отношения не имеет. Имеет, как пример полностью однозначного определения функции и когда убрали разрешенную неопределенность с возвращаемым значением, стало логичным убрать ее и в передаваемым значением.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 10 2015, 19:26
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(GetSmart @ Oct 10 2015, 20:20)  В какого года стандарте это определено? С того же 89 оно упоминается. Тогда оно было "устаревающим", сейчас устаревшее, но из стандарта не удалённое. Цитата(zltigo @ Oct 10 2015, 21:08)  Разумеется нет. И вообще "любое" в Cи вообще не сущесвует, ибо даже funktion(...); , если компилятор и не выдаст ошибку, как минимум бессмысленна, посему - funktion( param, .... ); То есть не менее одного. Гуглите, читайте, пробуйте.
|
|
|
|
|
Oct 10 2015, 20:34
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(zltigo @ Oct 11 2015, 00:18)  Понятно. Просто сбрехали. Вы из тех, кто считает себя слишком опытным, чтоб допустить свою неправоту, да?
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|