如何在使用可选参数的C++头中引用Fortran函数?我可以在标题中为每个可能的呼叫组合设置原型吗?或者这甚至可能吗?
例如,Fortran:
subroutine foo(a, b, c) bind(c)
real, intent(in), optional :: a, b, c
...
end subroutine foo
Run Code Online (Sandbox Code Playgroud) 我最近遇到了堆腐败的第一次战斗 (已解决).在我家的linux机器上,使用valgrind和电栅栏(使用gdb),罪魁祸首代码无错误地退出.然而,在我们实验室的Windows机器上,我始终从我引用的帖子中描述了VS中与堆损坏相关的错误消息.
valgrind和电围栏不会发现这样的问题,这是否令人惊讶(或至少不常见)?其他人提到了一个可能类似的错误,在这里回答了valgrind .这些工具无法检测到此问题的原因可能是什么?有没有理由怀疑错误实际上是堆腐败?
更新:正如在描述原始问题的帖子中所提到的,我发现问题是由于指向std :: vector中的元素指针,这变得很糟糕.用std :: list替换向量(添加新元素时指针不会变为无效)修复了问题.所以回到我关于为什么valgrind没有发现问题的问题,我问是否有关于如何避免将来出现类似情况的建议,即valgrind未检测到的内存问题,这是我的一个问题最喜欢的工具 显然,更好地了解STL如何工作将是一个好主意.也许我需要在编程等方面对断言更加自信.
我最近一直在尝试使用Electric Fence,我无法弄清楚如何将它与c ++代码一起使用.
这是一个例子:
// test.cpp
#include <cstdlib>
using namespace std;
int main()
{
int *a = new int(10);
delete a;
}
Run Code Online (Sandbox Code Playgroud)
我编译了它
g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread
Run Code Online (Sandbox Code Playgroud)
而且我在开始时看不到Electric Fence标题,并且在可执行文件中找不到EF符号(使用nm命令).
但是,如果我修改这样的程序:
// test.cpp
#include <cstdlib>
using namespace std;
int main()
{
char *p = (char*)malloc(20);
free(p);
int *a = new int(10);
delete a;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好 - EF出现了.我知道它解决了这个问题,我知道:).我只是想了解为什么它首先不起作用,因为new()应该打电话malloc(),delete()打电话free(),不是吗?
我参与其中的原因是一个使用boost库和其他几个的大项目.这个程序从不打电话malloc()或free()直接打电话.当我使用EF构建它时,我不会将EF链接到最终的可执行文件,但重建了所有试图将EF链接到它们的库.我无法在其中任何一个中找到EF符号.这是正确的方法吗?或者它是错误的,EF最终只能链接到可执行文件,libs应保持不变?但是我再次在可执行文件中找不到EF符号.
std::map<int,int> bar;
int foo(int key)
{
bar.erase(key);
return 1;
}
int main()
{
bar[0] = foo(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在使用电栅栏检查内存使用情况时,使用GCC 4.8编译的代码会出现故障.
LD_PRELOAD=libefence.so.0.0 ./a.out
Run Code Online (Sandbox Code Playgroud)
问题来自于编译器生成的代码开始在地图中分配新条目,然后执行foo()以获取要放入的值bar[0].在运行时foo(),条目被破坏,代码最终通过写入未分配的内存结束.
操作的排序方式取决于编译器实现,还是由C++当前标准指定?
我想在数据接收书中使用Brents方法来最小化函数.最小化程序的签名基本上如下所示:
float brent(float (*f)(float), float *xmin, "other parameters not relevant to question")
Run Code Online (Sandbox Code Playgroud)
您可以猜测brent返回最小值f并将其参数存储在其中xmin.但是,我想要最小化的函数的确切形式取决于其他参数.说
float minimize_me(float x, float a, float b)
Run Code Online (Sandbox Code Playgroud)
一旦我决定的价值观a和b我想它对于减少x.
我可以简单地向所有被调用的函数添加额外的参数,一直到下来brent,从而将其签名更改为
float brent(float (*f)(float,float,float),float a ,float b , float *xmin, ...)
Run Code Online (Sandbox Code Playgroud)
因此每次都(*f)(x,a,b)在里面打电话brent.然而,这对我来说似乎并不优雅,因为我现在不仅要将指针传递minimize_me给整个函数链,而且还要传递两个额外的参数.
我怀疑可能有一个更优雅的解决方案,比如创建一个指向函数版本的指针a和b固定值.
即使这是一个非常模糊的解决方案,请不要让它远离我,因为我觉得它可以提高我对语言的整体理解.
给定 bash 中的数学运算,例如
a=$(( ${b} + 1 ))
如何处理b可以为正数或负数并带有前导零的情况?如果我尝试
a=$(( 10#${b} + 1 ))
对于b=009,这是成功的。但如果我尝试同样的操作b=-001,则会返回错误:
10#: invalid integer constant (error token is "10#")
那么有没有一种方法可以在一行中处理此类情况呢?或者有没有办法检查是否b小于0?对于后一个选项,我尝试过
[[ $b < 0 ]] && a=$(( ${b} + 1 )) || a=$(( 10#${b} + 1 ))
但这会在条件 ifb大于或等于中遇到类似的错误008。
PS:我需要前缀的原因10#是以前导零开头的数字否则会被解释为八进制。
我一直在将IDL代码翻译成Python,并注意到最终产品的差异.这些差异也不容忽视(例如,通过IDL我获得19.03而Python获得19.16).我确认这两个脚本产生相同的值(它们通常在第四,第五或第六个十进制中不同),直到我开始执行多个数组操作.我怀疑精度可能是原因(Python和IDL数组都是type=FLOAT).我做了一个简单的实验,我也看到了很大的差异.
a = 0.01
b = 0.0
for r = 1,1000 do begin
b += a
endfor
c = a * 1000
print,b
>>> 10.0001
print,c
>>> 10.0000
Run Code Online (Sandbox Code Playgroud)
a = 0.01
b = 0.00
for r in range(1000):
b += a
c = a * 1000
print(b)
>>> 9.999999999999831
print(c)
>>> 10.0
Run Code Online (Sandbox Code Playgroud)
当然,在这个例子中,差异仍然很小,但是Python显然比IDL更接近真相.我期望结果是相同的,因为两种语言都使用FLOAT精度.底线是错误以不同的方式在两种语言中传播,从而产生不同的结果.我的问题是:
两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?
有没有办法调和精度差异?
我对IDL没有多少经验; 我错过了一些明显的东西吗
当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).
>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)
>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud)