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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 21.07.2017, 10:37   #1
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Помогите с указателями

Здравствуйте! Имею небольшую проблему вот пример:

short x = 1260;
char* pnt_x;
short y;

pnt_x = & x ; // передал адрес переменной х

y = * pnt_x ; // передал значение переменной из адреса;

В результате имею в У число 236. Что равняется 1260 - 1024 .

Но если задаю тип переменной указателя short то все работает как надо.

Не понимаю почему так происходит, если смотреть адрес переменной x через debug то он у нее 0x25 и должен нормально обработаться в указателе с типом char или я что то не так понимаю?
Mysteo вне форума   Ответить с цитированием
Старый 21.07.2017, 11:23   #2
Vint
Senior Member
 
Аватар для Vint
 
Регистрация: 08.06.2007
Сообщений: 475
Вес репутации: 838/50
Vint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to behold
По умолчанию Re: Помогите с указателями

ответил в личку.
Vint вне форума   Ответить с цитированием
Старый 21.07.2017, 11:33   #3
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,108
Вес репутации: 3551/75
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: Помогите с указателями

Цитата:
Сообщение от Mysteo Посмотреть сообщение
Здравствуйте! Имею небольшую проблему вот пример:

short x = 1260;
char* pnt_x;
short y;

pnt_x = & x ; // передал адрес переменной х

y = * pnt_x ; // передал значение переменной из адреса;

В результате имею в У число 236. Что равняется 1260 - 1024 .

Но если задаю тип переменной указателя short то все работает как надо.

Не понимаю почему так происходит, если смотреть адрес переменной x через debug то он у нее 0x25 и должен нормально обработаться в указателе с типом char или я что то не так понимаю?
char - однобайтный. Указатель на char указывает на однобайтное значение. Что не так? Сделай short* pnt_x; и будет счастье. Ну или y=*(short*)pnt_x; если непременно должен быть указатель на char.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 21.07.2017, 11:36   #4
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Re: Помогите с указателями

Ну да я так сам же и сделал всё и заработало, просто я по другому это понимал, но товарищ Vint мне все разъяснил
Mysteo вне форума   Ответить с цитированием
Старый 21.07.2017, 19:51   #5
Zhuk72
Member
 
Аватар для Zhuk72
 
Регистрация: 09.11.2015
Адрес: Baku
Возраст: 45
Сообщений: 94
Вес репутации: 431/12
Zhuk72 is just really niceZhuk72 is just really niceZhuk72 is just really niceZhuk72 is just really niceZhuk72 is just really nice
По умолчанию Re: Помогите с указателями

Чтобы тайное (личное) стало явным...
1260d == 04ECh - тип short.
Char *pnt_x - указывает на один байт, т.е. на ECh == 236d
Старший байт терялся, вот и все.
Zhuk72 вне форума   Ответить с цитированием
Старый 25.07.2017, 08:11   #6
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Re: Помогите с указателями

Всем привет! Снова имею вот такую проблему:

определил указатель в .h файле

int* pnt_period;

создал три функции

Код:
void pwm_init (int period) 
{
    T2CON=0x04;
	TMR2ON=1;
    CCP1CON=0x0C;
    CCP2CON=0x0F;
 	TRISC1=0;
	TRISC2=0;
    pnt_period = & period;
	PR2 =  (1000000 / period) -1 ;
}

void pwm_duty_pwm1 (char percent_duty1)

{
    float koef;
    int duty;
    koef = *pnt_period * (100/(float)percent_duty1);
    duty = 4000000 /  koef;
    DC2B0=(bit)duty;
    DC2B1=(bit)(duty>>1);
    CCPR2L=(duty>>2);
}


void pwm_duty_pwm2 (char percent)

{
    float koef;
    int duty;
    koef = *pnt_period * (100/(float)percent);
    duty = 4000000 /  koef;
     DC1B0=(bit)duty;
	DC1B1=(bit)(duty>>1);
	CCPR1L=(duty>>2);
}
В функции pwm_duty_pwm1 все работает как надо
а в функции pwm_duty_pwm2 из указателя pnt_period считывается полная ерунда какая-то. Как поправить?

Последний раз редактировалось Mysteo; 25.07.2017 в 08:23.
Mysteo вне форума   Ответить с цитированием
Старый 25.07.2017, 09:33   #7
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 44
Сообщений: 445
Вес репутации: 1095/53
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: Помогите с указателями

Цитата:
Сообщение от Mysteo Посмотреть сообщение
Как поправить?
pnt_period указывает на локальную переменную. Надо переменную сделать глобальной.
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 25.07.2017, 11:48   #8
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Re: Помогите с указателями

Что-то не понимаю как это сделать

Переделал без указателя и все работает

Код:
void pwm_init (int Hz) 
{
    T2CON=0x04;
	TMR2ON=1;
    CCP1CON=0x0C;
    CCP2CON=0x0F;
 	TRISC1=0;
	TRISC2=0;
    period = Hz;
	PR2 =  (1000000 / Hz) -1 ;
}

void pwm_duty_pwm1 (char percent_duty1)

{
    float koef;
    int duty;
    koef = period * (100/(float)percent_duty1);
    duty = 4000000 /  koef;
    DC2B0=(bit)duty;
	DC2B1=(bit)(duty>>1);
	CCPR2L=(duty>>2);
}


void pwm_duty_pwm2 (char percent)

{
    float koef;
    int duty;
    koef = period * (100/(float)percent);
    duty = 4000000 /  koef;
     DC1B0=(bit)duty;
	DC1B1=(bit)(duty>>1);
	CCPR1L=(duty>>2);
}
Mysteo вне форума   Ответить с цитированием
Старый 25.07.2017, 13:01   #9
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 109
Вес репутации: 807/20
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: Помогите с указателями

Цитата:
Сообщение от Mysteo Посмотреть сообщение
Код:
void pwm_init (int period) 
{
    T2CON=0x04;
    TMR2ON=1;
    CCP1CON=0x0C;
    CCP2CON=0x0F;
     TRISC1=0;
    TRISC2=0;
    pnt_period = & period;
    PR2 =  (1000000 / period) -1 ;
}
В данном случае переменная period - содержит копию параметра переданного в pwm_init. Размещается она либо на стеке фунции, либо в регистрах. По завершении функции эта переменная разрушается, а память под неё выделенная используется программой для своих дальнейших нужд. Хотя читать оттуда можно, но к исходному значению эти данные отношения иметь будут мало. Сменить место хранения локальной переменной period можно следующим образом:
Код:
void pwm_init (int period) 
{
    static int _period = 0;
    _period = period;
    pnt_period = & _period;
}
В этом случае переменная _period размещается в сегменте данных, но область видимости её ограничивается функцией pwm_init. Двустрочное присвоение ей переданного параметра важно - поскольку первая строка с инициализацией при повторном вызове функции "не выполняется". Содержимое подобных статических переменных объявленных локально - сохраняется от вызова к вызову функции.
siarzhuk вне форума   Ответить с цитированием
Старый 25.07.2017, 13:24   #10
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 44
Сообщений: 644
Вес репутации: 1235/57
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: Помогите с указателями

а мне одному бросилось в глаза несоответствие типов и мягко говоря нетривиально использование плавучки ?
Цитата:
Сообщение от Mysteo Посмотреть сообщение
int* pnt_period;
koef = *pnt_period * (100/(float)percent_duty1);
koef = *pnt_period * (100/(float)percent);
igor_tgru вне форума   Ответить с цитированием
Старый 25.07.2017, 14:21   #11
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Re: Помогите с указателями

Да warning на счет не соответствия типов я видел, поправлю.

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

Но почему тогда код из 8 поста работает как надо?

Последний раз редактировалось Mysteo; 25.07.2017 в 14:28.
Mysteo вне форума   Ответить с цитированием
Старый 25.07.2017, 14:46   #12
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 109
Вес репутации: 807/20
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: Помогите с указателями

Цитата:
Сообщение от Mysteo Посмотреть сообщение
Я понимаю, что переменные созданные в функции работают только локально в этой функции, и в другой функции переменная с таким именем это другие данные совсем.
Отгадка в том, где они создаются и сколько времени существуют. Параметр функции - это такая-же локальная переменная как и явно объявленная в теле функции. В С параметры передаются по значению а не по ссылке - и функция работает с локальной копией переданного параметра. А адрес локальной переменной валиден только до момента завершения этой функции - использовать такой указатель вне её пределов не сто́ит, как минимум.

Цитата:
Сообщение от Mysteo Посмотреть сообщение
Но почему тогда код из 8 поста работает как надо?
Потому, что переменная period - глобальная. И место под неё выделено уже на этапе компиляции. Вы присвоили значение глобальной переменной и пользуетесь им по мере необходимости - поскольку никто на пространство занятое глобальной period более не претендует. А стек [или регистр], в котором жила локальная period - используется весьма активно.
siarzhuk вне форума   Ответить с цитированием
Старый 25.07.2017, 15:01   #13
Mysteo
Junior Member
 
Регистрация: 15.06.2017
Возраст: 26
Сообщений: 23
Вес репутации: 100/3
Mysteo will become famous soon enoughMysteo will become famous soon enough
По умолчанию Re: Помогите с указателями

Цитата:
Сообщение от siarzhuk Посмотреть сообщение
адрес локальной переменной валиден только до момента завершения этой функции - использовать такой указатель вне её пределов не сто́ит, как минимум.

Спасибо большое! Я на программиста не учился, но по работе немного приходится, поэтому такие нюансы не сразу замечаю
Mysteo вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос «чайника» к знатокам Си. ROGALIK Вопросы начинающих 1394 01.09.2016 13:34
Помогите разобратся с PIC18f452 iluha Вопросы начинающих 3 13.04.2012 12:34
Помогите настроить PORTA на выход XKiller Продукция MICROCHIP 74 28.11.2011 19:42
ЛЮДИ! Помогите! Есть вопросы по созданию USB устройства!) Pro-Z71 Вопросы начинающих 51 15.02.2011 15:39
PIC18F458 - Помогите разобраться 55vladis Продукция MICROCHIP 24 07.04.2009 01:22


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


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