今天我教了几个朋友如何使用C struct
s.其中一个问你是否可以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 = …
我只是想知道-fpermissive
g ++编译器中的标志是什么?我正进入(状态:
错误:获取临时[-fpermissive]的地址
我可以通过给-fpermissive
编译器提供标志来解决 这个问题.
编辑:我刚刚发现导致临时地址错误的部分!我现在要修理那个部分.
所以我想在制作函数指针时,你不需要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 ++异常并想要正确使用它.我想到的是在捕获异常时生成某种回溯信息.最初我有类似于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
:)
我有一个自定义矢量容器,内部存储项目线性数组.昨晚,我试图为我的类实现自定义迭代器,以便能够将它们与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) 我有一个自定义容器,我已经使用多年没有问题.最近我发现如果我为容器定义迭代器,我可以有效地使用中定义的所有算法<algorithm>
.不仅如此,似乎推力库 (基本上认为Nvidia GPU的STL的CUDA版本)大量使用迭代器,我希望通过使用它们我也能够使用该库.
无论如何,因为这是我第一次尝试编写自己的迭代器,我想我发布了我在这里要求进一步帮助的内容,并确保我所做的是对的.所以,我写了一个支持一个小数组类iterator
和const_iterator
类.我用一堆不同的STL算法运行我的课程,所有似乎工作正常,但这并不一定意味着我已经把一切都搞定了!特别是,我的迭代器中是否有任何操作符?我是否定义了额外的不必要的?此外,由于大多数iterator
和const_iterator
看起来相似,有没有办法防止重复?
我愿意接受建议和改进:)
#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) 我是计算科学家,使用大量的模拟数据,而且我经常发现自己在磁盘中保存/加载数据.对于简单的任务,比如矢量,这通常就像将一堆数字转储到文件中一样简单,就是这样.
对于更复杂的东西,生命对象等,我有保存/加载成员函数.现在,我不是一个计算机科学家,因此我经常在这里看到术语,我只是不明白(但我喜欢).我最近遇到的其中一个是序列化和Boost.Serialization
库的主题.
据我所知,序列化只是将对象转换为可以从dist保存/加载或通过网络传输的事物的过程.考虑到最多我需要将对象保存/加载到磁盘中,是否有任何理由我应该从简单的加载/保存功能切换到Boost.Serialization
?什么会Boost.Serialization
给予我的比我已经在做其他的?
我在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) 我最近开始使用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 ;
在解析代码时正确地检测到这一点.我很好奇这可能是什么原因?也许可读性?
所以今天我认为(int foo()
事实上第一次)实际上不同于int foo(void)
第一个允许任意数量的输入而第二个允许零.
是否int foo()
只是忽略任何给定的输入?如果是这样,那么允许这种形式的功能有什么意义呢?如果没有,你怎么能访问它们,这与变量参数列表(例如类似的东西int foo (int argc, ...)
)有何不同?