C - 使用指向函数的指针没有结果

问题描述 投票:0回答:3

我正在创建一个程序,它使用指向函数的指针,允许用户从2个选项中选择对整数数组执行:反向或随机。但是,程序在执行时不会产生任何输出。我哪里做错了?

void reverseArray(int arraySize, int a[]);
void randomiseArray(int arraySize, int a[]);
void printArray(int arraySize, int a[], void (*arrayFunction)(int arraySize, int a[]));


int main ()
{

    srand(time(NULL));

    int selection;
    int myArray[] = {2,4,6,8,10,12,14,16,18,20};

    printf("Enter 0 for reverse, 1 for randomise.\n");
    scanf("%d",&selection);

    if (selection == 0)
        printArray(sizeof(myArray)/sizeof(myArray[0]),myArray,reverseArray);
    else if (selection == 1)
        printArray(sizeof(myArray)/sizeof(myArray[0]),myArray,randomiseArray);
    else
        printf("Please make a valid selection\n");

    return 0;

}

void reverseArray(int arraySize, int a[])
{
    int i,j=arraySize,swap=0;

    for (i=0;i<arraySize/2;i++)
    {
        swap = a[i];
        a[i] = a[j];
        a[j] = swap;
        --j;
    }

}

void randomiseArray(int arraySize, int a[])
{
    int i,j,swap;

    for (i=0;i<arraySize;i++)
    {
        j = rand()%(i+1);

        if (j!=i)
        {
            swap = a[i];
            a[i] = a[j];
            a[i] = swap;
        }
    }
}

void printArray(int arraySize, int a[], void (*arrayFunction)(int arraySize, int a[]))
{

    arrayFunction(arraySize, a);

    for (int i = 0; i < arraySize; i++) 
    {
        printf("%d ", a[i]);
    }
    printf("\n");

}

用户通过键入0表示反向或1表示随机选择他们想要执行的功能。根据该决定,调用printArray函数并进行相应的选择。

reverseArray只是一个通用交换函数,randomiseArray使用Fisher-Yates混洗算法。

我假设我的错误来源于printArray fucntion,但我无法纠正它。

c function pointers
3个回答
3
投票

两个错误

在reverseArray中,j应该从arraysize - 1开始,否则你将在数组的末尾写一个元素

void reverseArray(int arraySize, int a[])
{
    int i, j = arraySize - 1, swap = 0;

    for (i = 0; i<arraySize / 2; i++)
    {
        swap = a[i];
        a[i] = a[j];
        a[j] = swap;
        --j;
    }

}

randomizearray(),你分配给a[i]两次,而不是使用a[j]进行最后的任务。

void randomiseArray(int arraySize, int a[])
{
    int i, j, swap;

    for (i = 0; i<arraySize; i++)
    {

        j = rand() % (i + 1);
        printf("%d %d\n", i, j);
        if (j != i)
        {
            swap = a[i];
            a[i] = a[j];
            a[j] = swap;
        }
    }
}

第一个错误在反转时导致未定义的行为,第二个错误导致数组保持不变。除此之外,函数指针设置正常并且正常工作。


0
投票

在reverseArray()你的指数j超出范围,它应该是j=arraySize-1

除此之外它对我有用。


0
投票

您正在数组的边界外访问,导致UB,在这种情况下“无输出”:

reverseArray,你必须初始化j=arraySize-1。如果没有-1,你就会超出界限。

© www.soinside.com 2019 - 2024. All rights reserved.