预期为“ double **”,但参数的类型为“ double(*)[2]”

阿纳斯·阿尔祖巴(Anas Alzurba)

我在C语言中遇到了这种奇怪的行为。

这段代码给了我编译警告:

expected 'double **' but argument is of type 'double (*)[2]'

问题是什么?双精度数组是双精度指针,对吗?

顺便说一句,如果我发送数组本身,分配不会影响值,我也不知道为什么。

#include <stdio.h>

void set1(double **x)
{
    (*x)[0] = (*x)[1] =1.0;
}

int main()
{
    double x[2];
    set1(&x);
    printf("%d\n%d\n",x[0],x[1]);
}
来自莫斯科的弗拉德

对于符合C标准的启动器,应声明无参数的main函数,例如

int main( void )

要输出类型的对象,double您至少应使用转换说明符%f而不是%d否则,该函数printf具有未定义的行为。

现在关于指针。

如果您有一个类型object的对象,则T其中T有一些类型说明符序列,例如

T x;

那么指向对象的指针将具有类型 T *

因此,让我们使用此抽象类型编写程序T

#include <stdio.h>

void set1( T *x )
{
    //...
}


int main(void) 
{
    T x;

    set1( &x ) ;

    // ...

    return 0;
}

该程序将无法编译,因为T到目前为止类型仍然未知。但是T原始程序的类型是什么

可以通过以下方式定义

typedef double T[2];

现在,如果将此typedef添加到程序中,它将进行编译。

#include <stdio.h>

typedef double T[2];

void set1( T *x )
{
    //...
}


int main(void) 
{
    T x;

    set1( &x ) ;

    // ...

    return 0;
}

那么,如果使用表达式&x作为参数,则函数参数的类型是什么

其类型为double ( *x )[2]double **与这两种类型的指针不同,并且没有隐式转换。也就是说这些类型的指针不兼容。

在这种情况下,返回到原始程序

#include <stdio.h>

void set1( double ( *x )[2] )
{
    (*x)[0] = (*x)[1] = 1.0;
}


int main(void) 
{
    double x[2];

    set1( &x ) ;

    printf( "%f\n%f\n", x[0] , x[1] );

    return 0;
}

如果您希望功能参数确实具有类型,double **则必须指定功能参数,如下面程序所示

#include <stdio.h>

void set1( double **x )
{
    (*x)[0] = (*x)[1] = 1.0;
}


int main(void) 
{
    double x[2];
    double *p = x;

    set1( &p ) ;

    printf( "%f\n%f\n", x[0] , x[1] );

    return 0;
}

在此程序p中,类型的指针指向double *数组的第一个元素,并将类型的指针的地址double **传递给函数。

但是,要更改数组的元素,只需将参数声明为具有类型就足够了,double *因为在这种情况下,数组的元素已经通过使用指针间接传递了。

#include <stdio.h>

void set1( double *x )
{
    x[0] = x[1] = 1.0;
}

int main(void) 
{
    double x[2];

    set1( x ) ;

    printf( "%f\n%f\n", x[0] , x[1] );

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

预期为“double *”,但参数的类型为“double”,并且函数参数 2/3/4/5 的类型不兼容

RuntimeError:标量类型为Double的预期对象,但参数#2的标量类型为Float

格式“%lf”需要类型为“double”的参数,但参数 2 的类型为“double *”

如何修复RuntimeError“标量类型为Float的预期对象,但参数为标量类型Double”?

C学生作业,'%f'期望参数类型为'float *',但是参数2的类型类型为'double *'

不能使用类型为“Double”的参数为“[Double]”类型的值添加下标

无法为类型为((String?)'的参数列表调用类型为'Double'的初始化程序

pytorch RuntimeError:标量类型为Double的预期对象,但标量类型为Float

类型为'double'的输入参数的未定义函数'fitrsvm'

未为参数类型Double,int定义运算符^

类型为'double'的输入参数的未定义函数'num2str'

无法使用类型为double的左值初始化类型为'id _NonNull'的参数

使用gcc编译时出现错误:警告:格式指定类型为'int *',但参数的类型为'double *'

绝对值函数“ fabsf”的参数类型为“ double”,但参数类型为“ float”,这可能会导致值被截断?

Pytorch CNN培训中的“ RuntimeError:预期标量类型为Double,但找到了Float”

无法使用类型为“([Int])”的参数列表调用类型“Double”的初始化程序

检查 double 是否为幂 2

符号函数:输入参数必须为“ double”

c double参数被传递为错误的值

参数为double时如何返回None?

Hibernate @Digits验证为Double类型

无法查询属性为double类型的实体

[Error] TypeError:预期动态类型为'double',但在React Native中具有字符串类型

ValueError:缓冲区dtype不匹配,预期为“ Python对象”,但为“ double”

标量类型为Long的预期对象,但参数#2'target'为标量类型Byte

RuntimeError:标量类型为Long的预期对象,但参数#2'target'的标量类型为Float

指针类型不兼容,预期为float *,但参数的类型为float(*)[2]

无法使用类型为'(distance:(CGVector,fadeInWithDuration:Double))'的参数列表调用'moveDistance'

“类型为'double'的输入参数的未定义函数'function_name'。”