Указатели в С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 ++ должна работать. Сегодня попробую, отпишусь.
|
|
| |