小编Dav*_*idH的帖子

使用C++中的可选参数调用Fortran子例程

如何在使用可选参数的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)

c++ fortran optional-parameters fortran-iso-c-binding

9
推荐指数
2
解决办法
674
查看次数

Valgrind或Electric Fence未检测到堆腐败.我应该怀疑吗?(C++)

我最近遇到了堆腐败的第一次战斗 (已解决).在我家的linux机器上,使用valgrind和电栅栏(使用gdb),罪魁祸首代码无错误地退出.然而,在我们实验室的Windows机器上,我始终从我引用的帖子中描述了VS中与堆损坏相关的错误消息.

valgrind和电围栏不会发现这样的问题,这是否令人惊讶(或至少不常见)?其他人提到了一个可能类似的错误,在这里回答了valgrind .这些工具无法检测到此问题的原因可能是什么?有没有理由怀疑错误实际上是堆腐败?

更新:正如在描述原始问题的帖子中所提到的,我发现问题是由于指向std :: vector中的元素指针,这变得很糟糕.用std :: list替换向量(添加新元素时指针不会变为无效)修复了问题.所以回到我关于为什么valgrind没有发现问题的问题,我问是否有关于如何避免将来出现类似情况的建议,即valgrind未检测到的内存问题,这是我的一个问题最喜欢的工具 显然,更好地了解STL如何工作将是一个好主意.也许我需要在编程等方面对断言更加自信.

valgrind memory-corruption visual-studio electric-fence

6
推荐指数
1
解决办法
2081
查看次数

在c ++程序中使用电栅栏

我最近一直在尝试使用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符号.

c++ linux memory-management memory-fences electric-fence

5
推荐指数
1
解决办法
8897
查看次数

c ++ STL map :: operator []对要删除的条目完成

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++当前标准指定?

c++ dictionary stl segmentation-fault electric-fence

4
推荐指数
1
解决办法
136
查看次数

使用某些但不是所有参数修复的函数的指针

我想在数据接收书中使用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)

一旦我决定的价值观ab我想它对于减少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给整个函数链,而且还要传递两个额外的参数.

我怀疑可能有一个更优雅的解决方案,比如创建一个指向函数版本的指针ab固定值.

即使这是一个非常模糊的解决方案,请不要让它远离我,因为我觉得它可以提高我对语言的整体理解.

c function-pointers

4
推荐指数
2
解决办法
120
查看次数

Bash:对带前导零的负整数执行数学运算

给定 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#是以前导零开头的数字否则会被解释为八进制。

bash

3
推荐指数
1
解决办法
95
查看次数

IDL与Python Float

我一直在将IDL代码翻译成Python,并注意到最终产品的差异.这些差异也不容忽视(例如,通过IDL我获得19.03而Python获得19.16).我确认这两个脚本产生相同的值(它们通常在第四,第五或第六个十进制中不同),直到我开始执行多个数组操作.我怀疑精度可能是原因(Python和IDL数组都是type=FLOAT).我做了一个简单的实验,我也看到了很大的差异.

IDL

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精度.底线是错误以不同的方式在两种语言中传播,从而产生不同的结果.我的问题是:

  1. 两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?

  2. 有没有办法调和精度差异?

  3. 我对IDL没有多少经验; 我错过了一些明显的东西吗

PS:

当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).

IDL

>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)

蟒蛇

>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud)

python precision idl-programming-language

0
推荐指数
1
解决办法
388
查看次数