- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试了具有可变数量整数参数的函数,它按预期工作。但是当我尝试可变数量的“double”类型的参数时,它给出了奇怪的输出:
$ g++ -fpermissive -std=c++11 te2d.cc
te2d.cc: In function ‘void maxof(double, long int, ...)’:
te2d.cc:19:16: warning: return-statement with a value, in function returning 'void' [-fpermissive]
$ ./a.out
dum=100.200000
debug 1 0.000000
debug 2 0.000000
debug 3 -5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000
debug 4 0.000000
这是简短的代码:
#include <stdio.h>
#include <stdarg.h>
typedef unsigned char uchar;
typedef unsigned short uint16;
using namespace std;
typedef unsigned char uchar;
void maxof(double dum, long n_args, ...){
printf("dum=%f\n", dum);
register int i;
int max = 0;
va_list ap;
va_start(ap, n_args);
for(i = 1; i <= n_args; i++) {
printf("debug %d %f\n", i, va_arg(ap, double));
}
va_end(ap);
return max;
}
int main(int argc, char *argv[]) {
maxof(100.2, 4, 10,14,13,11);
return 0;
}
有什么想法吗?谢谢。
最佳答案
C 可变参数函数不会神奇地处理来自 int
的转换至 double
*。您需要指定进入函数的类型,而不是您希望在转换后结束的类型。将其视为告诉编译器如何与堆栈交互。如果你告诉它栈顶有一个 double
和 double
大于int
,你现在只是告诉它从堆栈中取出额外的字节,这很糟糕。即使它们的大小相同,它们的二进制表示也不相同。
您确实必须小心使用 C 可变参数函数。更好的解决方案(如果可用)是使用可变参数模板,它是完全类型安全的并且会触发编译时 错误,而不是未定义的行为。在这种情况下,由于您希望所有参数都是同一类型,因此可以使用 std::initializer_list
:
#include <initializer_list> //be sure not to forget this when using std::initializer_list
double maxof(std::initializer_list<double> nums) {
double max = 0; //hope you don't have negative numbers
for (const auto &num : nums) {
if (num > max) {max = num;}
}
return max;
}
...
maxof({10,14,13,11})
请注意,std::max
过载了就是这样做的,所以不需要自己写。
如果您坚持使用 C++11 之前的版本,您可能会创建许多重载以获得相同的效果,但您最好创建一个基于容器或迭代器的函数,例如 std::max_element
.
*促销应用于参数,因此它并不总是输入的确切类型。例如,传递一个 char
将需要提取 int
的函数.这些促销事件是明确的,主要是 <small integral type>
-> int
.
关于c++ - 具有 double 类型的可变数字参数的函数的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663728/
下面的代码有效,我觉得double(double)和double(*)(double)没有区别,square和 &square,我说得对吗? #include double square(doubl
我知道我的作业很草率,这是我在这门课上的第 4 次作业。任何帮助将不胜感激,谢谢。 double getPrincipal(0); double getRate(0); double getYe
我遇到了那个错误,当我使用类时,我在使用函数指针时遇到了这个错误。我的函数'ope'函数我该如何解决 evaluator::function(){ double (*ope) (dou
问题://故事从哪里开始 Graphics 类型中的方法 drawLine(int, int, int, int) 不适用于参数 (double, double, double, double) g.
我有一张 map> m1 形式的 map .我可以将其复制到 map m2 形式的 map 吗?这样键是相同的,并且 m2 中的值是 get(m1->second) 不使用循环?谢谢! 最佳答案 这样
有没有办法获取vector> 的“.first”和“.second”的连续内存? ?我的意思是: void func(int N, double* x, double* y) { for (i
我正在尝试将自定义 lambda 传递给需要函数指针的函数(更准确地说是 zero 中的 Brent library 函数)。 我的想法是,我将使用参数创建一次 lambda,然后用多个值对其求值 x
这是一个很简单的问题,让我很困惑。 我收到一个源文件的以下错误,但另一个没有: 4 src/Source2.cpp:1466: error: no matching function for cal
struct CalculatorBrain { private var accumulator: Double? func changeSign(operand: Double) -
在我正在进行的项目中,我尝试使用 curlpp库来发出一个简单的 html GET 请求。当我将 cpp 文件传递给 g++ 时,出现以下错误: /usr/local/include/curlpp
不使用double就能获得quadruple精度超过16位的数字吗?如果可能的话,这取决于编译器还是其他?因为我知道有人说他使用double精度,并且具有22位精度。 最佳答案 数据类型double
我正在寻找有关特斯拉 GPU 中硬件如何实现 double 的信息。我读到,两个流处理器正在处理单个 double 值,但我没有找到 nvidia 的任何官方论文。 提前致谢。聚苯硫醚为什么大多数 G
这个问题在这里已经有了答案: Passing capturing lambda as function pointer (10 个答案) 关闭 2 年前。 我有这个错误 error: cannot
情况:我有一个元组列表,其中添加了一个元组: List> list = new List>(); list .Add(new Tuple(2.2, 6.6)); 一切似乎都还好。但是......在 D
我有一个 JList,里面有一堆名字,还有一个包含这些名字值的数组 final Double[] filmcost = { 5.00, 5.50, 7.00, 6.00, 5.00 }; 我想做的是,
我试图找出牛顿法来求方程的根。这个错误出来了,我无法处理。 double fn(double n){ return sin(n)+log(n)-1; } double f1n(double n
我有一个 junit 测试断言两个 Double 对象,具有以下内容: Assert.assertEquals(Double expected, Double result); 这很好,然后我决定将其
我正在尝试引入部分数据文件来填充数组,用户尝试了三次输入正确的数据文件名。我一再遇到这些错误。我知道像 arr 这样的数组只是一个指向内存块的指针。 #include #include #incl
我正在尝试完成复习题(为即将到来的编程决赛),但是,我无法解决这个问题,因为我不断收到错误(标题)。正如预期的那样,我将发布问题和我尝试的解决方案。 问题: 给定以下函数定义:void swap(do
任何人都知道如何实现这一目标。我已经尝试了通常的公式,但我只得到正数 Double.NEGATIVE_INFINITY) return d; } } 这将以相同的概率
我是一名优秀的程序员,十分优秀!