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