Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

51 минуту назад, WinneR сказал:

#include "add.c"

Так делать не стоит. 

Все исходники должны компилироваться независимо.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

53 минуты назад, WinneR сказал:

Создал, как положено 2 файла add.h и add.c

попробуйте для начала сравнить с как положено: http://www.pic24.ru/doku.php/osa/articles/modules

единственная ошибка в хедере глобал функции как и глобал переменные объявляются через extern

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

13 минуты назад, IMXO сказал:

Вы уверены, что по этой ссылке на самом деле написано, как "положено"? Я изучал исходники OSA - они целиком и полностью написаны, как НЕ положено. При всем уважении к изобретательности автора OSA-ы, брать на вооружение его подходы категорически не посоветую.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, WinneR сказал:

почему ошибки касаются только N4?

потому что поставив extern вы указали что переменные N1,N2,N3,N4 описаны в другом месте и тут же для N4 сделали описание присвоив ей значение \0, и к тому же эта строка в мейне нак не нужна, она нужна в хедере, который в мейн вы подключили инклюдом.

18 минут назад, ARV сказал:

Вы уверены

какое отношение пример оформления модуля  имеет к исходникам ОСы ? конкретные   претензии к статье  есть?

Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, IMXO сказал:

какое отношение

Ну, с моей точки зрения, рекомендовать другим и не делать так самому - это тревожит, навевает мысли, что что-то в советах автора не так... Поэтому я высказал сомнения...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

13 часа назад, ARV сказал:

Так делать не стоит. 

Все исходники должны компилироваться независимо.

Но, если не присоединить add.c ошибок ещё больше, какие точно ошибки не помню, бука под рукой нет((( 

 

12 часа назад, IMXO сказал:

потому что поставив extern вы указали что переменные N1,N2,N3,N4 описаны в другом месте и тут же для N4 сделали описание присвоив ей значение \0, и к тому же эта строка в мейне нак не нужна, она нужна в хедере, который в мейн вы подключили инклюдом.

Почитав несколько статей, понял то, что в .с файлах необходимо просто объявить переменные, а в main.cpp указать, что они extern и присвоить им начальное значение. Или я не прав? Что касательно переменных N1-N4 они в майне ещё как нужны, они используются в обработчике прерываний 0 таймера. 

Ссылка на комментарий
Поделиться на другие сайты

13 минуты назад, WinneR сказал:

если не присоединить add.c ошибок ещё больше

add.c надо добавлять в перечень исходников проекта, если в студии. Если с "голым" makefile, то в нем вручную дописывать в нужном месте.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

13 часа назад, ARV сказал:

Вы уверены, что по этой ссылке на самом деле написано, как "положено"? Я изучал исходники OSA - они целиком и полностью написаны, как НЕ положено. При всем уважении к изобретательности автора OSA-ы, брать на вооружение его подходы категорически не посоветую.

ВСЕ ТАКИ, КАК ПРАВИЛЬНО???? 

Ссылка на комментарий
Поделиться на другие сайты

У вас почти все правильно, за исключением приинклюживания adc.c. Статья написана в слегка догматном стиле, но неприемлемых советов там нет.

Вы в студии пишите или как?

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

add.c надо добавлять в перечень исходников проекта, если в студии. Если с "голым" makefile, то в нем вручную дописывать в нужном месте.

Оба файла есть в папке с проектом, лежат вместе с main. cpp

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, WinneR сказал:

лежат вместе

Лежат - не значит, что компилируются.

.cpp - это С++. у вас нет ни байта из С++, у вас голый Си, делайте правильные расширения, т.к. avr-gcc принципиально по-разному их компилирует.

Еще раз спрашиваю: вы студией пользуетесь или чем?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

Лежат - не значит, что компилируются.

.cpp - это С++. у вас нет ни байта из С++, у вас голый Си, делайте правильные расширения, т.к. avr-gcc принципиально по-разному их компилирует.

Еще раз спрашиваю: вы студией пользуетесь или чем?

Да, 7 студией, вроде именно с++, в обычном с нет типа bool, у меня он есть. 

Изменено пользователем WinneR
Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, WinneR сказал:

в обычном с нет типа bool

Да ладно! :) 

Если #define bool uint8_t вам не подходит по религиозным причинам, а typedef uint8_t bool; вы не применяете по незнанию, то уж #include <stdbool.h> однозначно снимает вопросы.

С++ не единственным bool отличается от Си...

В студии надо ДОБАВИТЬ файл add.c в проект средствами управления проектом. Наверное, кликом правой кнопки на дереве проекта в подкатегории source files (сорри, я со студией не работаю, и могу дать не самый корректный совет по работе с нею).

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

я сталкивался с такой проблемой. атмел студия может создавать как .с так и .срр файлы. так вот .с почему то не катит, заработала с .срр

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

Да ладно! :) 

Если #define bool uint8_t вам не подходит по религиозным причинам, а typedef uint8_t bool; вы не применяете по незнанию, то уж #include <stdbool.h> однозначно снимает вопросы.

С++ не единственным bool отличается от Си...

В студии надо ДОБАВИТЬ файл add.c в проект средствами управления проектом. Наверное, кликом правой кнопки на дереве проекта в подкатегории source files (сорри, я со студией не работаю, и могу дать не самый корректный совет по работе с нею).

Про тайпдеф и дефайн я знаю, а вот про stdbool не знал. Спасибо! Вот вопрос, решит ли добавление проблему? Я уже писал в первом сообщении, что если функция не использует глобальных переменных, то все гуд. Соответственно я делаю вывод, что проблема в них. А может и нет... 

2 часа назад, Дмитрий Мамедиев сказал:

я сталкивался с такой проблемой. атмел студия может создавать как .с так и .срр файлы. так вот .с почему то не катит, заработала с .срр

Т. Е попробовать вместо add. с создать add. cpp? 

Изменено пользователем WinneR
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, WinneR сказал:

попробовать вместо add. с создать add. cpp? 

Проверить, что ваш проект из категории "С Projqct", а не "С++ Project"

Вместо .cpp везде использовать только .c

Проверить, что в проект входят ВСЕ файлы *.c

Проверить, что *.h инклюдятся только там, где требутся находящиеся в них описания

Проверить, что глобальные переменные описаны в .h файле(ах) с префиксом extern

Проверить, что только в одном из файлов .c имеется опредление глобальных переменных (если их несколько, они могут быть в разных файлах, но дублирования быть не должно), в т.ч. с присваиванием им значений "по умолчанию"

Проверить, что в файлах *.h нет реализации и/или использования функций

Проверить, что в файлах *.h нет описаний переменных без extern 

Как-то так сделать и должно помочь.

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

 

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, WinneR сказал:

Т. Е попробовать вместо add. с создать add. cpp? 

ага

 

9 минут назад, ARV сказал:

Вместо .cpp везде использовать только .c

почему?

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, Дмитрий Мамедиев сказал:

почему?

До тех пор, пока вы не начнете писать на С++, нет никакого смысла мимикрировать.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

Проверить, что ваш проект из категории "С Projqct", а не "С++ Project"

Вместо .cpp везде использовать только .c

Проверить, что в проект входят ВСЕ файлы *.c

Проверить, что *.h инклюдятся только там, где требутся находящиеся в них описания

Проверить, что глобальные переменные описаны в .h файле(ах) с префиксом extern

Проверить, что только в одном из файлов .c имеется опредление глобальных переменных (если их несколько, они могут быть в разных файлах, но дублирования быть не должно), в т.ч. с присваиванием им значений "по умолчанию"

Проверить, что в файлах *.h нет реализации и/или использования функций

Проверить, что в файлах *.h нет описаний переменных без extern 

Как-то так сделать и должно помочь.

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

 

Но тогда, как быть с main.cpp? Переименовать в с? Несовсем понятно с глобальным переменными. У меня переменные N1-N4 используются и в main.cpp и в add.с, в каком из файлов я могу присвоить им начальное значение, а в каком просто объявить? 

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, WinneR сказал:

в каком из файлов я могу присвоить им начальное значение, а в каком просто объявить? 

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

Ссылка на комментарий
Поделиться на другие сайты

14 минуты назад, WinneR сказал:

Но тогда, как быть с main.cpp? Переименовать в с?

А разве мои слова можно трактовать неоднозначно?

14 минуты назад, WinneR сказал:

Вместо .cpp везде использовать только .c

 

14 минуты назад, WinneR сказал:

в каком из файлов я могу присвоить им начальное значение, а в каком просто объявить?

Разберемся по порядку.

1. int a; - описали и объявили (реализовали).

2. extern int a; - только описали

3. a=1; - использовали

4. int a=1; - описали, объявили (реализовали) и использовали.

Описание - это "такая переменная где-то есть"

Реализация - это "под такую переменную здесь выделена память"

Использоваие - это "память из-под этой переменной заполнена этим значением" (как вариант).

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

Так вот: переменные могут быть ТОЛЬКО ОПИСАНЫ в заголовках .h, т.е. допустим только вариант 2 (точнее - синтаксисом Си допустимы любые варианты, но делать так крайне, настоятельно, бесусловно нежелательно).

Описывать переменные одного типа можно одной строкой, будь их хоть сто штук. 

Но вариант 4 допустим для каждой переменной только один раз, т.е. подобная конструкция для extern-переменной должна встречаться среди всех .c файлов только один раз.

Поэтому правильно:

adc.h => extern int m1, m2, m3; 

adc.c => int m1 = 0;

Не правильно:

adc.h => extern int m1=0;

adc.c => int m1 = 0;

Не правильно:

adc.h => extern int m1, m2, m3;

adc.c => int m1 = 0;

 

9 минут назад, Дмитрий Мамедиев сказал:

как их правильно обьявить чтоб они были видны во всем проекте и во всех .с

Описать. Описать в заголовке и проинклюдить это заголовок везде, где нужны эти переменные. Только в одном-единственном месте каждую переменную реализовать (ну или объявить).

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

А разве мои слова можно трактовать неоднозначно?

 

Разберемся по порядку.

1. int a; - описали и объявили.

2. extern int a; - только описали

3. a=1; - использовали

4. int a=1; - описали, объявили и использовали.

Так вот: переменные могут быть ТОЛЬКО ОПИСАНЫ в заголовках .h, т.е. допустим только вариант 2 (точнее - синтаксисом Си допустимы любые варианты, но делать так крайне, настоятельно, бесусловно нежелательно).

Описывать переменные одного типа можно одной строкой, будь их хоть сто штук. 

Но вариант 4 допустим для каждой переменной только один раз, т.е. подобная конструкция для extern-переменной должна встречаться среди всех .c файлов только один раз.

Поэтому правильно:

adc.h => extern int m1, m2, m3; 

adc.c => int m1 = 0;

Не правильно:

adc.h => extern int m1=0;

adc.c => int m1 = 0;

Не правильно:

adc.h => extern int m1, m2, m3;

adc.c => int m1 = 0;

 

Описать. Описать в заголовке и проинклюдить это заголовок везде, где нужны эти переменные. Только в одном-единственном месте каждую переменную реализовать (ну или объявить).

Спасибо! Вечером буду пробовать, о результатах отпишусь! 

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, WinneR сказал:

Спасибо!

Я откорректировал пост, перечитайте! 

И не надо цитировать сообщение полностью - это и правилами не приветствуется, и общению не помогает.

Имхо, при переводе книжек по Си исторически сложилось так, что одно и то же называется разными терминами, что серьезно путает мысли в голове.

Поэтому я лично придерживаюсь собственной терминологии из "общего программирования", о чем уже выше написал.

Каждый элемент программы на Си может быть описан, реализован и использован. Как следует понимать три этих термина - я кратко описал на примере переменных ранее, но и для других "элементов" программы (констант, макросов, функций) на Си это верно. Правда, есть исключения, например, для макросов и констант - они описываются и реализуются одновременно всегда.

В случае с функциями:

Описание функции - это её пртотип: int foo(int bar); (без фигурных скобок, зато с точкой с запятой в конце)

Реализация функции - это наполнение её "телом", т.е. приделывание ей блока кода в фигурных скобках, зато без точки с запятой в конце.

Использование функции - ну, это, надеюсь, понятно.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

дело в том что если я пишу так в ADC.cpp то все норм

#include "ADC.h"
unsigned int volt;
unsigned int amper;

но как только я их переношу в .h вылетает мильон ошибок

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...