[英]Error when compiling : incompatible types and similar warnings ( picture attached )
我正在编写一个 function ,它使用递归返回数组的倒数,但我不断收到这些警告:
这是我的代码
#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;
}
int inv(float* 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)
我使用一个过程以降序排列数组元素
#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);
}
看起来 OP 的 function inv
的预期操作是使用递归来反转n
float
值数组的元素。
在原inv
代码中,参数声明float* t[]
会被编译器调整为等价于float** t
。 这需要更改为float t[]
或等效的float* t
。
在原始的inv
代码中,返回值要么是0
,要么是递归调用自身的结果,只能是0
。 因此返回值是没有用的。 最好将 function 的返回类型更改为void
。
在inv
function 中,参数n
设置为来自main
的初始调用中的数组长度。 function 在递归之前交换索引 0 和n
处元素的值,但索引n
处没有元素。 最后一个元素的索引为n-1
。 function 应该在递归之前交换索引 0 和n-1
处的元素。 交换第一个和最后一个元素后,剩余的n-2
索引从 1 到n-2
2 的元素可以通过递归调用进行交换。 原始inv
代码在递归调用中使用值n-1
,但它应该是n-2
。
如果n
小于 2,则inv
function 不需要做任何事情。
基于 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));
}
}
相同的 function 可以使用数组下标运算符编写如下:
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));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.