【发布时间】:2019-05-14 10:31:56
【问题描述】:
我正在尝试编写一个函数,该函数允许我用给定值初始化矩阵的每个元素。我希望这个函数尽可能通用,这意味着它能够处理任何数据类型(float、char 等)的矩阵。 该函数显然需要用户希望初始化矩阵元素的值作为参数之一。由于这个值可以是任何类型的数据类型,我不知道该怎么做。 由于使用了格式说明符(%d、%f 等),诸如 printf 和 scanf 之类的标准函数能够接受任何类型的参数。这让我想知道:如何以及是否可以在程序员定义的函数中使用格式说明符? 理想情况下,我的函数看起来像这样:
void initMatrix(void*** matrixToInit, int nRows, int nCols, const char format, void(?) value)
所以在调用它时我必须写如下内容:
char matrixOfAs[3][3];
initMatrix(&matrixOfAs, 3, 3, "%c", 'A');
这样的事情可行吗?这个问题还有其他解决方案吗?
【问题讨论】:
-
为什么不定义多个初始化函数,每个用于所需的数据类型,并给定矩阵元素的类型,调用合适的。
-
Google
_Generic自 C11 以来就在 C 中。您可能还想使用宏来执行此操作,这更容易,但更危险。或者可能最简单的解决方案是为您感兴趣的每种类型执行不同的函数:foo_int()、foo_flt()、foo_dbl()、... -
只需将元素类型的大小和指向其初始值的指针传递给函数即可。由于这个函数不依赖于类型的语义,它可以完全通过复制字节来操作。需要注意指针:如果存储在内存中的数据是
int *,则将指向它的指针(int **)转换为void **在技术上是不正确的,使用多级指针来实现多维数组是无论如何都是不好的做法。数组的数组应该是首选。 -
&matrixOfAs是char (*)[3][3],与void *** matrixToInit完全不同。
标签: c function parameter-passing format-specifiers