Потерянный в pointerworld, запись в переменную через массив

0

Я немного потерян в мире указателей :-) Прочитайте значение с помощью передачи числа readSystemVal, которое работает как шарм, но теперь я хотел бы написать эти переменные с помощью writeSystemVal.

Невозможно найти то, что я должен делать: * systemVal удерживает адрес переменной, но как мне записать его значение?

Вы бы так любезны посмотреть?

(система: AVR, eclipse, 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;
*/
}
Теги:
pointers
avr

1 ответ

4
Лучший ответ

Нет, systemVal (без звездочки) держит адрес. То, что указатели, просто целое число, значение которого - адрес, на который указывает указатель.

Вы используете оператор разыменования * для чтения и записи значения, на которое указывает указатель.

Пример, возвращающий значение, указатель указывает на:

return *systemVal;

Например, установите значение, которое указывает указатель:

*systemVal = ctrlValue;

Кстати, функция readSystemVal может быть сокращена до этого:

uint8_t readSystemVal (uint8_t systemItem)
{
    return *systemValList[systemItem];
}

Нет необходимости в дополнительных шагах между ними. И особенно не приведение типов, которое отличает значения к типам, на которые они фактически объявлены.

  • 0
    Спасибо за исправление моих ошибок! Я попробую!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню