0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
1 | |
Вопрос по синтаксису atmel studio09.11.2013, 02:11. Показов 5668. Ответов 9
Метки нет (Все метки)
почему такая строка работает
Код
run_data.timer = pgm_read_byte(&data01[run_data.index].delay); Код
run_data.timer = pgm_read_byte(&run_data.data[run_data.index].delay); определения: Код
typedef struct { uint8_t color; uint8_t delay; } tid_data; const tid_data data01[] PROGMEM = { { tid_kriim, 200 } }; volatile struct { uint8_t index; uint8_t timer; const tid_data* data; uint8_t size; } run_data; Код
void stort(const tid_data d[], uint8_t size) { run_data.data = d; run_data.index = 0; run_data.size = size; switchLed(pgm_read_byte(&run_data.data[0].color), 1); run_data.timer = pgm_read_byte(&run_data.data[0].delay); }
0
|
09.11.2013, 02:11 | |
Ответы с готовыми решениями:
9
Вопрос юзерам Atmel Studio Atmel Studio 6 v 6.0.1843 Вопрос по отладке Почему AVR Studio 4, а не Atmel Studio 6? Вопрос по синтаксису С++ |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2013, 02:32 | 2 |
Сообщение от oxytt
data01 и run_data.data - одного типа, это указатели на структуру (или массив структур). Но run_data.data и run_data.data[run_data.index] - уже не одного типа. Поэтому Ваши два выражения не эквивалентны. P.S. Справедливости ради :-) Атмеловская студия тут ни при чём. Вопрос чисто сишный.
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
09.11.2013, 02:36 | 3 |
посмотрите строки
правильно сравнивать data01[run_data.index] и run_data.data[run_data.index] они одного типа я предположил, что вопрос проблема может быть из-за PROGMEM, а это уже чисто avr GCC/atmel studyo
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2013, 02:53 | 4 |
Сообщение от oxytt
Задумка-то какая была - получить (run_data.data)[run_data.index] ?
Сообщение от oxytt
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
09.11.2013, 03:00 | 5 |
Сообщение от OtyxPM
если я указываю в коде таймера напрямую data01 - все работает но мне хотелось добавить гибкости, чтобы например переключать режим - менять data01 на какой-нибудь data02 для этого я попытался прописать в коде таймера не прямое обращение к data01, а через ее адрес хранящийся в run_data.data пока не удалось сделать этот код рабочим
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2013, 03:04 | 6 |
Сообщение от oxytt
С каким параметром size вызываете функцию stort() ?
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
09.11.2013, 03:06 | 7 |
я просто для простоты сократил содержание data01 до одного элемента
вызываю так: stort(data01, sizeof(data01)/sizeof(data01[0]));
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2013, 03:10 | 8 |
Сообщение от oxytt
Почему не сделать первым параметром указатель на структуру? void stort(/*вместо const tid_data d[]*/const tid_data *d, uint8_t size);
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
09.11.2013, 03:13 | 9 |
Сообщение от OtyxPM
может ошибаюсь, но по идее между этими двумя конструкциями не должно быть разницы, ведь имя массива в Си это указатель
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2013, 03:19 | 10 |
Сообщение от oxytt
Поскольку время позднее, закину совет заранее - завтра обсудим: разделите сомнительное место на две логические половины - отдельной строкой вычисляйте (и присваивайте переменной-указателю) параметр для pgm_read_byte(), а уже другой строкой вызывайте pgm_read_byte() с вычисленным параметром. Так проще разобраться. Можете даже обоими способами (см.первый пост) вычислить указатель и сличить.
0
|
09.11.2013, 03:19 | |
09.11.2013, 03:19 | |
Помогаю со студенческими работами здесь
10
вопрос по синтаксису вопрос по синтаксису Вопрос по синтаксису Вопрос по синтаксису С++. Вопрос по синтаксису Вопрос по синтаксису Вопрос по синтаксису перечислений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |