小编Gra*_*Guy的帖子

从C中的函数返回`struct`

今天我教了几个朋友如何使用C structs.其中一个问你是否可以struct从一个函数返回一个函数,我回答说:"不!你会返回指向动态malloc编辑struct的指针."

来自主要使用C++的人,我期望无法struct按值返回s.在C++中,您可以operator =为对象重载并完全理解为具有按值返回对象的函数.但是,在C中,你没有那个选项,所以它让我思考编译器实际上在做什么.考虑以下:

struct MyObj{
    double x, y;
};

struct MyObj foo(){
    struct MyObj a;

    a.x = 10;
    a.y = 10;

    return a;
}        

int main () {

    struct MyObj a;

    a = foo();    // This DOES work
    struct b = a; // This does not work

    return 0;
}    
Run Code Online (Sandbox Code Playgroud)

我理解为什么struct b = a;不能工作 - 你不能operator =为你的数据类型重载.它是如何a = foo();编译罚款?这是否意味着什么struct b = …

c

153
推荐指数
6
解决办法
25万
查看次数

狡猾的旗帜做什么?

我只是想知道-fpermissiveg ++编译器中的标志是什么?我正进入(状态:

错误:获取临时[-fpermissive]的地址

我可以通过给-fpermissive编译器提供标志来解决 这个问题.

编辑:我刚刚发现导致临时地址错误的部分!我现在要修理那个部分.

c++ gcc compiler-options

115
推荐指数
4
解决办法
16万
查看次数

函数指针和函数的地址

所以我想在制作函数指针时,你不需要operator &获取初始函数的地址:

#include <stdio.h>

double foo (double x){
    return x*x;
}

int main () {

    double (*fun1)(double) = &foo;
    double (*fun2)(double) =  foo;

    printf("%f\n",fun1(10));
    printf("%f\n",fun2(10));

    printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
    printf("fun2 = %p \t  foo = %p\n",fun2,  foo);       

    int a[10];

    printf("  a = %p \n &a = %p  \n",a,&a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

>./a.out 
100.000000
100.000000
fun1 = 0x4004f4      &foo = 0x4004f4
fun2 = 0x4004f4       foo = 0x4004f4
  a = 0x7fff26804470 
 &a = 0x7fff26804470 
Run Code Online (Sandbox Code Playgroud)

然后我意识到这对于数组也是如此,这意味着如果你有 …

c pointers function-pointers function

47
推荐指数
2
解决办法
6万
查看次数

捕获异常时可以使用gdb进行回溯吗?

我刚刚开始使用c ++异常并想要正确使用它.我想到的是在捕获异常时生成某种回溯信息.最初我有类似于C++异常的Call-stack的想法,但最终发现它并不是很好.

我还阅读了如何在我的gcc C++应用程序崩溃时生成堆栈跟踪但不想为当前项目添加更多复杂性.因为,我只需要在调试模式下进行回溯,我希望我可以将gdb用于此目的.

我的策略是在catch块中插入断点,然后通过调用堆栈来准确找出为什么首先抛出异常(或者是什么导致它)?不幸的是,我似乎无法做到这一点,因为当gdb到达断点时,它会清除调用堆栈,我只能看到main(这就是我捕获的地方).这应该发生还是我在这里做错了什么?

编辑: 我只想总结一下其他人的方法:

第一种方法(由paulsm4提供).设置一个捕获点,catch throw用于捕捉或catch catch抓住捕获!然后打电话backtrace

第二种方法(由aschepler设置)__cxa_throw然后设置断点backtrace

第三种方法(在Qt Creator中 - 如果你碰巧使用的话)你可以在throw或catch上轻松设置断点!

Edit_2:使用Qt Creator调试器,似乎设置断点__cxa_begin_catch也相当于catch catch:)

c++ gdb exception-handling exception

19
推荐指数
2
解决办法
9252
查看次数

对于具有线性存储的容器,是否可以使用原始指针代替具有STL算法的迭代器?

我有一个自定义矢量容器,内部存储项目线性数组.昨晚,我试图为我的类实现自定义迭代器,以便能够将它们与STL算法一起使用.我在这里看到了一些成功:

使用自定义迭代器的实例

在这样做时,我发现我只能将原始指针传递给STL算法,它们似乎工作得很好.这是没有任何迭代器的示例:

#include <cstddef>
#include <iostream>
#include <iterator>
#include <algorithm>

template<typename T>
class my_array{
    T* data_;
    std::size_t size_;

public:

    my_array()
        : data_(NULL), size_(0)
    {}
    my_array(std::size_t size)
        : data_(new T[size]), size_(size)
    {}
    my_array(const my_array<T>& other){
        size_ = other.size_;
        data_ = new T[size_];
        for (std::size_t i = 0; i<size_; i++)
            data_[i] = other.data_[i];
    }
    my_array(const T* first, const T* last){
        size_ = last - first;
        data_ = new T[size_];

        for (std::size_t i = 0; i<size_; i++)
            data_[i] = first[i];
    }

    ~my_array(){ …
Run Code Online (Sandbox Code Playgroud)

c++ pointers iterator stl

16
推荐指数
2
解决办法
1万
查看次数

用于自定义容器的STL兼容迭代器

我有一个自定义容器,我已经使用多年没有问题.最近我发现如果我为容器定义迭代器,我可以有效地使用中定义的所有算法<algorithm>.不仅如此,似乎推力库 (基本上认为Nvidia GPU的STL的CUDA版本)大量使用迭代器,我希望通过使用它们我也能够使用该库.

无论如何,因为这是我第一次尝试编写自己的迭代器,我想我发布了我在这里要求进一步帮助的内容,并确保我所做的是对的.所以,我写了一个支持一个小数组类iteratorconst_iterator类.我用一堆不同的STL算法运行我的课程,所有似乎工作正常,但这并不一定意味着我已经把一切都搞定了!特别是,我的迭代器中是否有任何操作符?我是否定义了额外的不必要的?此外,由于大多数iteratorconst_iterator看起来相似,有没有办法防止重复?

我愿意接受建议和改进:)

实例:http://ideone.com/7YdiQY

#include <cstddef>
#include <iostream>
#include <iterator>
#include <algorithm>

template<typename T>
class my_array{
    T* data_;
    std::size_t size_;

public:

    // ---------------------------------
    // Forward declaration
    // ---------------------------------
    class const_iterator;

    // ---------------------------------
    // iterator class
    // ---------------------------------
    class iterator: public std::iterator<std::random_access_iterator_tag, T>
    {
    public:
        iterator(): p_(NULL) {}
        iterator(T* p): p_(p) {}
        iterator(const iterator& other): p_(other.p_) {}
        const iterator& operator=(const iterator& other) {p_ = other.p_; …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl

13
推荐指数
1
解决办法
6627
查看次数

C++ Boost.serialization与简单加载/保存

我是计算科学家,使用大量的模拟数据,而且我经常发现自己在磁盘中保存/加载数据.对于简单的任务,比如矢量,这通常就像将一堆数字转储到文件中一样简单,就是这样.

对于更复杂的东西,生命对象等,我有保存/加载成员函数.现在,我不是一个计算机科学家,因此我经常在这里看到术语,我只是不明白(但我喜欢).我最近遇到的其中一个是序列化Boost.Serialization库的主题.

据我所知,序列化只是将对象转换为可以从dist保存/加载或通过网络传输的事物的过程.考虑到最多我需要将对象保存/加载到磁盘中,是否有任何理由我应该从简单的加载/保存功能切换到Boost.Serialization?什么会Boost.Serialization给予我的比我已经在做其他的?

c++ serialization boost

8
推荐指数
1
解决办法
915
查看次数

clang ++/g ++/gfortran之间的简单测试用例

我在scicomp遇到了这个涉及计算总和的问题.在那里,你可以看到一个c ++和类似的fortran实现.有趣的是,我看到fortran版本的速度提高了约32%.

我想,我不确定他们的结果,并试图重建这种情况.这是我跑的(非常轻微)不同的代码:

C++

#include <iostream>
#include <complex>
#include <cmath>
#include <iomanip>

int main ()
{
    const double alpha = 1;
    std::cout.precision(16);

    std::complex<double> sum = 0;
    const std::complex<double> a = std::complex<double>(1,1)/std::sqrt(2.);
    for (unsigned int k=1; k<10000000; ++k)
    {
        sum += std::pow(a, k)*std::pow(k, -alpha);

        if (k % 1000000 == 0)
            std::cout << k << ' ' << sum << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

FORTRAN

implicit none
integer, parameter :: dp = kind(0.d0) …
Run Code Online (Sandbox Code Playgroud)

c++ gcc fortran llvm clang

8
推荐指数
1
解决办法
1249
查看次数

在c ++中用花括号括起来的分号

我最近开始使用vtk包,我看到这个奇怪的符号,它们包括;在关闭花括号后}.这是一个例子vtkUnstructuredGrid.h

// Description:
// Standard vtkDataSet API methods. See vtkDataSet for more information.
int GetDataObjectType() {return VTK_UNSTRUCTURED_GRID;};
Run Code Online (Sandbox Code Playgroud)

它不是必需的,QtCreator也可以extra ;在解析代码时正确地检测到这一点.我很好奇这可能是什么原因?也许可读性?

c++ vtk

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

C中的int foo(int argc,...)vs int foo()vs int foo(void)

所以今天我认为(int foo()事实上第一次)实际上不同于int foo(void)第一个允许任意数量的输入而第二个允许.

是否int foo()只是忽略任何给定的输入?如果是这样,那么允许这种形式的功能有什么意义呢?如果没有,你怎么能访问它们,这与变量参数列表(例如类似的东西int foo (int argc, ...))有何不同?

c arguments argument-passing

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