是否可以使用格式说明符作为函数的参数

时间:2019-05-14 10:31:57

标签: c function parameter-passing format-specifiers

我正在尝试编写一个函数,该函数允许我使用给定值初始化矩阵的每个元素。我希望此函数尽可能通用,这意味着它可以处理任何数据类型(浮点型,字符型等)的矩阵。 该函数显然需要用户希望初始化矩阵元素的值作为参数之一。由于此值可以是任何类型的数据类型,因此我不知道该如何处理。 由于使用了格式说明符(%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');

像这样可行吗?还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

假设矩阵是元素类型的正确2D数组(元素类型的数组的数组),而不是元素类型的指针的1D数组,则可以传递void *指针指向要初始化的矩阵的第一个元素,矩阵的尺寸,元素的大小以及指向初始元素值的指针,如下所示:

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

void initMatrix(void *matrixToInit, unsigned int nRows, unsigned int nCols,
        size_t elemSize, const void *elemVal)
{
    size_t offset, end;

    end = nRows * nCols * elemSize;
    for (offset = 0; offset < end; offset += elemSize) {
        memcpy((char *)matrixToInit + offset, elemVal, elemSize);
    }
}

int main(void)
{
    char matrixOfAs[3][3];
    int i, j;

    initMatrix(&matrixOfAs[0][0], 3, 3, sizeof(char), (char []){ 'A' });
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            printf(" %c", matrixOfAs[i][j]);
        }
        printf("\n");
    }
    return 0;
}

如果您不喜欢我传递给参数(char []){ 'A' }的复合文字数组值elemVal(允许数组值衰减到指向其第一个元素的指针),则可以将其替换为在这种情况下,指向类型为char的初始化变量的指针,例如定义char a = 'A';并将(char []){ 'A' }替换为&a

答案 1 :(得分:0)

要使此函数对您选择使用的任何数据类型通用,只需创建不处理特殊数据类型而是使用函数指针的函数即可。

这意味着不是传递该函数,而是传递用户选择哪种类型的符号,然后为function* file2Func(){ console.log("A"); yield* func1(); console.log("B"); yield* func2(); console.log("C"); yield* func3(); } 创建一个大小写,为int创建一个大小写,为char创建一个大小写,而是传递hanle函数每种类型作为参数。

例如,使函数float像这样:

initMatrix

现在,创建另一个函数来处理void initMatrix(void*** matrix, int nRows, int nCols, void(*creatematrix)(void ***, int, int));的创建,将其称为int **matrix,并将指向该函数的指针作为initmatrix函数的参数传递。 现在,当您调用void CreateIntMatrix(void ***matrix, int m, int m);处理int数据类型时,只需这样命名即可:

initMatrix

您还应该创建处理char,double等的函数。

现在,当您创建initMatrix函数时,应像这样创建它:

void initMatrix(&matrixOfAs, 3, 3, CreateIntMatrix);