Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从递归函数传递指针_C_Function_Pointers_Recursion - Fatal编程技术网

C 从递归函数传递指针

C 从递归函数传递指针,c,function,pointers,recursion,C,Function,Pointers,Recursion,我被要求只使用递归方法编写选择排序代码。所以我想做另一个函数来查找存储最大值的数组,然后在我的另一个函数中切换它 void p_rec_max(int data[], int cur, int arrSize,int * x) { if(cur < arrSize - 1) { if(data[cur] > data[arrSize - 1]) { *x = cur; } else if(data[cur] < d

我被要求只使用递归方法编写选择排序代码。所以我想做另一个函数来查找存储最大值的数组,然后在我的另一个函数中切换它

void p_rec_max(int data[], int cur, int arrSize,int * x) {
    if(cur < arrSize - 1) {
        if(data[cur] > data[arrSize - 1]) {
            *x = cur;
        } else if(data[cur] < data[arrSize - 1]){
            *x = arrSize - 1;
        }
        p_rec_max(data,cur + 1,arrSize,&x);
    }
}

void rec_selection_sort(int data[], int arrSize) {
    if(arrSize > 0) {
        int maxi,temp;
        p_rec_max(data,0,arrSize,&maxi);
        temp = data[arrSize - 1];
        data[arrSize - 1] = data[maxi];
        data[maxi] = temp;
        rec_selection_sort(data,arrSize - 1);
    }
}
void p_rec_max(int data[],int cur,int arrSize,int*x){
如果(电流数据[arrSize-1]){
*x=cur;
}else if(数据[cur]<数据[arrSize-1]){
*x=arrSize-1;
}
p_rec_max(数据、cur+1、arrSize和x);
}
}
无效记录选择排序(整数数据[],整数大小){
如果(arrSize>0){
int maxi,温度;
p_rec_max(数据、0、arrSize和最大值);
温度=数据[arrSize-1];
数据[arrSize-1]=数据[maxi];
数据[maxi]=温度;
记录选择排序(数据,arrSize-1);
}
}
它得到了这样的警告

在函数“p_rec_max”中: 警告:从不兼容的指针类型传递参数4“p_rec_max”[默认启用] 注意:应为“int*”,但参数的类型为“int**”

它根本不会改变我的数组。 我缺少在函数中传递指针的信息,这不能帮助我解决这个问题。 你们能修好我的代码,然后向我解释我的代码有什么问题吗?
谢谢第一个问题

您对此行有问题:

p_rec_max(data,cur + 1,arrSize,&x);
                               ^^
由于
x
int*
&x
int**
,这不是函数所期望的

将行更改为:

p_rec_max(data,cur + 1,arrSize, x);
i、 e.编号
x

第二个问题

p_rec_max
函数找不到最大数组值的索引

如果所有数组元素都相同,则代码永远不会执行
*x=…
。换言之,
maxi
将永远不会被写入,您最终会在这里使用未初始化的索引
data[arrSize-1]=data[maxi]这是未定义的行为,可能会使程序崩溃

除此之外,我认为函数中的基本逻辑是错误的。代码总是将
cur
与最后一个数组元素进行比较。这似乎是错误的。我认为您应该将
cur
与迄今为止找到的最大值进行比较。这可以使用变量
x
完成

比如:

void p_rec_max(int data[], int cur, int arrSize,int * x) {
    if(cur < arrSize) {
        if(data[cur] > data[*x]) {
            *x = cur;
        }
        p_rec_max(data, cur + 1, arrSize, x);
    }
}

顺便说一句:使用递归函数来查找数组中的最大值当然不是一个好方法,但我想您不允许在循环过程中使用简单的
进行

第一个问题

您对此行有问题:

p_rec_max(data,cur + 1,arrSize,&x);
                               ^^
由于
x
int*
&x
int**
,这不是函数所期望的

将行更改为:

p_rec_max(data,cur + 1,arrSize, x);
i、 e.编号
x

第二个问题

p_rec_max
函数找不到最大数组值的索引

如果所有数组元素都相同,则代码永远不会执行
*x=…
。换言之,
maxi
将永远不会被写入,您最终会在这里使用未初始化的索引
data[arrSize-1]=data[maxi]这是未定义的行为,可能会使程序崩溃

除此之外,我认为函数中的基本逻辑是错误的。代码总是将
cur
与最后一个数组元素进行比较。这似乎是错误的。我认为您应该将
cur
与迄今为止找到的最大值进行比较。这可以使用变量
x
完成

比如:

void p_rec_max(int data[], int cur, int arrSize,int * x) {
    if(cur < arrSize) {
        if(data[cur] > data[*x]) {
            *x = cur;
        }
        p_rec_max(data, cur + 1, arrSize, x);
    }
}

顺便说一句:使用递归函数来查找数组中的最大值当然不是一个好方法,但我猜您不允许在循环过程中使用简单的
进行

请做一个解释。请阅读并显示错误消息,请进行修改。阅读请显示错误msgDone,删除错误消息。但是数组根本没有排序。非常感谢。这样做真的很有帮助,删除了错误消息。但是数组根本没有排序。非常感谢。这真的很有帮助