Указатели в Сodevisionavr
Указатели в Сodevisionavr
Вопрос по указателям в 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
}
**************************************** пример 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
pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.
Указатели в Сodevisionavr
Нет, не правильно поняли ,мне надо как раз увеличивать ++ не адрес,он постоянный , а данные по этому адресу в переменной Bank на которую поставлен указатель. Первый пример вроде бы написал правильно ,но не работает, а взяв данные через указатель, обработав в другой переменной и вернув назад через указатель все работает( это логично ), не логично что первый случай не работает хотя должен.alexr171 писал(а):pEE - адресс , *pEE - данные по этому адрессу
if (pEE >= 10) pEE= 10;
else pEE ++;
*radioadd.Bank32 = *pEE;
Вроде так должно быть , если я правильно понял ваши переменные.
Указатели в Сodevisionavr
Теперь кажется понял.
*pEE ++; не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.
*pEE ++; не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.
Указатели в Сodevisionavr
Увеличивает она адрес или что то другое я не смог понять , но в таком виде должна работать с ячейкой, а не с адресом.alexr171 писал(а):Теперь кажется понял.
*pEE ++; не увеличивает данные по адесу pEE , а увеличивает адрес и считывает из него данные , такова логика работы данной конструкции , т.е. если хотите изменить данные их необходимо считать во вспомогательную переменную , изменить ее и затем опять записать , что мы и видим во втором случае.
Плохо ,что у cvavr нет своего трассировщика.
Указатели в Сodevisionavr
Не должна , это я и хотел сказать , но видимо не смог правильно сформулировать.pEE это адрес , и наши ++ относятся к нему , * просто говорит поставить указатель на этот адрес.Далее из этой ячейки мы можем считать данные или записать в нее.Да можно ведь посмотреть для примера как сделано в функциях чтения и записи памяти.Jamy писал(а):но в таком виде должна работать с ячейкой, а не с адресом.
Не знаю будет ли работать (*pEE)++ , сейчас нет возможнсти проверить.
Указатели в Сodevisionavr
Я бы тоже попробовал написать
else (*pEE)++:
Интересно, так заработало или нет?
else (*pEE)++:
Интересно, так заработало или нет?
Указатели в Сodevisionavr
Нет, не заработало, видимо особенность компилятора, данные по *pEE через указатель находятся правильные, но в чистом виде не работает, только если их оттуда прочитать модифицировать а потом вернуть назад.
Указатели в Сodevisionavr
Попробуйте разыменовать указатель.По стандарту ANSI C else *pEE = *pEE ++ должна работать.
Указатели в Сodevisionavr
Сегодня попробую, отпишусь.alexr171 писал(а):Попробуйте разыменовать указатель.По стандарту ANSI C else *pEE = *pEE ++ должна работать.