c中

时间:2017-06-28 13:30:51

标签: c arrays generics

我希望有一个泛型函数可以在不同大小但数据类型相同的多个数组上运行,并且仅将数组作为参数。我们考虑三个数组arr1[10]arr2[15]arr3[20]。通用函数应该是:

void func(int array_number)
{
   for(int i=0; i<y; i++)
   {
     arrz[i] = i;
   }
}

此处将根据y(参数)选择数组大小array_numberz中的arrz[i]应为array_number({{1}的参数}})以便func将数据放入相应的数组中。用c语言有可能吗? 我知道一个解决方案是在函数调用期间为差异化数组发送一些数字作为参数,但实际上我不想在func中使用if-else来避免冗长的代码。

2 个答案:

答案 0 :(得分:1)

您的功能需要了解每个阵列,并根据数字选择一个。如果您的示例中有一小部分固定数量的全局数组,则可以使用switch选择一个:

void func(int array_number)
{
    int *arr;
    int len, i;

    switch (array_number) {
    case 1:
       arr = arr1;
       len = sizeof(arr1) / sizeof(arr1[0]);
       break;
    case 2:
       arr = arr2;
       len = sizeof(arr2) / sizeof(arr2[0]);
       break;
    case 3:
       arr = arr3;
       len = sizeof(arr3) / sizeof(arr3[0]);
       break;
    default:
       return;
    }

    for(int i=0; i<len; i++)
    {
      arr[i] = i;
    }
}

当然,最灵活的事情是更改函数以获取数组(技术上指向第一个元素的指针)和长度。

void func(int *arr, int len)
{
    for(int i=0; i<len; i++)
    {
      arr[i] = i;
    }
}

答案 1 :(得分:0)

考虑一个辅助函数,它接受int *size_t来执行增量分配。

void func_helper(int *arr, size_t length) {
  for (size_t i = 0; i < length; i++) {
    arr[i] = (int) i;
  }
}

...和另一个将索引转换为数组指针和长度的函数。

不使用长链if-else语句

int arr1[10], arr2[15], arr3[20];

void func(int array_index) {
  const struct xx {
    int *ptr;
    size_t length;
  } arrays[] = { //
      { arr1, sizeof arr1 / sizeof arr1[0] }, //
      { arr2, sizeof arr2 / sizeof arr2[0] }, //
      { arr3, sizeof arr3 / sizeof arr3[0] } };
  const size_t n = sizeof arrays / sizeof arrays[0];

  // Test array_index validity
  if (array_index > 0 && array_index <= n) {
    array_index--;
    func_helper(arrays[array_index].ptr, arrays[array_index].length);
  }
}