Как изменить адрес в цикле

#c #for-loop #eeprom

Вопрос:

Я хочу изменить адрес в цикле for :

 for (int i = 0, a = kali.CalibNo; i <= (kali.CalibNo-1) amp;amp; mess.j > 0; i  , a--) {
  mess.stc[i] = ((-mess.Acal[a][0])   (mess.Acal[a - 1][0]))
          / (-val.Value[a]   val.Value[a - 1]);                  
  mess.tcal[i] = (mess.Acal[a][1]   273.1   mess.Acal[a - 1][1]   273.1)
          / 2;
  mess.Stcal[i] = (double) -mess.stc[i] / mess.tcal[i];
  mess.Stcal[i] = EEPROM_WRITE(EEPROM_ADRESS_cal(i), amp;mess.Stcal[i], 4);
}
 

Stcal[i] — это массив из 5 двойников, а EEPROM_ADRESS_cal-мой адрес, но я не могу определить такой адрес с помощью (i)… К сожалению, я могу определить их только по одному:

 #define EEPROM_ADDRESS_cal0  0x1E
#define EEPROM_ADDRESS_cal1  0x22
#define EEPROM_ADDRESS_cal2  0x26
 

у кого-нибудь есть какие-нибудь идеи, как я мог бы изменить индекс адреса, чтобы он учитывался в цикле for?

Комментарии:

1. В стороне: вообще говоря, i <= (kali.CalibNo-1) это вполне может привести к ошибке во время выполнения. Пожалуйста, используйте i < kali.CalibNo

2. Ты можешь #define EEPROM_ADDRESS_cal(i) (0x1E ((i) * 4)) ? Таким образом, вы можете использовать его как EEPROM_ADDRESS_cal(0) и т. Д.

Ответ №1:

Отбросьте макросы. Пусть все будет просто.

 const uint8_t eeprom_address [n] = 
{
  0x1E,
  ... 
};

EEPROM_WRITE(eeprom_address[i], amp;mess.Stcal[i], 4);
 

Хотя в реальном приложении для встраиваемых систем с встроенным eeprom double массив уже был бы сопоставлен с памятью, поэтому вам не понадобится эта таблица, а только адрес каждого элемента. В случае, если это для внешнего последовательного eeprom, тогда это другая история.

Комментарии:

1. Я получаю несколько определений каким-то образом, вы знаете, что может вызвать это?

2. c:ststm32cubeide_1.7.0stm32cubeidepluginscom.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346toolsarm-none-eabibinld.exe: ./Messung/Messung.o:C:/Projekt/Messgeraet/TouchGFXProject/Отладка/../Настройки/Настройки.h:45: множественное определение «EEPROM_ADRESS_AD»;. /Core/Src/main.o:C:/Projekt/Messgeraet/TouchGFXProject/Отладка/../Настройки/Настройки. h:45: впервые определено здесь

3. @MarcHammer Это означает: не используйте одно и то же имя для разных вещей. Часто вы получаете эту ошибку компоновщика, когда у вас есть дерьмово написанные заголовки без защиты от включения и/или с определениями переменных или функций внутри них.