将函数转换为通用 void 指针作为函数参数

oz3__m4

我必须将接收 int 数组、将值与常量进行比较并返回值与 const 不同的数组的函数转换为可以接收任何类型数组的通用函数。为此,我使用了 void 指针,但是在获取正确输出时遇到了一些问题,并且数组的重新分配也存在一些问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ALG 0 

int f2(int * e) {
  return *e == ALG;
}

int * f1(int a[], size_t *size, int (*fin)(int * e)) {
  size_t i = *size;
  while(i--) {
    if(fin(&a[i])) {
      memmove(&a[i], &a[i+1], (--*size -i)*sizeof(int));
    }
  }
  return realloc(a, *size * sizeof (int));
} 

//generic type function
int * f1a(void *a, size_t *size, int (*fin)(int * e)) {
  size_t i = *size;
  while(i--) {
    int * x = (int*) a + i;
    if(fin(x)) {
      memmove(a + i, a + i + 1, (--*size -i)*sizeof(*a));
    }
  }
 return realloc(a, *size * sizeof (*a));
} 


int main(void) {

  int *a = malloc(8*sizeof(int));
  a[0] = 2; a[1] = -3; a[2] = 1; a[3] = 0; a[4] = 4; a[5] = 7; a[6] = 0; a[7] = 6;

  size_t i, size=8;
  printf("%zu\n", size);
  
  //int *res = f1(a, &size, f2); output : 2 -3 1 4 7 6
  
  int *res = f1a(a, &size, f2);

  for(i=0; i<size; i++) {
    printf("%d ", res[i]);
  }    
  
  return 0;
}

有人可以帮我吗?

提前致谢!

卡米尔库克

编写可读的代码。一次只做一件事。命名变量有意义。将上下文传递给用户回调函数。qsort和 中获取灵感qsort_rfree记忆。处理错误。

翻译 1:1 带有附加size参数的函数,该参数表示一个数组元素的大小。

void *filter_generic(
     void *base, size_t nmemb, size_t size,
     size_t *out_nmemb,
     int (*fin)(void* e, size_t size, void *cookie), void *cookie) {
   for (size_t i = nmemb; i--; ) {
      void *elempnt = (char*)base + (size * i);
      if (fin(elempnt, size, cookie)) {
            // the following is invalid and
            // results in out-of-bounds access
            memmove(
               (char*)base + (size * i),
               (char*)base + (size * (i + 1)),
               size * (nmemb - i)
            );
            nmemb -= 1;
       }
    }
    *out_nmemb = nmemb;
    return realloc(base, size * );
}

在这种情况下,使用两个指针或两个索引就简单多了。

#include <stdlib.h>
#include <string.h>

int intpnt_compare_to_zero(void *elem, size_t size, void *cookie) {
    return *(int *)elem == 0;
}

/**
 * Filters array elements depending on function.
 * @param base like for qsort
 * @param nmemb like for qsort
 * @param size like for qsort
 * @param out_nmemb return new size of the array
 * @param compare comparison function
 * @param cookie cookie for compare
 * @return new allocate memory for array
 */
void *filter_generic(void *base, size_t nmemb, size_t size, size_t *out_nmemb,
             int (*compare)(void *e, size_t size, void *cookie), void *cookie) {
    void *out = base;
    void *in = base;
    void *const end = (char *)base + (size * nmemb);
    for (; in < end; in = (char *)in + size) {
        if (compare(in, size, cookie)) {
            memmove(out, in, size);
            out = (char *)out + size;
        }
    }
    const size_t new_nmemb = ((char *)out - (char *)base) / size;
    *out_nmemb = new_nmemb;
    return realloc(base, size * new_nmemb);
}

int main(void) {
    size_t size = 8;
    int *a = malloc(sizeof(*a) * size);
    a[0] = 2;
    a[1] = -3;
    a[2] = 1;
    a[3] = 0;
    a[4] = 4;
    a[5] = 7;
    a[6] = 0;
    a[7] = 6;

    int *res = filter_generic(a, size, sizeof(*a), &size, intpnt_compare_to_zero, NULL);
    for (size_t i = 0; i < size; ++i) {
        printf("%d%s", res[i], i + 1 == size ? "\n" : " ");
    }

    free(res);
}

代码打印0 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

void **指针和void * []作为函数参数

来自分类Dev

显式void指针作为函数参数

来自分类Dev

将指针传递给成员函数作为void *函数的参数

来自分类Dev

函数指针将参数强制转换为 void

来自分类Dev

具有void * a和指针函数作为参数的函数

来自分类Dev

函数参数中的void指针

来自分类Dev

您可以将“函数指针指向指针”转换为void *

来自分类Dev

如何将void指针强制转换为函数指针

来自分类Dev

带void *参数转换的函数指针

来自分类Dev

函数指针中 void* 参数的自动转换

来自分类Dev

将void函数转换为char * C ++

来自分类Dev

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

来自分类Dev

将void指针作为参数传递

来自分类Dev

指针作为函数的参数

来自分类Dev

以void指针作为参数传递函数会发出警告

来自分类Dev

如何在C中使用结构指针作为参数调用void函数?

来自分类Dev

将指针转换为void

来自分类Dev

传递函数返回 void * 作为参数

来自分类Dev

“在尝试将函数作为参数传递时,不存在合适的构造函数来从“void() 转换为”std::function<void()>”错误

来自分类Dev

在将指针作为void *参数的参数传递时强制转换指针

来自分类Dev

指向void函数的指针

来自分类Dev

函数需要参数并返回指向void函数的指针

来自分类Dev

接口指针作为函数参数

来自分类Dev

函数指针作为模板参数

来自分类Dev

指针作为函数参数的麻烦

来自分类Dev

LLVM指针作为函数参数

来自分类Dev

使用指针作为函数的参数

来自分类Dev

双指针作为函数参数

来自分类Dev

双指针作为函数的参数