2017-08-01 45 views
0

我知道你可以用ccall調用函數,並通過cglobal獲取指向全局符號的指針。但是,你如何獲得宏?如何在julia中調用c宏

比如我wan't複製此代碼

clock_t start = clock(); 
clock_t end = clock(); 
float seconds = (float)(end - start)/CLOCKS_PER_SEC; 

我怎樣才能在最後執行CLOCKS_PER_SEC宏?

+0

您是如何最終解決這個問題的? –

+0

@DanGetz我放棄了。 – Nozdrum

+0

你真的嘗試過我的建議嗎?例如,第二個答案完全在朱莉婭內部工作,沒有外部併發症?你可以一直在你的設置中手動插入值 –

回答

1

CLOCKS_PER_SEC是在標準頭文件time.h中定義的常量。

使用Julia提供的計時設備並保持一種語言的程序(如偉大的計劃)會好得多。但是,如果你堅持,你可以創建下面的C程序:

#include <stdio.h> 
#include <time.h> 

int main(int argc, char** argv) { 
    printf("%ld\n",CLOCKS_PER_SEC); 
    return 0; 
} 

使用類似gcc clocks_per_sec.c -o clocks_per_sec編譯。 ,然後使用由朱莉婭運行:

julia> clocks_per_sec = parse(Int,read(`./clocks_per_sec`,String)) 
1000000 

這樣可能比較簡單,只是讓數一次,插上它作爲一個常數在朱莉婭方案假設系統將在特定的計算機上運行或將不保很長一段時間與外部C依賴。

P.S. Julia代碼與0.7版本相關,在早期版本中,使用readstring(...))代替read(...,String)

+0

如果要創建一個從Julia訪問的完整C庫,可以從庫中導出CLOCKS_PER_SEC的值(如導出函數等) –

+0

根據http://www.cplusplus.com/reference/ ctime/CLOCKS_PER_SEC/CLOCKS_PER_SEC被假定爲宏而不是常量。 – Nozdrum

+0

@Nozdrum它是一個宏常量(即'#define CLOCKS_PER_SEC((clock_t)1000000)'在我的系統上。此外,頭文件中的註釋說:* CLOCKS_PER_SEC的值在所有XSI-如果你設法找到一個不同的CLOCKS_PER_SEC系統,我會感到驚訝,在任何情況下,外部程序方法**仍然可以工作**。究竟是什麼問題試圖解決? –

0

另一個答案,這裏面停留朱莉婭可能是(嘗試一下):

for i=1:10 
    b = 10^i 
    tic() 
    s = 0 
    start = ccall(:clock,Clonglong,()) 
    for i=1:b 
     s+=i 
    end 
    t = toq() 
    stop = ccall(:clock,Clonglong,()) 
    if t>1.0 
     println("CLOCK_PER_SEC most probably is ",10^(round(Int,log10((stop-start)/t)))) 
     break 
    end 
end 

這個答案假定CLOCKS_PER_SEC是10的倍數,這似乎是普遍的情況。注意for裏面的迴路用於浪費處理時間而不是掛壁時間這可能簡單地浪費sleep