C 如何将NULL赋值给浮点/双精度变量?

C 如何将NULL赋值给浮点/双精度变量?,c,java-native-interface,C,Java Native Interface,我在使用JNI时遇到问题。 编译器抱怨 [ERROR] /....c:112:28: error: pointer cannot be cast to type 'jfloat' (aka 'float') [ERROR] jfloat result = (jfloat) NULL; [ERROR] ^~~~ [ERROR] /usr/include/sys/_types/_null.h:29:15: note: expanded fr

我在使用JNI时遇到问题。

编译器抱怨

[ERROR] /....c:112:28: error: pointer cannot be cast to type 'jfloat' (aka 'float')
[ERROR]   jfloat result = (jfloat) NULL;
[ERROR]                            ^~~~
[ERROR] /usr/include/sys/_types/_null.h:29:15: note: expanded from macro 'NULL'
[ERROR] #define NULL  __DARWIN_NULL
[ERROR]               ^~~~~~~~~~~~~
[ERROR] /usr/include/sys/_types.h:52:23: note: expanded from macro '__DARWIN_NULL'
[ERROR] #define __DARWIN_NULL ((void *)0)
[ERROR]                       ^~~~~~~~~~~
[ERROR] 1 error generated.
我怎样才能解决这个问题


我正在为每个值编写方法。


我打算编写一个结合以下三种方法的函数。

像这样。

我想我可以使用
NULL
来处理任何不成功的情况,比如
methodID==NULL

 intptr_t iptr = (intptr_t) NULL;
 void *ptr = (void *) iptr;
 assert(ptr == NULL);
我想我应该使用
jobject
而不是原语,对吗?

您不能(也不应该)将指针指定给普通变量

我真的不知道为什么它允许一些其他正常的数据类型,正如您所提到的。编译器应该为从指针到其他非指针数据类型的所有赋值生成相同的警告


NULL
是stdio.h中定义的空指针,用于初始化指针类型变量。如果要初始化非指针变量,请使用一个简单的
0
而不是
NULL
NULL
应该用作指针的特殊值,如果您没有实际要指向的对象。这是(在其他语言中使用,通常被认为是更好的解决方案)的替代方法,并且仅适用于指针类型(因为对于其他类型,只选择一个值作为具有“特殊含义”的值更容易)

因此
NULL
与任何其他指针的处理方式相同。虽然指针转换为整数类型在某些特殊情况下仍有一定意义(尽管这很危险,因为根据您可能截断指针的类型),但将其转换为浮点数肯定没有任何意义(它们用于对内存地址没有意义的数值计算)

你到底想达到什么目的?如果只是将这些变量初始化为定义良好的初始值,请尝试
0.0f
0.0
而不是
NULL

 intptr_t iptr = (intptr_t) NULL;
 void *ptr = (void *) iptr;
 assert(ptr == NULL);
如何将NULL赋值给浮点/双精度变量

使用
intptr\u t/uintptr\u t
,这是可以保存
void*
信息的整数类型


这将保留使
void*
再次与
NULL
进行同等比较所需的信息

 intptr_t iptr = (intptr_t) NULL;
 void *ptr = (void *) iptr;
 assert(ptr == NULL);

这会将整数转换为双精度,但可能会丢失信息(例如精度)。如果代码试图转换回
intptr\u t
,然后
void*
,然后尝试与
NULL
进行同等比较,则可能会失败

 intptr_t iptr = (intptr_t) NULL;
 double fp = (double) iptr;

 intptr_t iptr2 = (intptr_t) fp;
 void *ptr = (void *) iptr2;

 // May not succeed
 assert(ptr == NULL);

你不能,而且没有一个“OK”是有意义的。但你想实现什么?正如昨天被问到的,你还没有说出你想要实现什么。
callbooleanmethodamms
的作用是什么?(1) 如果它是从C中使用的,则可以从调用的结果中单独返回它是否成功:(1.a)添加一个额外的参数,在其中返回状态,或者(1.b)通过参数返回状态作为结果和JNI结果,或者(1.C)在结构中同时返回两者。(2)如果它是返回一个“可选”数值到java(虽然它不是一个<代码>本地< /Cuff>方法),你可以(a)返回一个java <代码>布尔< <代码>(在JNI中的一个代码> Joojs<代码>),或者(b)在JNI中抛出一个异常。考虑C11 7.20.1.4整数类型,它能够保存对象指针。“以下类型指定了一个带符号整数类型,其属性是指向
void
的任何有效指针都可以转换为该类型,然后再转换回指向
void
的指针,结果将与原始指针相同:
intptr\t
 intptr_t iptr = (intptr_t) NULL;
 void *ptr = (void *) iptr;
 assert(ptr == NULL);
 intptr_t iptr = (intptr_t) NULL;
 double fp = (double) iptr;

 intptr_t iptr2 = (intptr_t) fp;
 void *ptr = (void *) iptr2;

 // May not succeed
 assert(ptr == NULL);