Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 31.03.2017, 00:23   #1
StrDm
Member
 
Регистрация: 13.05.2014
Адрес: Москва
Возраст: 40
Сообщений: 57
Вес репутации: 100/12
StrDm will become famous soon enoughStrDm will become famous soon enough
По умолчанию Си, значение переменных short и int в pic16

Всем привет.

Подскажите пожалуйста, что я делаю не так?
Сам уже разобраться отчаялся.

Независимо от объявленного типа переменной, ее значение доходит до 255 и потом отсчитывается сначала через ноль. Т-е она ведет себя как переменная unsigned char.
Тип переменной пробовал объявлять short, unsigned short, int, unsigned int. Все эти варианты компилятор принимает, ни на что не ругается, но результат один и тот же.

Используется это в конструкции типа:
Код:
for (count=1; count<=1020; count++){}
Пробовал вместо for использовать
Код:
while (count<=1020){
...
...
count++}
это конечно ни на что не повлияло.
В железе правда не пробовал, трассировал в протеусе, на моделях PIC16F630 и PIC16F628A. Писал/компилировал - в MPLAB 8.30, HITECH PICC 9.71a.

Program space, Data space - все с большим запасом.

Протеус через несколько циклов выводит ругалку "Stack overflow executing CALL instruction". Но именно через несколько, т-е не в момент первого сброса переменной в ноль.

Последний раз редактировалось StrDm; 31.03.2017 в 00:37.
StrDm вне форума   Ответить с цитированием
Старый 31.03.2017, 06:41   #2
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 34
Сообщений: 507
Вес репутации: 183/35
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Си, значение переменных short и int в pic16

Это задержка? Проектик протеуса прикрепите
CERGEI вне форума   Ответить с цитированием
Старый 31.03.2017, 06:46   #3
Vano
Junior Member
 
Регистрация: 27.02.2007
Возраст: 38
Сообщений: 13
Вес репутации: 100/39
Vano will become famous soon enoughVano will become famous soon enough
По умолчанию Re: Си, значение переменных short и int в pic16

Где доказательства того, что
Цитата:
Сообщение от StrDm Посмотреть сообщение
ее значение доходит до 255 и потом отсчитывается сначала через ноль.
Vano вне форума   Ответить с цитированием
Старый 31.03.2017, 11:39   #4
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/37
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Си, значение переменных short и int в pic16

В своей практике встречал такую ошибку по невнимательности: в файле file1.c объявляется переменная:
extern int temp;
В этом файле например:
temp=256;
В файле file2.c эта переменная определяется:
char temp;
Ошибок и предупреждений при этом естественно не возникает.
Результат: temp=0 и следующая ячейка памяти еще пострадала (туда 1 записалась).
Pasha_Bi вне форума   Ответить с цитированием
Старый 04.04.2017, 08:03   #5
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 44
Сообщений: 1,256
Вес репутации: 1557/61
DimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant future
По умолчанию Re: Си, значение переменных short и int в pic16

Хм. Вообще интересно - почему компилятор не дает ни ошибки ни ворнинга?
Попробовал только что для Кортекса М7 (F7) в ИАРе - та-же фигня.
В одном файле
char tmp;

tmp=40; (если поставить 400 - ругается).

в другом файле:
extern int tmp;

tmp=4000; - не ругается.

компилируется предупреждений.
DimaS вне форума   Ответить с цитированием
Старый 04.04.2017, 08:26   #6
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,285
Вес репутации: 4191/114
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от DimaS Посмотреть сообщение
компилируется предупреждений.
И в кейле аналогично (ARMCC). Это больше похоже на расстройство речемыслительной деятельности в искусственном языке и анализ бреда пациента.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 04.04.2017 в 08:43.
Pridnya вне форума   Ответить с цитированием
Старый 04.04.2017, 10:03   #7
siarzhuk
Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 46
Сообщений: 89
Вес репутации: 761/16
siarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to behold
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от DimaS Посмотреть сообщение
В одном файле
char tmp;

tmp=40; (если поставить 400 - ругается).

в другом файле:
extern int tmp;

tmp=4000; - не ругается.
Единица компиляции - файл. Линкер работает с объектом, именуемым _tmp, в первом объектном файле, и ссылкой на объект с именем _tmp из другого объектного файла. Доступна-ли ему информация о размерах? Судя по всему нет, либо какие-то другие неведомые нам [точнее мне] соображения идут в ход при налаживании этой нездоровой связи. Куда как страшнее то, что при активной записи в [int] tmp, содержимое байта, лежащего рядом с [char] tmp в первом файле должно также меняться. Renesas-овский gcc именно так только что и поступил - загадил тройку соседних переменных. И это в C++ - где для различения типов манглинг имён изобрели - и я так надеялся, что он им и воспользуется. Мда.. ещё один осиновый аргумент для вечного сна extern-у.
siarzhuk вне форума   Ответить с цитированием
Старый 04.04.2017, 11:36   #8
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,212
Вес репутации: 4222/98
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

лень проверять, а если хедерок с этим extern в тот же файл включен, в котором объявляется эта переменная? Тут линкер должен столкнуться с непоняткой, или нет?
ampersant вне форума   Ответить с цитированием
Старый 04.04.2017, 11:50   #9
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,285
Вес репутации: 4191/114
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от ampersant Посмотреть сообщение
лень проверять, а если хедерок с этим extern в тот же файл включен, в котором объявляется эта переменная? Тут линкер должен столкнуться с непоняткой, или нет?
Хедерка (заголовочного файла) нет, одна переменная объявлена в одном сишном файле как char, а в другом сишном файле как extern int.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 04.04.2017, 11:55   #10
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 44
Сообщений: 1,256
Вес репутации: 1557/61
DimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant future
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от ampersant Посмотреть сообщение
лень проверять, а если хедерок с этим extern в тот же файл включен, в котором объявляется эта переменная? Тут линкер должен столкнуться с непоняткой, или нет?
Если extern прописал в хедере, и это зедер включен в тот .с файл, где обьявлена переменная, то при несовпадении будет ругаться.
DimaS вне форума   Ответить с цитированием
Старый 04.04.2017, 21:49   #11
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/37
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Си, значение переменных short и int в pic16

То что компилятор не ругается для меня очевидно. Тут надо четко понимать и разделять понятия объявление переменной и определение переменной. В Ваших постах этой разницы не прослеживается. Объявляя переменную Вы говорите компилятору, что есть что-то с определенным именем и определенного типа. В простейшем случае при обявлении переменной происходит и ее определение, т.е. для этой переменной выделяется место. Использование extern позволяет объявить переменную, не определяя ее. Это ключевое слово сообщает, что переменная определена (ей выделено место) в другом файле проекта.
Т.о. в файле где объявлена переменная:
extern int temp;
не будет предупреждений на temp=256; А почему должны быть? Все корректно.
Pasha_Bi вне форума   Ответить с цитированием
Старый 04.04.2017, 23:14   #12
siarzhuk
Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 46
Сообщений: 89
Вес репутации: 761/16
siarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to behold
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Т.о. в файле где объявлена переменная:
extern int temp;
не будет предупреждений на temp=256; А почему должны быть? Все корректно.
По гамбургскому счёту некорректно само объявление через extern в теле модуля. Место глобальных объявлений - в интерфейсе модуля (он же "хедерок") - что даёт компилятору возможность отследить ошибку. ТБ, однако.
siarzhuk вне форума   Ответить с цитированием
Старый 05.04.2017, 08:27   #13
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/37
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Си, значение переменных short и int в pic16

Когда "хедерок" подключается к "телу модуля", его содержимое "переписывается" в это "тело модуля", и по большому счету не важно где написана строка
extern int temp;
в "теле модуля" или в подключенном к этому "телу" .h файле. "Тело модуля" компилируется отдельно, компилятору сообщается, что есть такая переменная (где то реализованная), имеющая тип int. Компилятор присваивает этой переменной 265. Чего ему ругаться то?
Мне понравилось "тело модуля"
Pasha_Bi вне форума   Ответить с цитированием
Старый 05.04.2017, 10:33   #14
siarzhuk
Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 46
Сообщений: 89
Вес репутации: 761/16
siarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to beholdsiarzhuk is a splendid one to behold
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
по большому счету не важно где написана строка
extern int temp;
в "теле модуля" или в подключенном к этому "телу" .h файле.
Я просто хотел подчеркнуть аспект надёжности этой связки в течение жизни [и возможной оптимизации] нашей программы, а не спору ради. Поскольку, как уже выяснилось выше, наш линкер таких мышей не ловит, хорошо-бы возложить эту работу на компилятор, что озвученная мною ма́ксима про "все глобальные объявления только в интерфейсе" и предлагает. Если наш любимый язык программирования имеет в арсенале возможность автоматической проверки типов - нужно ею пользоваться. ;-)
siarzhuk вне форума   Ответить с цитированием
Старый 05.04.2017, 18:44   #15
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 44
Сообщений: 1,256
Вес репутации: 1557/61
DimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant futureDimaS has a brilliant future
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Если наш любимый язык программирования имеет в арсенале возможность автоматической проверки типов - нужно ею пользоваться. ;-)
В этом "любимом языке" - есть еще и автоматическое приведение типов, один из источников тех глюков и багов, из-за которых бывают самолеты разбиваются и спутники падают.
(Знаю как минимум два случая, правда 30+ летней давности чуть по другим причине но тоже в софте. С самолетами закончилось благополучно, спутник - "завис").
DimaS вне форума   Ответить с цитированием
Старый 06.04.2017, 16:25   #16
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

siarzhuk
есть анализаторы кода, которые могут здорово помочь.
Место глобальных объявлений - в интерфейсе модуля (он же "хедерок") - интерфейсный заголовок это ясно. есть разные соглашения об именовании глобальных сущностей. все они сводятся к тому, что если сущность попала в scope, то лучше бы ей иметь имя вида: имямодуля_имясущности_подробности.
besogon вне форума   Ответить с цитированием
Старый 06.04.2017, 17:08   #17
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,212
Вес репутации: 4222/98
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

Цитата:
Сообщение от besogon Посмотреть сообщение
siarzhuk
есть анализаторы кода, которые могут здорово помочь.
Место глобальных объявлений - в интерфейсе модуля (он же "хедерок") - интерфейсный заголовок это ясно. есть разные соглашения об именовании глобальных сущностей. все они сводятся к тому, что если сущность попала в scope, то лучше бы ей иметь имя вида: имямодуля_имясущности_подробности.
дался вам этот хедерок. Нате ещё тогда естудейз = вчерась.
ampersant вне форума   Ответить с цитированием
Старый 06.04.2017, 17:26   #18
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си, значение переменных short и int в pic16

ampersant
я не до конца вник в терминологию siarzhuk.

ясно, что есть разные заголовочные файлы с разными целями.
среди разных есть интерфейсные заголовочные файлы, которые определяют, как именно лучше бы общаться с модулем.
besogon вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADE7878 dimasikus Общетехнические вопросы 28 23.09.2015 12:38
Светильник на PIC 16F628 mikola Продукция MICROCHIP 300 24.05.2013 10:02
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
MPLAB не находит c018i.o qwerty1 Продукция MICROCHIP 45 22.04.2011 12:14
типы со знаком и без в PICC maxNTF Продукция MICROCHIP 35 16.01.2008 23:40


Часовой пояс GMT +3, время: 23:18.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot