реклама на сайте
подробности

 
 
> указатель на указатель, помочь разобраться
Метценгерштейн
сообщение Jul 27 2018, 10:48
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Встретил в коде следующую конструкцию:

Код
ble_advdata_tk_value_t* oob_key;
err_code = nfc_tk_value_get(&oob_key);


где:

Код
typedef struct
{
  uint8_t tk[BLE_GAP_SEC_KEY_LEN];      /**< Array containing TK value in little-endian format. */
} ble_advdata_tk_value_t;


Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t ** pp_tk_value)
{
    if (m_tag_match)
    {
        *pp_tk_value = &m_device_tk;
        return NRF_SUCCESS;
    }
    else
    {
        return NRF_ERROR_NOT_FOUND;
    }
}


Есть вопрос. Как все проговорить что тут происходит?
Есть тип структуры ble_advdata_tk_value_t. Создали переменную- указатель на этот тип: oob_key.
Дальше? Передаем не просто адрес (сам указатель oob_key), а именно адрес этого указателя? А в ф-ии уже принимаем указатель на указатель?
Разыменовывали на один уровень вверх и по тому значению присвоили адрес уже массива.

А проще никак?
err_code = nfc_tk_value_get(oob_key);

и приняли:
Код
ret_code_t nfc_tk_value_get(ble_advdata_tk_value_t * pp_tk_value)
{
    if (m_tag_match)
    {
        pp_tk_value = &m_device_tk;
        return NRF_SUCCESS;
    }
    else
    {
        return NRF_ERROR_NOT_FOUND;
    }
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение Jul 27 2018, 15:41
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Попробую внести ясности-понятности.
Код
// допустим, Data разместилась по адресу 0x5000
// значение по адресу 0x5000 после присвоения будет равно 10
int Data = 10;

// допустим, pData разместилась по адресу 0x10000
// значение по адресу 0x10000 после присвоения будет равно 0x5000 (адрес Data)
int *pData = &Data;

// чтобы работать на чтение/запись с содержимым Data через pData, используем операцию разыменовывания
int a = *pData; // a == 10
*pData = 20;   // теперь Data == 20

// допустим, ppData разместилась по адресу 0x20000
// значение по адресу 0x20000 после присвоения будет равно 0x10000 (адрес pData)
int **ppData = &pData;

// чтобы работать на чтение/запись с содержимым pData через ppData, используем операцию разыменовывания
int *a = *ppData; // a == 0x10000
// чтобы получить доступ к переменной Data, используется двойное разыменовывание
int b = **ppData; // b == 20

У меня, например, двойной уровень косвенного обращения (указатель на указатель) используется в кольцевом буфере.
Имеется автомат, который расшифровывает принимаемые символы от фреймера (байт-стаффинг) по UART и складывает их в кольцевой буфер. Когда фрейм данных полностью принят, нужно как-то сообщить пользователю о размере принятого сообщения. Поэтому, перед тем, как я складирую принимаемые символы в кольцевой буфер, я резервирую в нем один байт для записи в него размера посылки после того, как весь фрейм будет принят. Чтобы не городить лишних телодвижений, я использую что-то наподобие вот такой конструкции:
Код
char *pMessageSize; // адрес элемента в кольцевом буфере, содержащий информацию о размере принятого сообщения

...

RingBufferReserveByte(&pMessageSize); // прототип RingBufferReserveByte(char **Address)

...

// после приема всей посылки прямой записью в память добавил в заранее зарезервированное место в кольцевом буфере информацию о размере сообщения, не думая по положениях head- и tail-указателей буфера
*pMessageSize = ByteCounter;

// ну а тут уже можно выдать семафор в основную программу, где она считывает первый элемент - видит размер сообщения - считывает его, перемещает позицию следующего чтения и, (если там еще что-то уже успело придти) двигается так дальше
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   указатель на указатель   Jul 27 2018, 10:48
- - Kabdim   Всё что со знаками вопроса - верно. Проще никак. С...   Jul 27 2018, 11:05
- - x893   есть передать сам указатель вы его изменить не смо...   Jul 27 2018, 11:44
- - Метценгерштейн   Хорошо, а в моем приведенном примере- в чем ошибка...   Jul 27 2018, 11:51
|- - x893   Цитата(Метценгерштейн @ Jul 27 2018, 14:5...   Jul 27 2018, 12:09
- - Метценгерштейн   Не нашел в инете такой книжки. Не совсем понимаю,...   Jul 27 2018, 12:25
- - _pv   на что будет указывать oob_key после выполнения фу...   Jul 27 2018, 12:39
- - Метценгерштейн   Разыменование происходит в оригинальном примере: *...   Jul 27 2018, 12:54
|- - _pv   Цитата(Метценгерштейн @ Jul 27 2018, 19:5...   Jul 27 2018, 13:49
||- - Метценгерштейн   Цитата(_pv @ Jul 27 2018, 16:49) в каком ...   Jul 27 2018, 14:32
|- - Kabdim   Цитата(Метценгерштейн @ Jul 27 2018, 15:5...   Jul 27 2018, 14:48
|- - DASM   Цитата(Kabdim @ Jul 27 2018, 17:48) Но де...   Jul 27 2018, 15:22
- - Метценгерштейн   Так я же не против почитать что-то) Читал много, н...   Jul 27 2018, 14:50
- - Kabdim   Упрощенно: Переменная снаружи имеет какое-то значе...   Jul 27 2018, 15:02
|- - Herz   Цитата(Kabdim @ Jul 27 2018, 18:02) В сте...   Jul 27 2018, 17:32
|- - Arlleex   Цитата(Herz @ Jul 27 2018, 20:32) Простит...   Jul 27 2018, 18:21
- - Метценгерштейн   Кодret_code_t nfc_tk_value_get(ble_advdata_tk_...   Jul 27 2018, 15:24
- - Kabdim   2Метценгерштейн: Видимо я утерял нить рассуждений....   Jul 27 2018, 15:42
- - Метценгерштейн   Arlleex, спасибо за подробное изложение. Прошлись ...   Jul 27 2018, 19:42
|- - Arlleex   Цитата(Метценгерштейн @ Jul 27 2018, 22:4...   Jul 28 2018, 11:15
- - x893   Для АРМ параметры передаются через регистры (пока ...   Jul 27 2018, 19:46
- - Метценгерштейн   Спасибо. Упустил из вида момент, что Кодble_advda...   Jul 28 2018, 16:59
- - Метценгерштейн   Спасибо. Упустил из вида момент, что Кодble_advda...   Jul 29 2018, 05:19
|- - andrew_b   Цитата(Метценгерштейн @ Jul 29 2018, 08:1...   Jul 29 2018, 07:27
|- - GeorgK   Возможно (вроде этого не было), стоит ещё упомянут...   Aug 31 2018, 17:37
- - DASM   Давайте давайте учтите плохому. "Within funct...   Sep 1 2018, 04:17
- - Professor Chaos   Цитата(Метценгерштейн @ Jul 29 2018, 08:1...   Sep 1 2018, 13:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 03:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.03572 секунд с 7
ELECTRONIX ©2004-2016