繁体   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