簡體   English   中英

編譯時出錯:不兼容的類型和類似的警告(附圖)

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

這里, *tfloat*類型,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM