C语言 如何创建一个函数来处理数组中不同的数据类型

qq24tv8q  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(163)

我想创建一个可以修改静态数组的最后一个元素的函数,但它可以处理不同类型的数据(int16_t、uint16_t和float)
我已经设法让它在不同的函数中为每一种数据工作。我想设计一个单一的函数,可以处理每一种数据。
下面是float元素的代码片段。

void fifo_datas_update_float(float data_in, float *datas, uint8_t size)
{       
    datas[size-1] = data_in;        //assign new value to last element
}

const uint8_t dtsize = 3;
static float datas_fake[dtsize] = {10,20,30};
float new_value = 40;
fifo_datas_update_float(new_value, datas_fake, dtsize);

字符串
任何帮助都将不胜感激。

oknwwptz

oknwwptz1#

正如some_programmer_dude在评论中所说,你可以像下面这样使用_Generic(从C 2011开始)。

  • 请注意,您只能使用1个泛型关联,因此我将其中一个参数设置为(void *)。*
#include <inttypes.h>
#include <stdio.h>
 
#define update_last(n, X, p) \
        _Generic((X), \
            float *: updatef, \
            default: updatei16, \
            uint16_t *: updateu16 \
        )(n, X, p)
 
// src must have type (int16_t *)
void updatei16(size_t n, int16_t a[static n], void *src) {
    a[n-1] = *(int16_t *)src;
}
 
// src must have type (uint16_t *)
void updateu16(size_t n, uint16_t a[static n], void *src) {
    a[n-1] = *(uint16_t *)src;
}
 
// src must have type (float *)
void updatef(size_t n, float a[static n], void *src) {
    a[n-1] = *(float *)src;
}
 
int main(void) {
    float ff[1] = { 2023 }, fff = 3.1416F;
    uint16_t uu[1] = { 2023 }, uuu = 42;
    int16_t ii[1] = { 2023 }, iii = -1;
 
    printf("%f, %"PRIu16", %"PRId16"\n", ff[0], uu[0], ii[0]);
 
    update_last(1, ff, &fff);
    update_last(1, uu, &uuu);
    update_last(1, ii, &iii);
 
    printf("%f, %"PRIu16", %"PRId16"\n", ff[0], uu[0], ii[0]);
 
    return 0;
}

字符串
请参阅https://ideone.com/aAqvTU
上面代码的输出是

2023.000000, 2023, 2023
3.141600, 42, -1

zxlwwiss

zxlwwiss2#

您可以使用以下命令:

void set( void *a, size_t i, void *val_ptr, size_t ele_size ) {
   char *p = a;
   memcpy( p + ( i * ele_size ), val_ptr, ele_size );
}

set( datas_fake, dtsize-1, &new_value, sizeof( *datas_fake ) );

字符串
但是这并不能比直接调用memcpy节省保存任何东西。

memcpy( datas_fake + dtsize-1, &new_value, sizeof( *datas_fake ) );

u0sqgete

u0sqgete3#

要建立在@pmg的答案上,你可以用途:

#define gen_update(_suffix, _type) \
    void update_##_suffix(size_t n, _type a[static n], void *src) \
    {   a[n-1] = *(_type *)src; }

gen_update(ld, long double)
gen_update(d, double)
gen_update(f, float)
gen_update(ull, unsigned long long)
gen_update(ll, long long)
gen_update(ul, unsigned long)
gen_update(l, long)
gen_update(u, unsigned)
gen_update(i, int)
... 
// And so on.

字符串
以避免重复。

相关问题