2017-06-13 43 views
0

我正在使用黑箱成本函數(BBCF)的MATLAB優化平臺。將C++代碼編譯爲.EXE,返回雙重

爲了使用戶自由使用,所使用的BBCF可以是輸入BBF的輸入參數並且必須輸出(返回)BBCF的成本值的任何可執行文件,以便MATLAB BBCF優化器找到最好的(至少成本)輸入參數。考慮到一方面,我的BBCF是用C++實現的,另一方面成本價值是雙倍的(實數),我需要將我的代碼編譯成EXE文件,輸出(返回)雙。但是,據我所知,當我將C++代碼編譯爲EXE時,它「主要」編譯main()函數,它的輸出是main()函數的輸出(即,如果運行成功,則爲0! )。

一個想法可以使用返回雙主函數,然後,編譯例如main()中EXE但是,不幸的是,這是不可能在C++中(如在this link說明或權利的this question的第三答案成爲C++的一個bug,這兩者都不是這個問題的關鍵)。

任何人都可以提供一個想法,EXE編譯形式的C++代碼,輸出(返回)一個雙值?

+1

我希望BBCF處理代碼從可執行文件的輸出文件描述符中得到答案。使用類似'printf'或'std :: cout'的形式從C++應用程序寫入。使用'main'的返回值來表示錯誤條件等。 – Rook

+0

@JLev我的問題不是如何在C++中返回非int類型以成爲該問題的重複(我已經看到它)。通過提到這個問題,我解釋說在main()中返回double是不可行的。 – hossayni

+0

你不能建立一個直接返回MATLAB類型的'mex'嗎? –

回答

1

這不是「一個在C++中的錯誤」(順便說一下,這個錯誤可能會在一些C++編譯器,而不是語言本身) - 它在該標準的描述了主()應該返回一個整數:

http://en.cppreference.com/w/cpp/language/main_function

關於如何從可執行文件返回非int,有幾種方法可以做到這一點。在我看來,兩個最簡單的方法(就如何實現它們而言):

  1. 將其保存到文件。然後,在Matlab中監視該文件以查看更改(例如,比較時間戳)或在每次執行EXE文件後讀取,具體取決於您將如何使用它。不是非常有效的解決方案,但是您的其他計算可以忽略不計的工作,並且性能損失可以忽略不計。
  2. 如果您的成本價值損失了一些數值準確性,那麼您可以將雙倍值乘以某個數字(此數字越大,您保留的小數位數越多)。然後圍繞它,將它轉換爲int,讓它從main()返回,在matlab中將其重新轉換爲double,然後除以相同的數字。用作乘數的數字應該是2的冪,這樣它不會引入額外的舍入誤差。如果您的成本值將值限制在[0,1]範圍內,或者您可以將其歸一化爲這些值,並且您知道小於某個閾值的變化並不重要,則此方法可能特別有用。
0

在英語中,'shall'比'must'更爲重要。

進行這樣的更改需要更改操作系統和外殼。這種變化不太可能發生。

傳遞雙返回的最簡單方法是將其寫入標準輸出。或者有幾種方法可用於進程間通信。