首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gsl_histogram_find给出分割错误(c++,gsl)

gsl_histogram_find给出分割错误(c++,gsl)
EN

Stack Overflow用户
提问于 2015-10-07 14:10:41
回答 1查看 221关注 0票数 1

我试图编写一个简单的程序代码,它通过GSL读取直方图,然后为x轴上的特定点找到相应的bin索引。代码如下所示:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <cmath>
#include <fstream>
#include <sstream>

#include <gsl/gsl_histogram.h>

int main() {

        gsl_histogram* h_transform;
        size_t h_Bins = 3;
        h_transform = gsl_histogram_alloc(h_Bins);
        double range[4] = { 1.0, 10.0, 100.0, 1000.0 };
        double bins[3] = {7.0, 0.0011, 9e-02};
        gsl_histogram_set_ranges(h_transform, range, 4);
        for(int i=0; i<h_Bins; i++) {
                h_transform->bin[i] = bins[i];
        }

        for (size_t i=0; i<h_Bins; i++) {
                std::cout << "range[" << i << "] = " << h_transform->range[i] << std::endl;
                std::cout << "bin[" << i << "] = " << h_transform->bin[i] << std::endl;
        }
                std::cout << "range[" << h_range_size << "] = " << h_transform->range[h_range_size] << std::endl;

        size_t* h_index;
        double x = 1.1;
        std::cout << "before find" << std::endl;
        gsl_histogram_find(h_transform, x, h_index);
        std::cout << "after h_find" << std::endl;
        std::cout << "h_index = " << *h_index << std::endl;
        std::cout << "get = " << gsl_histogram_get(h_transform, *h_index) << std::endl;

        return 0;
}

然后,当我用

代码语言:javascript
复制
g++ -o gslTest gslTest.cpp -lgsl -lgslcblas -lm

并使用./gslTest运行它,得到以下输出:

代码语言:javascript
复制
range[0] = 1
bin[0] = 7
range[1] = 10
bin[1] = 0.0011
range[2] = 100
bin[2] = 0.09
range[3] = 1000
before find
Segmentation fault (core dumped)

现在我不能把我的头绕在这上面。我几天前也犯了同样的错误,修复了它,现在又出现了,我不记得修复了.

希望你们中的一些人能比我更擅长解决这个问题!提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 14:19:02

一个突出的问题是:

代码语言:javascript
复制
size_t* h_index;
double x = 1.1;
std::cout << "before find" << std::endl;
gsl_histogram_find(h_transform, x, h_index);

假设gsl_histogram_find最后一个参数是一个指针,那么您将向该函数发送一个未初始化的指针。除了检查指针是否为NULL,或取消引用它,使用它,从而造成破坏外,gsl_histogram_find对该指针绝对无能为力。

你应该做的是:

代码语言:javascript
复制
size_t h_index;
double x = 1.1;
std::cout << "before find" << std::endl;
gsl_histogram_find(h_transform, x, &h_index);

当一个函数想要一个指针时,它几乎总是意味着该函数需要一个现有实体的地址。有关传递指向函数的指针以及它真正的含义,请参见this answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32994547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档