Вызов функции без параметров, но для нее определены параметры?

#c #stm32

#c #stm32

Вопрос:

Я смотрю на этот пример: https: //github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lsm9ds1_STdC

Я пытаюсь понять, как в приведенном ниже коде platform_write_imu вызывается без каких-либо параметров?

 
    static int32_t platform_write_imu(void *handle, uint8_t reg, uint8_t *bufp,
                                     uint16_t len);
    static int32_t platform_read_imu(void *handle, uint8_t reg, uint8_t *bufp,
                                    uint16_t len);
    static int32_t platform_write_mag(void *handle, uint8_t reg, uint8_t *bufp,
                                     uint16_t len);
    static int32_t platform_read_mag(void *handle, uint8_t reg, uint8_t *bufp,
                                    uint16_t len);
    
    /* Main Example --------------------------------------------------------------*/
    void lsm9ds1_read_data_polling(void)
    {
     stmdev_ctx_t dev_ctx_imu;
    
     /* Initialize inertial sensors (IMU) driver interface */
     dev_ctx_imu.write_reg = platform_write_imu;
     dev_ctx_imu.read_reg = platform_read_imu;
     dev_ctx_imu.handle = (void*)amp;imu_bus;

  

Какова роль дескриптора void указателя функции, когда он нигде не определен? Этот код строит BTW

 
    static int32_t platform_write_imu(void *handle, uint8_t reg, uint8_t *bufp,
                                     uint16_t len)
    {
     sensbus_t *sensbus = (sensbus_t*)handle;
     
     #if defined(NUCLEO_F411RE)
     HAL_I2C_Mem_Write(sensbus->hbus, sensbus->i2c_address, reg,
                       I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
     #endif
     return 0;
    }

  

Просто хотелось бы знать, что здесь происходит с точки зрения последовательности.

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

1. dev_ctx_imu.write_reg = platform_write_imu; это утверждение, о котором вы спрашиваете? если да, то это не вызов, а просто сохранение / присвоение адреса функции там, тогда при необходимости она будет вызываться как dev_ctx_imu.write_reg(handle, reg, bufp,t len)

2. И где этот вызов? dev_ctx_imu.write_reg = platform_write_imu; присваивание, присвоение указателя функции переменной, это не вызов функции.

3. void *handle не является указателем на функцию. Это указатель на пустые данные.

4. dev_ctx_imu.write_reg = platform_write_imu; это не вызов, а назначение функции (указателя) в левую часть.

Ответ №1:

 dev_ctx_imu.write_reg = platform_write_imu;
/* ... */
  

Он присваивает указателям на функции адрес функции. Это не вызов.

Какова роль дескриптора void указателя функции, когда он нигде не определен?

Это не указатель на функцию, а только указатель на пустые данные.

Просто хотелось бы знать, что здесь происходит с точки зрения последовательности.

Это просто обычный параметр. Не имеет никакой последовательности.

Кстати, чтобы программировать UCS, вам нужно намного лучше изучить C. Мой совет — научитесь использовать свой компьютер, когда вы поймете, что указатели, массивы и указатели на функции хорошо возвращаются к встроенному.