ikm 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Хочу сделать задержку на старте : #define START_DELAY 3 // задержка при старте и паузе, с (max 65535) void start_delay (void) // Задержка на старте { volatile int i = START_DELAY; while (i) {delay_ms(1000); i--;} } void main(void) {... } При компиляции CAVR пишет предупреждение: unused function 'start_delay' was removed by the linker Да конечно можно просто поставить delay_ms(3000); и забыть, но у меня задача разобраться. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба unused function 'start_delay'"У нас принято джентельменам верить на слово". Попробуйте так: void main(void) { start_delay (); ... } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 16 марта, 2017 Опубликовано 16 марта, 2017 (изменено) · Жалоба del Изменено 16 марта, 2017 пользователем aiwa Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба void main(void) { start_delay (); ... } А чем это отличается от delay_ms( ); Не понял про "джентельменов" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Не понял про "джентельменов" Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете. А чем это отличается от delay_ms( ); delay_ms - библиотечная? Тогда у компилятора не может быть никаких претензий. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Не понял про "джентельменов"Если компилятор говорит, что вы не используете эту функцию, у меня нет оснований ему не верить. Вы пишете, что хотите сделать задержку, а компилятор говорит, что вы этого не делаете. Я показал, как сделать то, что вы хотите и убрать это сообщение компилятора. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Хочу сделать задержку на старте : Родовой 'баг' любого компилятора в том, что он делает код для того, что програмист написал, а не для того, о чем он думал. Может вы и хотели сделать 'задержку на старте', но вы ее не сделали. Вы только подготовились к этому действу, написав функцию. Теперь неплохо было бы ее вызвать - сам компилятор этого делать не будет Если вы хотите обеспечить автоматическую задержку всегда, не пиша ее вызов явно, то вам надо изучать возможности неявного вызова вашей функции до main. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете. delay_ms - библиотечная? Тогда у компилятора не может быть никаких претензий. delay_ms конечно библиотечная, к ней вопросов нет. Она успешно используется в теле цикла main. Только сейчас сложил ваш ответ и предыдущий и понял. Что я создал функцию strart_delay () и должен был использовать её в теле самого main. Спасибо за разъяснения. Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем :) ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем :) ) У меня как раз не правильное представление было вообще о порядке обработке компилятором написаного кода. Я понимаю,что я могу описывать любую функцию в любом месте, даже в отдельном файле и потом вставить в main. Но не понимал,что компилятор обрабатывает только main, и смотрит если эта функция там не используется, то он её не выполняет. Хотя может и это представление не до конца верно. И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела main, или это всё глупости, и надо просто писать последовательность вызова функций в самом main и морочить голову? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела mainЧто бы исполнить функцию, нужно выполнить ее вызов (написать ее имя с круглыми скобками после него, ну и возможно с параметрами в скобках). Вызов сам по себе является исполняемым кодом, и должен быть вставлен где то, где допустим исполняемый код. В С такое место одно - тело какой либо функции. Таким образом функции могут вызываться только из других функций. Очевидно, что должна существовать точка, от которой все будет расти - это и есть функция main. Т.е. ответ - в С функции могут исполняться только внутри тела другой функции (не обязательно main), но не на глобальном уровне. В С++ есть еще одно место, где допустим исполняемый код - инициализация переменных. Т.е. в С++ функцию можно вызвать так: int start_delay() { ... } int some_unused_var = start_delay(); ... void main() { ... } Или с помощью классов, но это не интересно (так как тривиально) :rolleyes: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Спасибо большое Всем за разъяснения. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться