[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Общий форум » Программирование » Указатели в Сodevisionavr
Указатели в Сodevisionavr
JamyДата: Четверг, 01.10.2015, 00:15 | Сообщение # 1
Мастер Йода
Группа: Администраторы
Сообщений: 731
Статус: Offline
Вопрос по указателям в codevisionavr , есть вот такая процедура , первый вариант у меня компилируется но не работает, переменная Bank принимает непонятные значения, второй экспериментально сделал иначе работает прекрасно,но не хотелось усложнять бесполезным переводом переменной туда сюда, кто то может пояснить ?

**************************************** пример 1 не работает ********************************************
eeprom UCHAR *pEE;
eeprom UCHAR Bank;
struct RADIOADD
{
UCHAR Bank32;
}
pEE = &Bank;
void работа с указателем (void)
{
if (*pEE >= 10) *pEE = 10;
else *pEE ++;
radioadd.Bank32 = *pEE;
...... дальнейшая работа с переменной radioadd.Bank32
}

**************************************** пример 2 работает**************************************************
eeprom UCHAR *pEE;
eeprom UCHAR Bank;
struct RADIOADD
{
UCHAR Bank32;
}
pEE = &Bank;
void работа с указателем (void)
{
radioadd.Bank32 = *pEE;
if (radioadd.Bank32 >= 10) radioadd.Bank32 = 10;
else radioadd.Bank32 ++;
*pEE = radioadd.Bank32;
...... дальнейшая работа с переменной radioadd.Bank32
}
 
alexr171Дата: Четверг, 01.10.2015, 20:46 | Сообщение # 2
Юный падаван
Группа: Проверенные
Сообщений: 87
Статус: Offline
pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.
 
JamyДата: Четверг, 01.10.2015, 22:52 | Сообщение # 3
Мастер Йода
Группа: Администраторы
Сообщений: 731
Статус: Offline
Цитата alexr171 ()
pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.


Нет, не правильно поняли ,мне надо как раз увеличивать ++ не адрес,он постоянный , а данные по этому адресу в переменной Bank на которую поставлен указатель. Первый пример вроде бы написал правильно ,но не работает, а взяв данные через указатель, обработав в другой переменной и вернув назад через указатель все работает( это логично ), не логично что первый случай не работает хотя должен.
 
alexr171Дата: Пятница, 02.10.2015, 07:11 | Сообщение # 4
Юный падаван
Группа: Проверенные
Сообщений: 87
Статус: Offline
Теперь кажется понял.
*pEE ++;  не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.
 
JamyДата: Пятница, 02.10.2015, 09:04 | Сообщение # 5
Мастер Йода
Группа: Администраторы
Сообщений: 731
Статус: Offline
Цитата alexr171 ()
Теперь кажется понял.
*pEE ++;  не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.


Увеличивает она адрес или что то другое я не смог понять , но в таком виде должна работать с ячейкой, а не с адресом.
Плохо ,что у cvavr нет своего трассировщика.
 
alexr171Дата: Воскресенье, 04.10.2015, 19:18 | Сообщение # 6
Юный падаван
Группа: Проверенные
Сообщений: 87
Статус: Offline
Цитата Jamy ()
но в таком виде должна работать с ячейкой, а не с адресом.
Не должна , это я и хотел сказать , но видимо не смог правильно сформулировать.pEE это адрес , и наши ++ относятся к нему , * просто говорит поставить указатель на этот адрес.Далее из этой ячейки мы можем считать данные или записать в нее.Да можно ведь посмотреть для примера как сделано в функциях чтения и записи памяти.
Не знаю будет ли работать (*pEE)++ , сейчас нет возможнсти проверить.
 
dadigorДата: Воскресенье, 04.10.2015, 21:39 | Сообщение # 7
Падаван
Группа: Проверенные
Сообщений: 147
Статус: Offline
Я бы тоже попробовал написать
else (*pEE)++:
Интересно, так заработало или нет?
 
JamyДата: Понедельник, 05.10.2015, 09:57 | Сообщение # 8
Мастер Йода
Группа: Администраторы
Сообщений: 731
Статус: Offline
Нет, не заработало, видимо особенность компилятора, данные по *pEE через указатель находятся правильные, но в чистом виде не работает, только если их оттуда прочитать модифицировать а потом вернуть назад.
 
alexr171Дата: Понедельник, 05.10.2015, 19:39 | Сообщение # 9
Юный падаван
Группа: Проверенные
Сообщений: 87
Статус: Offline
Попробуйте разыменовать указатель.По стандарту ANSI C  else *pEE = *pEE ++ должна работать.
 
JamyДата: Вторник, 06.10.2015, 10:30 | Сообщение # 10
Мастер Йода
Группа: Администраторы
Сообщений: 731
Статус: Offline
Цитата alexr171 ()
Попробуйте разыменовать указатель.По стандарту ANSI C  else *pEE = *pEE ++ должна работать.

Сегодня попробую, отпишусь.
 
Форум » Общий форум » Программирование » Указатели в Сodevisionavr
  • Страница 1 из 1
  • 1
Поиск: