Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-мар-29 18:55

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 14 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Работа в Keil
СообщениеДобавлено: 2019-сен-12 16:09 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Уважаемые форумчане. Те кто работает в Кейл подскажите. Как должна быть организована программа в Кейл? Например в Хелпе к Микробейсику есть такое указание как в приведенном здесь мною тексте. И нарушение этого порядка приводит к ошибкам компиляции. Есть ли такое-же указание для Кейла? Я не нашел.


Вложения:
Организация программы.zip [1.05 КБ]
160 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-12 16:16 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
Я бы сказал, все что используется ниже, должно быть описано выше. Все как в обычном Си, да и наверное везде.
Лучше спросите конкретно на что ругается компилятор.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-12 17:02 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Пока он не ругается. Дело в том, что 2 года назад я начинал осваивать Миландровские контроллеры, СИ и Кейл. До этого много работал с разными Бейсиками для МК. Год назад вновь отошел от СИ, а последнее время осваивал Микробейсик, который во многом похож на СИ. Так вот там небольшое нарушение порядка приводило к ошибкам. Вот поэтому я и решил прежде уяснить для себя этот вопрос в Кейле. Я думаю, что в этой программе есть какие то свои правила на этот счет.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-13 08:49 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
Я думаю, что в этой программе есть какие то свои правила на этот счет.
Правила не у программы, а у компилятора, линкера. Они же просто повторяют требования стандартов с89/с99/с11.
Любой объект программы сначала объявляется, затем определяется, потом используется. Во многих случаях объявление и определение можно совместить в одном предложении - например константу или явно инициализируемую переменную. Но, в любом случае, использовать объект в программе можно только после его объявления, а не до.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-13 09:27 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
Если совсем с нуля, то можно почитать:
"Изучаем программирование на C" - Дэвид Гриффитс, Дон Гриффитс, серия "Head First".
Максимально подробно и доходчиво.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-13 14:41 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Professor Chaos писал(а):
Правила не у программы, а у компилятора, линкера.
Под словом программа я имел в виду комплекс Keil в состав которого входят и компилятор, и линкер, и т.п.
Professor Chaos писал(а):
Любой объект программы сначала объявляется, затем определяется, потом используется. Во многих случаях объявление и определение можно совместить в одном предложении - например константу или явно инициализируемую переменную. Но, в любом случае, использовать объект в программе можно только после его объявления, а не до..
И с этим все ясно. Нельзя пользоваться(использовать) тем, что еще не определено!
Я имел в виду можно ли определять функции до main: и после. Можно ли определять переменные после определения функции, при условии, что эта функция их не использует. Ну и т.п.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-13 14:52 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Vasiliy писал(а):
Если совсем с нуля, то можно почитать:
Вообще то не совсем с нуля, но тем не менее спасибо.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-13 20:18 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
И с этим все ясно. Нельзя пользоваться(использовать) тем, что еще не определено!
Видимо не всё.
Тем, что ещё НЕ ОПРЕДЕЛЕНО пользоваться можно, если оно ОБЪЯВЛЕНО. Нельзя пользоваться тем, что НЕ ОБЪЯВЛЕНО. Между ОПРЕДЕЛЕНИЕМ и ОБЪЯВЛЕНИЕМ есть существенная разница. И ваши вопросы говорят, что вы её не понимаете. Как только уясните - все вопросы обретут простые и логичные ответы.
vladh писал(а):
Я имел в виду можно ли определять функции до main: и после. Можно ли определять переменные после определения функции, при условии, что эта функция их не использует. Ну и т.п.
Можно определять функции как до, так и после main(), можно вообще в других .с файлах проекта. Порядок и место определения функций не важен. Он может быть любым. А вот объявлять их следует до, если они используются внутри функции main(), или вне её, или просто в этом файле. Это называется прототипы функций. Например в С++ это, вообще, обязательное требование стандарта, а не рекомендация по хорошему стилю программирования: все функции обязательно должны иметь прототипы.
Переменные можно объявлять когда и где угодно/удобно, но ДО их первого использования в текущем файле.
Поймите, каждый .с файл компилируется отдельно. Поэтому в каждом .с файле в начале должны быть ОБЪЯВЛЕНЫ все используемые в нем объекты: типы, функции, переменные, константы и пр. Если определения каких-то объектов находятся в других .с файлах, то объявление, как-правило, делается включением соответствующих .h файлов директивой #include.
Я предпочитаю делать отдельный файл .с со всеми глобальными объектами программы. И делать соответствующий ему .h файл со всеми этими же объектами, но с квалификатором extern. Далее этот .h файл инклудится во все прочие .с файлы, которые используют глобальные объекты. Это позволяет держать все глобальные объекты программы в одном месте, а не иметь их разбросанными по куче исходников.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-14 16:01 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Professor Chaos писал(а):
Видимо не всё.
Тем, что ещё НЕ ОПРЕДЕЛЕНО пользоваться можно, если оно ОБЪЯВЛЕНО.
Но как Вы будете пользоваться функцией, которую объявили, но которую еще не определили?
Professor Chaos писал(а):
Я предпочитаю делать отдельный файл .с со всеми глобальными объектами программы. И делать соответствующий ему .h файл со всеми этими же объектами, но с квалификатором extern. Далее этот .h файл инклудится во все прочие .с файлы, которые используют глобальные объекты. Это позволяет держать все глобальные объекты программы в одном месте, а не иметь их разбросанными по куче исходников.
По-моему так делать действительно удобно.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-15 10:23 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
Но как Вы будете пользоваться функцией, которую объявили, но которую еще не определили?
Для примера, дам выдержку из одной из книжек Герберта Шилдта, касаемую прототипов функций и их использования:
Открыть Прототипы функций
В C++ все функции должны быть объявлены до их использования. Обычно это реализуется с помощью прототипа функции. Прототипы содержат три вида информации о функции:
• тип возвращаемого ею значения;
• тип ее параметров;
• количество параметров.

Прототипы позволяют компилятору выполнить следующие три важные операции.
• Они сообщают компилятору, код какого типа необходимо генерировать при вызове функции. Различия в типах параметров и значении, возвращаемом функцией, обеспечивают разную обработку компилятором.
• Они позволяют C++ обнаружить недопустимые преобразования типов аргументов, используемых при вызове функции, в тип, указанный в объявлении ее параметров, и сообщить о них.
• Они позволяют компилятору выявить различия между количеством аргументов, используемых при вызове функции, и количеством параметров, заданных в определении функции.

Общая форма прототипа функции аналогична ее определению за исключением того, что в прототипе не представлено тело функции:
тип имя_функции(тип имя_параметра1, тип имя_параметра2, . . .,тип имя_параметраN);
Использование имен параметров в прототипе необязательно, но позволяет компилятору идентифицировать любое несовпадение типов при возникновении ошибки, поэтому лучше имена параметров все же включать в прототип функции.

Определение функции может также служить в качестве своего прототипа, если оно размещено до первого ее использования в программе. Обычно все же проще объявить прототип для всех функций, используемых в программе, вместо определения до их вызова. Особенно это касается больших программ, в которых трудно отследить последовательность вызова одних функций другими. Более того, возможны ситуации, когда две функции вызывают друг друга. В этом случае необходимо использовать именно прототипы.
Закрыть
Книжка хоть и по С++, но все советы и рекомендации абсолютно применимы к Си.

Пример для демонстрации самого принципа
Открыть Пример кода
// файл main.c

int summ;
int add(int a, int b);  // объявление ф-ции суммирования (прототип)


// главная ф-ция программы
int main(void) {
    summ = add (5,20); // применяем объявленную выше ф-цию
    return 0;
}


// Определение ф-ции суммирования (реализация)
int add(int a, int b) {
    return a+b;
}
Закрыть
Как видно, объявление ф-ции помещено до её первого использования в файле, а определение после. Компилятору этого достаточно. Он не выдаст ошибки. Более того, определение (реализацию) функции add можно убрать из файла main.c, и поместить в другой, например add.c и добавить его в проект. Получим второй вариант программы:
Открыть второй вариант
// файл main.c

int summ;
int add(int a, int b);  // объявление ф-ции суммирования (прототип)


// главная ф-ция программы
int main(void) {
    summ = add (5,20); // применяем объявленную выше ф-цию
    return 0;
}
// файл add.c

// Определение ф-ции суммирования (реализация)
int add(int a, int b) {
    return a+b;
}
Закрыть
Далее можно объявление ф-ции add (прототип) исключить из файла main.c, и поместить его в файл add.h, a в файле main.c добавить строку #include "add.h". Получаем третий вариант той же программы:
Открыть третий вариант
// файл main.c

int summ;

// Включаем заголовочные файлы с прототипами всех используемых ф-ций
#include "add.h"


// главная ф-ция программы
int main(void) {
    summ = add (5,20); // применяем объявленную выше ф-цию
    return 0;
}
// файл add.h
// Заголовочный файл, содержащий прототипы функций, определённых в файле add.c

int add(int a, int b);  // объявление ф-ции суммирования (прототип)
// файл add.c

// Определение ф-ции суммирования (реализация)
int add(int a, int b) {
    return a+b;
}
Закрыть
Все эти способы для компилятора эквивалентны. Но последний - самый удобный и канонический при написании больших многофайловых проектов. Это де-факто стандарт хорошего стиля программирования. Придерживайтесь его.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-17 15:42 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Professor Chaos, спасибо за советы.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-сен-21 09:49 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Ещё одно правило, фактически стандарт.
Во всех заголовочных файлах используйте защиту от множественного включения.
Например, заголовочный файл foo.h должен иметь следующую структуру:
#ifndef FOO_H_INCLUDED_ 
    #define FOO_H_INCLUDED_ 
    // содержимое файла - объявления типов, прототипов функций и т.п.

    // конец всех объявлений
#endif   // #ifndef FOO_H_INCLUDED_
Для наглядности откройте любой библиотечный .h файл из SPL или пака для Кейл - увидите эту типовую структуру своими глазами.
Подробности можно посмотреть в книге Кернигана, Пайка "Практика программирования" или Саттера, Александреску "Стандарты программирования на С++". Наверняка есть и в других.

Также почитайте эту статью. Там много полезных советов.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-дек-16 18:16 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 64
Организация: АО "РИРВ"
Откуда: СПБ
Professor Chaos писал(а): *
Я предпочитаю делать отдельный файл .с со всеми глобальными объектами программы. И делать соответствующий ему .h файл со всеми этими же объектами, но с квалификатором extern. Далее этот .h файл инклудится во все прочие .с файлы, которые используют глобальные объекты. Это позволяет держать все глобальные объекты программы в одном месте, а не иметь их разбросанными по куче исходников.
Спорный вопрос. Грамотное разделение на модули сильно упрощает жизнь при использовании наработок в новых проектах. Особенно строгое разделение "железа", вычислений и интерфейсов.


Вернуться к началу
 Заголовок сообщения: Re: Работа в Keil
СообщениеДобавлено: 2019-дек-16 20:49 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
azimuth писал(а): *
Спорный вопрос. Грамотное разделение на модули сильно упрощает жизнь при использовании наработок в новых проектах.
Разделение на модули и создание всех глобальных объектов программы в одном файле не противоречат друг другу. Они независимы и никак друг с другом не связаны. Как кислое и мягкое. Это два независимых подхода, которые могут применяться как вместе, так и по-отдельности. Или не применяться.
Модуль - он не порождает объекты. Он их описывает. Модуль содержит описание типа, структуры, класса и т.п. без порождения экземпляров (объектов) данных типов, структур классов.
Порождение же объектов (экземпляров), т.е. выделение под них памяти, может быть как разбросано по нескольким исходникам проекта, так и собрано в одном. Мне удобнее второй вариант.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 14 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB