Страница 1 из 1

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

Добавлено: 01 окт 2015, 00:15
Jamy
Вопрос по указателям в 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
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 05 окт 2015, 19:39
alexr171
Попробуйте разыменовать указатель.По стандарту ANSI C  else *pEE = *pEE ++ должна работать.

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

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