将 C++ 代码编译为 returns 双倍的 .EXE
Compiling C++ code to .EXE which returns double
我正在使用用于黑盒成本函数 (BBCF) 的 MATLAB 优化平台。
为了让用户自由发挥,所使用的BBCF可以是任何输入BBF输入参数的可执行文件,并且必须输出(return)BBCF的成本值,以便MATLAB BBCF优化器找到最佳(最低成本)输入参数。
考虑到,一方面我的 BBCF 是用 C++ 实现的,另一方面成本值是双精度值(实数),我需要将我的代码编译成一个 EXE 文件,输出 (returns) double.
但是,据我所知,当我将 C++ 代码编译为 EXE 时,它 "mainly" 编译了 main() 函数并且它的输出是 main() 函数的输出(即 0 如果运行成功!)。
一个想法可能是使用一个 return 加倍的主函数,然后将这样的 main() 编译为 EXE,但不幸的是,这在 C++ 中是不可能的(如 [=11= 中所解释的) ] 是 C++ 的一个错误,这两个都不是这个问题的事)。
任何人都可以提供一个 C++ 代码的 EXE 编译形式输出 (returns) 个双精度值的想法吗?
在英语中,'shall' 比 'must' 更强烈。
进行这样的更改需要更改操作系统和 shell。这种变化不太可能发生。
传递双精度数 return 的最简单方法是将其写入标准输出。或者,有几种方法可用于进程间通信。
这不是 'a bug in C++'(顺便说一下,错误可能出现在某些 C++ 编译器中,而不是语言本身)- 标准中描述了 main() 应该 return整数:
http://en.cppreference.com/w/cpp/language/main_function
关于如何从可执行文件中 return 非整数,有几种方法可以做到这一点。我想到了两个最简单(就如何实施而言)的解决方案:
- 将其保存到文件中。然后在 Matlab 中监视该文件的更改(例如比较时间戳)或在每次执行 EXE 文件后读取,具体取决于您将如何使用它。不是很有效的解决方案,但可以完成工作,并且性能损失可能与您的其他计算相比可以忽略不计。
- 如果您不介意您的成本值失去一些数值精度,您可以将双精度值乘以某个数字(这个数字越大,您将保留的小数位越多)。然后对其进行舍入,将其转换为 int,从 main() 中对其进行 returned,在 matlab 中将其转换回 double 并除以相同的数字。用作乘数的数字应该是 2 的幂,这样就不会引入额外的舍入误差。如果您的成本值采用限制在 [0, 1] 范围内的值,或者如果您可以将其归一化为这些值并且您知道小于某个阈值的变化并不重要,则此方法可能特别有用。
我正在使用用于黑盒成本函数 (BBCF) 的 MATLAB 优化平台。
为了让用户自由发挥,所使用的BBCF可以是任何输入BBF输入参数的可执行文件,并且必须输出(return)BBCF的成本值,以便MATLAB BBCF优化器找到最佳(最低成本)输入参数。
考虑到,一方面我的 BBCF 是用 C++ 实现的,另一方面成本值是双精度值(实数),我需要将我的代码编译成一个 EXE 文件,输出 (returns) double.
但是,据我所知,当我将 C++ 代码编译为 EXE 时,它 "mainly" 编译了 main() 函数并且它的输出是 main() 函数的输出(即 0 如果运行成功!)。
一个想法可能是使用一个 return 加倍的主函数,然后将这样的 main() 编译为 EXE,但不幸的是,这在 C++ 中是不可能的(如 [=11= 中所解释的) ] 是 C++ 的一个错误,这两个都不是这个问题的事)。
任何人都可以提供一个 C++ 代码的 EXE 编译形式输出 (returns) 个双精度值的想法吗?
在英语中,'shall' 比 'must' 更强烈。
进行这样的更改需要更改操作系统和 shell。这种变化不太可能发生。
传递双精度数 return 的最简单方法是将其写入标准输出。或者,有几种方法可用于进程间通信。
这不是 'a bug in C++'(顺便说一下,错误可能出现在某些 C++ 编译器中,而不是语言本身)- 标准中描述了 main() 应该 return整数:
http://en.cppreference.com/w/cpp/language/main_function
关于如何从可执行文件中 return 非整数,有几种方法可以做到这一点。我想到了两个最简单(就如何实施而言)的解决方案:
- 将其保存到文件中。然后在 Matlab 中监视该文件的更改(例如比较时间戳)或在每次执行 EXE 文件后读取,具体取决于您将如何使用它。不是很有效的解决方案,但可以完成工作,并且性能损失可能与您的其他计算相比可以忽略不计。
- 如果您不介意您的成本值失去一些数值精度,您可以将双精度值乘以某个数字(这个数字越大,您将保留的小数位越多)。然后对其进行舍入,将其转换为 int,从 main() 中对其进行 returned,在 matlab 中将其转换回 double 并除以相同的数字。用作乘数的数字应该是 2 的幂,这样就不会引入额外的舍入误差。如果您的成本值采用限制在 [0, 1] 范围内的值,或者如果您可以将其归一化为这些值并且您知道小于某个阈值的变化并不重要,则此方法可能特别有用。