[英]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.