通用函数,用于在C

时间:2019-05-09 18:53:56

标签: function-pointers void-pointers

此问题不是重复的问题。在上面链接的问题中我没有找到解决方案

使用void *指针,我编写了一个函数,该函数可以打印出任何数据类型的数组的元素。基本上,它接受作为参数:

  1. void *指针(即要打印的数组)。
  2. 数组中各个元素的大小。
  3. 数组长度。
  4. 指向void函数的指针,该函数仅接受void *指针作为参数,用于存储数组元素的地址。
void printArray (void* pointer, int width, int numberOfElements, void (*functionPointer)(const void*))
{
    for (int i = 0; i < numberOfElements; i++)
    {
        functionPointer ((void*)(pointer + width*i));
    }
}

然后,我创建了不同的函数,这些函数可以打印出一个变量。在这里,其中之一:

void printInt (const void* v)
{
    int* myInt = (int*) v;
    printf ("%d ", *myInt);
}

剩下要做的就是将要使用的打印函数的名称传递给printArray(),以便它可以是通用的。下面是一个示例:

int tempArray [] = {0,1,2};
printArray (tempArray, sizeof (int), 3, printInt);

为了打印2d数组,我考虑将“ printArray”函数放在for循环中,考虑矩阵的每一行都像单个数组一样。为此,我创建了此函数,将void *指针更改为void **指针,并将存储元素数的变量替换为矩阵的行数和列数:

void printMatrix (void** pointer, int width, int rows, int cols, void (*functionPointer)(const void* v))
{
    for (int i = 0; i < rows; i++)
    {
        printArray ((pointer + i*width), width, cols, functionPointer);
        printf ("\n");
    }
}

这里,主要功能:

#include <stdio.h>
#define ROWS 8
#define COLS 3

int main ()
{
    int matrix [ROWS][COLS] = {
            {0, 1, 2},
            {3, 4, 5},
            {6, 7, 8},
            {0, 3, 6},
            {1, 4, 7},
            {2, 5, 8},
            {0, 4, 8},
            {2, 4, 6}
    };

    printMatrix (matrix, sizeof (int), ROWS, COLS, printInt);

    return EXIT_SUCCESS;
}

输出:

0 1 2 
4 5 6 
8 0 3 
1 4 7 
5 8 0 
8 2 4 
57 8 2 
0 2 0 

我试图了解问题出在哪里。 我该怎么解决?

编辑

首先,感谢大家的回答。我解决了用以下方式用pointer + i*width替换printArray ((pointer + i*width), width, cols, functionPointer);中的pointer + i*cols的问题:

for (int i = 0; i < rows; i++)
{
    printArray ((pointer + i*cols), width, cols, functionPointer);
    printf ("\n");
}

printMatrix()函数现在可以正常工作。

0 个答案:

没有答案