如何在julia中调用c宏
我知道你可以用ccall调用函数,用cglobal获取指向全局符号的指针。但是如何访问宏呢 例如,我不想复制这段代码如何在julia中调用c宏,julia,Julia,我知道你可以用ccall调用函数,用cglobal获取指向全局符号的指针。但是如何访问宏呢 例如,我不想复制这段代码 clock_t start = clock(); clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; 如何在结束时执行CLOCKS\u PER\u SEC宏?CLOCKS\u PER\u SEC是标准头文件time.h中定义的常量 最好使用Julia中可用的计时工具,并将程序
clock_t start = clock();
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
如何在结束时执行CLOCKS\u PER\u SEC宏?
CLOCKS\u PER\u 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;
}
假设系统将在特定的计算机上运行,或者不使用外部C依赖项长时间维护,则只获取一次数字并将其作为常量插入Julia程序可能更简单
另外,Julia代码与0.7版本相关,在早期版本中,请使用
readstring(…)
而不是read(…,String)
另一个答案,Julia可能是(尝试一下):
这个答案假设
每秒时钟数
是10的幂,这似乎是普遍的情况。注意,for
内部循环用于浪费处理时间,而不是墙壁时间,这可能会被睡眠
浪费。如果要从Julia创建一个完整的C库进行访问,则可以从库中导出时钟每秒
的值(在导出函数等时)根据时钟,每秒被假定为一个宏,而不是一个常量。@Nozdrum它是一个宏常量(即#定义每秒时钟((时钟)1000000)
在我的系统上。此外,头文件中的一条注释说:在所有符合XSI的系统上,时钟每秒的值必须是100万。因此,基本上,它是100万。如果您设法找到一个具有不同时钟每秒的系统,我会感到惊讶。在任何情况下,外部程序方法仍然有效。具体是什么您试图解决的问题?在64位windows 7上,msvc#每秒定义时钟((clock_t)1000)
和clock_t只是一个typedef很长一段时间。我同意您的解决方案会起作用,但它不是一个好的解决方案。与Julia方式不同,您坚持使用C接口,这不是一个好的选择。Julia方式是(复制粘贴以下内容):tic();println(“做点什么”);sleep(1);println(“做点什么”);seconds=toq()
你最终是如何解决这个问题的?@DanGetz我放弃了。你真的尝试过我的建议吗?例如,第二个答案完全在Julia内部工作,没有外部复杂因素?你可以一直在设置中插入值manually@DanGetz我的问题是如何调用c宏,给出的c代码是一个示例和y我们的答案是对这个例子的回答,而不是如何从julia那里调用c宏。注意:没有为每个操作系统手工编译每个宏。
julia> clocks_per_sec = parse(Int,read(`./clocks_per_sec`,String))
1000000
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