Доступ к аргументу объявленной функции - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующее объявление функции:

typedef void (cback) (scan_results *scan_result, uint8_t *adv_data);

Я объявляю функцию следующим образом:

cback my_cback;

Я даю my_cback функции в качестве входа.Затем я хочу получить доступ к аргументам my_cback.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я даю my_cback функции в качестве входа.
Затем я хочу получить доступ к аргументам my_cback.Как мне этого добиться?

Передать функции (foobar() ниже) не только my_cback, но и аргументы для my_cback().

#include <stdint.h>
#include <stdio.h>

typedef char *scan_results;
typedef void (cback) (scan_results *scan_result, uint8_t *adv_data);

// Declare function
cback my_cback;

// Define function
void my_cback(scan_results *scan_result, uint8_t *adv_data) {
  *scan_result = "Hello";
  *adv_data = 42;
}

void foobar(cback foo, scan_results *scan_result, uint8_t *adv_data) {
  (foo)(scan_result, adv_data);
  // access the arguments
  printf("Inside foobar(): scan_result = %s, adv_data = %d\n", *scan_result, 
      *adv_data); 
}

int main() {
  scan_results sr;
  uint8_t data;
  // I give my_cback to a function as an input.
  foobar(my_cback, &sr, &data);
  // access the arguments
  printf("Inside main():   scan_result = %s, adv_data = %d\n", sr, data);
}

Выход

Inside foobar(): scan_result = Hello, adv_data = 42
Inside main():   scan_result = Hello, adv_data = 42
0 голосов
/ 11 декабря 2018

С моим VC2008 следующие компилируются и запускаются:

typedef void (cback) (int *scan_result, int *adv_data);

void f(int *scan_result, int *adv_data)
{
    *adv_data= *scan_result;
}
void ftest(cback *g, int k)
{
    int l;
    g(&k, &l);           // call the function passed as argument
    printf("%d\n",l);
}
void test(void)
{
    int i=3, j;
    cback *my_cback= f;   // assign f to a function pointer variable
    my_cback(&i,&j);      // call  the function pointer directly
    printf("%d\n",j);
    ftest(my_cback, 4);   // pass the function pointer
}

Вывод:

3
4
...