Search code examples
callbackdouble-pointer

Passing pointer to a function callback


I want to pass an array to a callback function, but I always get zero (sometimes garbage character) return of call_print(). My code are in two separate files below, and I like to keep it like this.

file1.c

#include <myheader.h>

uint8_t dummy[6] = {0x30, 0x30, 0x31, 0x31, 0x32, 0x32};

void dcallback(uint8_t **outputBuff)

int main(void)
{
    slave(dcallback);
}

void dcallback(uint8_t **outputBuff)
{ 
    *outputBuff = dummy;
}

file2.c

#include <myheader.h>

static void (*data_callback)(uint8_t **output_buffer);

uint8_t **output_buffer;

void slave(void (*data_callback_in)(uint8_t **output_buffer))
{
    int i;

    data_callback = data_callback_in;
    data_callback(output_buffer);

    for(i=0 ; i<6 ; i++)
    {
        call_print( **(output_buffer + i));
    }
}

When I modify the code as you can see below, I got '0 1 2 3 4 5'. This seems correct result, but this is not what I want. I want to pass an array, so that I can point the pointer to another array easily. I thought I made mistake working with pointer.

file1.c

#include <myheader.h>

uint8_t dummy[6] = {0x30, 0x30, 0x31, 0x31, 0x32, 0x32};

void dcallback(uint8_t *outputBuff)

int main(void)
{
    slave(dcallback);
}

void dcallback(uint8_t *outputBuff)
{ 
    int x;

    for(x=0 ; x<6 ; x++)
    {
        *outputBuff = x;
    }
}

file2.c

#include <myheader.h>

static void (*data_callback)(uint8_t *output_buffer);

uint8_t output_buffer[6];

void slave(void (*data_callback_in)(uint8_t *output_buffer))
{
    int i;

    data_callback = data_callback_in;
    data_callback(output_buffer);

    for(i=0 ; i<6 ; i++)
    {
        call_print(output_buffer[i]);
    }
}

Someone, could you please spot where I made mistake? How should I properly pass 'dummy' array?

Thanks before.


Solution

  • Try making uint8_t **output_buffer; as single pointer uint8_t *output_buffer;

    and while calling the callback from slave method you need to call like below.

    data_callback(&output_buffer);
    

    Here is the full code.

    #include<stdio.h>
    #include<stdint.h>
    
    uint8_t dummy[6] = {0x30, 0x30, 0x31, 0x31, 0x32, 0x32};
    
    static void (*data_callback)(uint8_t **output_buffer);
    
    uint8_t *output_buffer;
    void dcallback(uint8_t **outputBuff);
    
    int main(void)
    {
        slave(dcallback);
    }
    
    void dcallback(uint8_t **outputBuff)
    {
        *outputBuff = dummy;
    }
    
    
    
    void slave(void (*data_callback_in)(uint8_t **output_buffer))
    {
        int i;
    
        data_callback = data_callback_in;
        data_callback(&output_buffer);
    
        for(i=0 ; i<6 ; i++)
        {
            printf("%d\n", *(output_buffer + i));
        }
    }