Я хочу изменить глобальные определения TORQUE_HWORD и TORQUE_LWORD при вызове функции If I call. Как я могу это сделать ?
Я пытаюсь так:
uint16_t mAddressArray[10];
#define TORQUE_HWORD mAddressArray[5]
#define TORQUE_LWORD mAddressArray[6]
void changeValue()
{
Write_EEPROM_Define(torque, TORQUE_HWORD, TORQUE_LWORD); // Current Limit
printf("A: %04x B: %04x ", TORQUE_HWORD, TORQUE_LWORD); // I see this value 0000 0000
}
void Write_EEPROM_Define( float value, uint16_t eepromHValue, uint16_t eepromLValue)
{
eepromHValue = 0xAA;
eepromLValue = 0XBB;
}
В чем между ними разница, я не понимаю
В вашем первом коде вы меняете глобальную переменную на значение параметра, во втором источнике вы меняете параметр на константу. Вы видите разницу?
Окей, я понял свою ошибку. Я обновил свой вопрос. Как изменить значения TORQUE_HWORD и TORQUE_LWORD при вызове функции. Это возможно ?
Основная проблема здесь заключается в том, что вы передаете элементы массива по значению, поэтому вы не изменяете исходный массив. И эта проблема была вызвана использованием вводящих в заблуждение макросов при доступе к массиву.
Другая проблема в том, что void changeValue()
— это устаревший стиль, он должен быть void changeValue (void)
. И функция Write_EEPROM_Define
плохо названа, я бы ожидал, что подобная функция выполнит реальную запись в EEPROM.
Все эти проблемы можно исправить следующим образом:
uint16_t mAddressArray[10];
#define TORQUE_HWORD_INDEX 5
#define TORQUE_LWORD_INDEX 6
void changeTorque (float value, uint16_t array[10], uint16_t hi_index, uint16_t lo_index)
{
array[hi_index] = 0xAA;
array[lo_index] = 0xBB;
}
void changeValue (void)
{
changeTorque(torque, mAddressArray, TORQUE_HWORD_INDEX, TORQUE_LWORD_INDEX);
printf("A: %04x B: %04x ", mAddressArray[TORQUE_HWORD_INDEX], mAddressArray[TORQUE_HWORD_INDEX]);
}
Что касается того, почему у вас есть этот массив как глобальная переменная, но вы передаете его между функциями в одном файле, я понятия не имею. Это просто странный дизайн программы, возможно, вам следует сделать ее локальной переменной static
в какой-то функции.
Яблоки. Апельсины. Эти два фрагмента кода не эквивалентны. Когда вы передаете
TORQUE_HEAD
второй функции, соответствующий элемент массива будет ранжироваться по значению. Все изменения этого значения во второй функции являются изменениями локальной переменной. (И поскольку вы ничего не делаете с этими переменными до того, как они выйдут из области видимости, они не будут иметь никакого эффекта.)