Я немного потерян в мире указателей 🙂
Чтение значения с помощью передачи числа в readSystemVal работает как шарм, но теперь я хотел бы записать в эти переменные, используя writeSystemVal.
Не могу найти то, что я должен делать:
* systemVal содержит адрес переменной, но как мне записать в нее свое значение?
Будете ли вы так любезны посмотреть?
(система: AVR, затмение, atmega644)
// User Changeable variables
uint8_t MIDIchan1 = 0; // midichannel osc 1
uint8_t MIDIchan2 = 1; // midichannel osc 2
uint8_t MIDIchan3 = 2; // midichannel osc 3
uint8_t pbRange = 12; // pitchbend
uint8_t omniModus = 0x00; // 3 osc modus or 1 omni modus
uint8_t midiThru = 0x01; // midiTrhu on/off
uint8_t *systemValList[] = {&MIDIchan1, &MIDIchan2, &MIDIchan3, &pbRange, &omniModus, &midiThru};//**************************************************
// readSystemVal
// DESCRIPTION:
// Hele simpele note off routine
//**************************************************
uint8_t readSystemVal (uint8_t systemItem)
{
uint8_t *systemVal = (uint8_t *)systemValList[(uint8_t)systemItem];
uint8_t returnVal = *systemVal;
return returnVal;
}
void writeSystemVal (uint8_t ctrlValue, uint8_t systemItem)
{
/*
uint8_t *systemVal = (uint8_t *)systemValList[(uint8_t)systemItem];
//uint8_t returnVal = *systemVal;
// systemVal = ctrlValue;
*/
}
Нет, systemVal
(без звездочки) держит адрес. Это и есть указатели, просто целое число, значением которого является адрес, на который указывает указатель.
Вы используете оператор разыменования *
для чтения и записи значения, на которое указывает указатель.
Пример, возвращающий значение, на которое указывает указатель:
return *systemVal;
Например, установите значение, на которое указывает указатель:
*systemVal = ctrlValue;
Кстати, readSystemVal
Функция может быть сокращена до этого:
uint8_t readSystemVal (uint8_t systemItem)
{
return *systemValList[systemItem];
}
Нет необходимости в дополнительных шагах между ними. И особенно не приведение типов, которое преобразует значения в типы, которыми они фактически объявлены.
Других решений пока нет …