tier 0 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Всем Добрый день. Ребята, подскажите как мне можно поступить в этом случае: #include <avr/io.h> #include <avr/pgmspace.h> typedef struct { void *FPointerStruct; // указатель на следующую структуру uint8_t FVariable; } FData_t; FData_t FData1, FData2; // объявим структуры FData_t PROGMEM FData1 = {(void*)&FData2, 0xAA}; // поместим во Flash FData_t PROGMEM FData2 = {(void*)&FData1, 0xBB}; uint8_t u08_Data1, u08_Data2; int main(void) { FData_t *temp; temp=(FData_t *)&FData1; // текущая структура FData1 u08_Data1=pgm_read_byte(&(temp->FVariable)); // читаем 0xAA temp=(FData_t *)pgm_read_word(&temp->FPointerStruct); // текущая структура FData2 u08_Data2=pgm_read_byte(&(temp->FVariable)); // читаем 0xBB } а вот в EEPROM у меня так же не получается #include <avr/io.h> #include <avr/eeprom.h> typedef struct { void *EPointerStruct; uint8_t EVariable; } EData_t; EData_t EData1, EData2; // объявим структуры EData_t EEMEM EData1 = {(void*)&EData2, 0xAA}; // поместим в EEPROM EData_t EEMEM EData2 = {(void*)&EData1, 0xBB}; uint8_t u08_Data1, u08_Data2; int main(void) { EData_t *temp; temp=(EData_t *)&EData1; // текущая структура EData1 u08_Data1=eeprom_read_byte(&(temp->EVariable)); // читаем 0xAA //temp=(EData_t *)eeprom_read_word(&temp->EPointerStruct); // вот здесь проблема u08_Data2=eeprom_read_byte(&(temp->EVariable)); // опять читаем 0xAA } Конечно можно просто сделать ++temp, но это не подходит, потому что перейдет на структуру после последней.... и попадем в область где уже нет ничего.... Компилятор avr-gcc. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба //temp=(EData_t *)eeprom_read_word(&temp->EPointerStruct); // вот здесь проблема u08_Data2=eeprom_read_byte(&(temp->EVariable)); // опять читаем 0xAA } Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tier 0 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так? то я специально закоментил, потому как если раскоментировать то не скомпилится.... в этом и вопрос собственно..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tier 0 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий... так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум....Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1:typedef struct FData_t{ FData_t *FPointerStruct; // указатель на следующую структуру uint8_t FVariable; } FData_t; FData_t FData1, FData2; // объявим структуры FData_t PROGMEM FData1 = {&FData2, 0xAA}; // поместим во Flash FData_t PROGMEM FData2 = {&FData1, 0xBB}; int main(void) { FData_t *temp; temp=&FData1; // текущая структура FData1 u08_Data1=pgm_read_byte(&(temp->FVariable)); // читаем 0xAA temp=(FData_t *)pgm_read_word((uint16_t *)&temp->FPointerStruct); // текущая структура FData2 u08_Data2=pgm_read_byte(&(temp->FVariable)); // читаем 0xBB } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tier 0 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1 Сергей, спасибо Вам большое.... помогли разобраться, вопрос исчерпан.... Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий... и Вам тоже спасибо, сразу просто не понял.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться