Указатели в Сodevisionavr

Программирование и все ,что с ним связано
Ответить
Аватара пользователя
Jamy
бывалый диод
Сообщения: 979
Зарегистрирован: 28 авг 2015, 23:39
Откуда: Харьков

Указатели в Сodevisionavr

Сообщение: # 264Сообщение Jamy
01 окт 2015, 00:15

Вопрос по указателям в 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
бывалый диод
Сообщения: 92
Зарегистрирован: 31 авг 2015, 09:38

Указатели в Сodevisionavr

Сообщение: # 270Сообщение alexr171
01 окт 2015, 20:46

pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.

Аватара пользователя
Jamy
бывалый диод
Сообщения: 979
Зарегистрирован: 28 авг 2015, 23:39
Откуда: Харьков

Указатели в Сodevisionavr

Сообщение: # 272Сообщение Jamy
01 окт 2015, 22:52

alexr171 писал(а):pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.
Нет, не правильно поняли ,мне надо как раз увеличивать ++ не адрес,он постоянный , а данные по этому адресу в переменной Bank на которую поставлен указатель. Первый пример вроде бы написал правильно ,но не работает, а взяв данные через указатель, обработав в другой переменной и вернув назад через указатель все работает( это логично ), не логично что первый случай не работает хотя должен.

alexr171
бывалый диод
Сообщения: 92
Зарегистрирован: 31 авг 2015, 09:38

Указатели в Сodevisionavr

Сообщение: # 277Сообщение alexr171
02 окт 2015, 07:11

Теперь кажется понял.
*pEE ++;  не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.

Аватара пользователя
Jamy
бывалый диод
Сообщения: 979
Зарегистрирован: 28 авг 2015, 23:39
Откуда: Харьков

Указатели в Сodevisionavr

Сообщение: # 278Сообщение Jamy
02 окт 2015, 09:04

alexr171 писал(а):Теперь кажется понял.
*pEE ++;  не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.
Увеличивает она адрес или что то другое я не смог понять , но в таком виде должна работать с ячейкой, а не с адресом.
Плохо ,что у cvavr нет своего трассировщика.

alexr171
бывалый диод
Сообщения: 92
Зарегистрирован: 31 авг 2015, 09:38

Указатели в Сodevisionavr

Сообщение: # 291Сообщение alexr171
04 окт 2015, 19:18

Jamy писал(а):но в таком виде должна работать с ячейкой, а не с адресом.
Не должна , это я и хотел сказать , но видимо не смог правильно сформулировать.pEE это адрес , и наши ++ относятся к нему , * просто говорит поставить указатель на этот адрес.Далее из этой ячейки мы можем считать данные или записать в нее.Да можно ведь посмотреть для примера как сделано в функциях чтения и записи памяти.
Не знаю будет ли работать (*pEE)++ , сейчас нет возможнсти проверить.

Аватара пользователя
dadigor
бывалый диод
Сообщения: 147
Зарегистрирован: 01 сен 2015, 13:35

Указатели в Сodevisionavr

Сообщение: # 292Сообщение dadigor
04 окт 2015, 21:39

Я бы тоже попробовал написать
else (*pEE)++:
Интересно, так заработало или нет?

Аватара пользователя
Jamy
бывалый диод
Сообщения: 979
Зарегистрирован: 28 авг 2015, 23:39
Откуда: Харьков

Указатели в Сodevisionavr

Сообщение: # 297Сообщение Jamy
05 окт 2015, 09:57

Нет, не заработало, видимо особенность компилятора, данные по *pEE через указатель находятся правильные, но в чистом виде не работает, только если их оттуда прочитать модифицировать а потом вернуть назад.

alexr171
бывалый диод
Сообщения: 92
Зарегистрирован: 31 авг 2015, 09:38

Указатели в Сodevisionavr

Сообщение: # 302Сообщение alexr171
05 окт 2015, 19:39

Попробуйте разыменовать указатель.По стандарту ANSI C  else *pEE = *pEE ++ должна работать.

Аватара пользователя
Jamy
бывалый диод
Сообщения: 979
Зарегистрирован: 28 авг 2015, 23:39
Откуда: Харьков

Указатели в Сodevisionavr

Сообщение: # 304Сообщение Jamy
06 окт 2015, 10:30

alexr171 писал(а):Попробуйте разыменовать указатель.По стандарту ANSI C  else *pEE = *pEE ++ должна работать.
Сегодня попробую, отпишусь.

Ответить