我正在编写一个函数,该函数使用递归性返回数组的逆数组,但我不断收到以下警告:
以下是我的代码
#include <stdio.h>
#include <stdlib.h>
int inv( float* t[],int n)
{ float u;
if (n==0) return 0;
else
{
u=*t;
*t=*(t+n);
*(t+n)=u;
return(inv(*(t+1),n-1));
}
}
int main()
{
float t[]={1,2,3,4,5,6,7,8,9};
int n=sizeof t /sizeof *t;
int i=0;
inv(t,n);
for(i=0;i<n;i++)printf("%f",t[i]);
return 0;
}
发布于 2020-12-16 12:55:54
浮点数int inv(
* t[],int n)
这里,float* t[]
声明了一个指针数组。请注意,*t[i] = *(*(t+i))
如果i= 0,则为*(*(t+i)) = *(*(t)) = *(*t)
。
这里,*t
是float*
类型,u
是float类型。
使用表达式u=*t;
会产生该错误(将float*
值赋给float
)
解决方案:将int inv( float* t[],int n)
更改为int inv( float t[],int n)
发布于 2020-12-16 13:02:21
我使用一个过程将数组元素按降序排列
#include <stdio.h>
#include <stdlib.h>
void revs(int i, int n, float *arr)
{
if(i==n)
{
return ;
}
else
{
revs(i+1, n, arr);
printf("%.f ", arr[i]);
}
return 0;
}
int main()
{
float t[]={1,2,3,4,5,6,7,8,9};
int n=sizeof t /sizeof t[0];
int i=0;
revs(0,n,t);
}
发布于 2020-12-16 15:10:04
看起来OP的函数inv
的意图是使用递归原地反转n
float
值数组的元素。
在原始inv
代码中,编译器会将参数声明float* t[]
调整为等价于float** t
。需要将其更改为float t[]
或等效的float* t
。
在原始inv
代码中,返回值要么是0
,要么是对自身的递归调用的结果,只能是0
。因此,返回值没有任何用处。最好将函数的返回类型更改为void
。
在inv
函数中,参数n
被设置为来自main
的初始调用中数组的长度。该函数在递归之前交换索引0和n
处的元素的值,但索引n
处没有元素。最后一个元素的索引为n-1
。在递归之前,函数应该交换索引为0和n-1
的元素。交换第一个和最后一个元素后,索引从1到n-2
的其余n-2
元素可以通过递归调用进行交换。原始inv
代码在递归调用中使用值n-1
,但它应该为n-2
。
如果n
小于2,则inv
函数不需要执行任何操作。
基于OP的原始代码的inv
的可能实现如下:
void inv(float* t,int n)
{
float u;
if (n>=2)
{
u=*t;
*t=*(t+n-1);
*(t+n-1)=u;
inv(t+1,n-2));
}
}
可以使用数组下标操作符编写相同的函数,如下所示:
void inv(float t[],int n)
{
float u;
if (n>=2)
{
u=t[0];
t[0]=t[n-1];
t[n-1]=u;
inv(&t[1],n-2));
}
}
https://stackoverflow.com/questions/65323449
复制