我无法弄清楚这一点:
int main() {
int (*) (int *) = 5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的赋值用g ++ c ++ 11编译.我知道这int (*) (int *)是一个指向函数的指针,它接受一个(int *)as参数并返回一个int,但是我不明白你怎么能把它等同于5.起初我认为它是一个不断返回5的函数(来自我最近的学习) F#,可能,哈哈),然后我简单地想,函数指针指向内存位置5,但这显然不起作用,并且十六进制值也不行.
认为这可能是因为函数返回一个int,并且分配一个int是好的(不知何故),我也试过这个:
int * (*) (int *) = my_ptr
Run Code Online (Sandbox Code Playgroud)
where my_ptr是类型int *,与第二个函数指针的类型相同,如第一种类型为int的情况.这不编译.分配5或任何int值,而不是my_ptr,也不编译此函数指针.
那么作业是什么意思呢?
更新1
我们已经确认这是一个错误,如最佳答案所示.但是,仍然不知道您分配给函数指针的值实际发生了什么,或者赋值的情况.任何(好的)解释都将非常感谢!有关问题的详细说明,请参阅下面的编辑.
编辑1
我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中)
编辑2
实际上,将它等同于我的编译器.甚至将它等同于std :: string变量,或者返回double的函数名,也可以.
编辑2.1
有趣的是,使它成为一个函数指针,指向任何返回不是指针的数据类型的函数,将让它进行编译,例如
std::string (*) () = 5.6;
Run Code Online (Sandbox Code Playgroud)
但是只要函数指针指向返回某个指针的函数,它就不会编译,例如with
some_data_type ** (*) () = any_value;
Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能拥有具有以下行为的代码:
int main()
{
func<vector>(/*some arguments*/);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我希望用户能够指定容器而不指定其操作的类型.
例如,可能定义的某些(元)代码(不适用于上述代码)func将如下所示:
template<typename ContainerType>
int func(/*some parameters*/)
{
ContainerType<int> some_container;
/*
operate on some_container here
*/
return find_value(some_container);
}
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法可以控制哪个绘图位于其他绘图之上,如果在一个轴上绘制多个绘图.一个例子:
如您所见,绿色系列位于蓝色系列的顶部,两个系列都位于黑点之上(我用散点图制作).我希望黑点位于两个系列(线)之上.
我首先使用以下代码完成上述操作
plt.plot(series1_x, series1_y)
plt.plot(series2_x, series2_y)
plt.scatter(series2_x, series2_y)
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下内容
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(series1_x, series1_y)
ax2 = fig.add_subplot(111)
ax2.plot(series2_x, series2_y)
ax3 = fig.add_subplot(111)
ax3.scatter(series2_x, series2_y)
Run Code Online (Sandbox Code Playgroud)
还有一些变化,但没有运气.
围绕这些plot函数进行交换会影响哪个绘图位于顶部,但无论我在何处放置该scatter函数,这些线都位于点的顶部.
注意:
我在Windows 10(本例)中使用Python 3.5,但在Ubuntu上主要使用Python 3.4.
笔记2:
我知道这可能看起来像一个微不足道的问题,但我有一个案例,在点上的系列是如此密集,以至于点的颜色变得模糊,在这些情况下我需要我的读者清楚地看到哪些点是什么颜色,因此我需要点在顶部.
我只是有一个简短的问题.我无法弄清楚使用std::next而不仅仅是向指针添加所需数量的进步的好处.一个简单的例子:
int main()
{
int arr [] = {1, 2, 3, 4, 5};
cout << *(arr + 2) << ", "; //example 1
cout << *std::next(arr, 2) << endl; //example 2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 3, 3
从逻辑上讲,示例1应该更快,因为没有调用函数等.此外,在我运行此代码的实例中,如果我添加了一个会导致指针超出范围的数字(例如7),编译器会在示例1中抛出一个错误,但很高兴继续在示例2中给我一个内存地址.这与我最初的想法相矛盾:std::next如果指针超出界限,会发出某种警告或某些事情.
任何启蒙都会受到赞赏.
我意识到一个与此相关的问题已经被问到无法从轮式安装numpy,但是那里提出的解决方案对我不起作用.我也问过那个帖子(通过回答!)但是我没有得到任何回复,所以这里有:
我一直在尝试安装matplotlib,但我首先需要安装numpy.我下载了文件numpy-1.8.2 + mkl-cp26-none-win_amd64.whl,然后尝试使用pip安装它.我一直得到的错误信息是:
"numpy-1.8.2 + mkl-cp26-none-win_amd64.whl不是这个平台上支持的轮子".我在上面引用的线程建议的解决方案是将"_amd64"替换为"32",使文件名为numpy-1.8.2 + mkl-cp26-none-win32.whl.这也不起作用,我得到与上面完全相同的错误.
有什么建议?
我在Windows 7 64位上使用64位64位Python.
我想知道是否有可能std::vector<...>通过访问容器内的对象来获取容器内部对象的迭代器(例如),例如通过引用(这意味着我们可以访问指向它的指针)&运营商).例如,通常我们将迭代器声明为
std::vector<int>::iterator = vec.begin();
Run Code Online (Sandbox Code Playgroud)
要么
std::vector<int>::iterator = next(vec.begin(), idx);
Run Code Online (Sandbox Code Playgroud)
但在第一个例子中,我们很可能要按顺序迭代容器,而在第二个例子中,我们知道我们需要的对象的索引.我想知道我们是否可以获取对象的迭代器而不知道它驻留在容器中的哪个索引,但是如果我们确实有一个引用或指向它的指针,如上所述.
看起来这个问题似乎已经在这里被提出了,但似乎OP更希望其他人修改他的代码,而不是回答一般性问题,所以答案在我看来并不那么令人满意.此外,这里的答案似乎是说我们可以使用构造函数初始化迭代器,如下所示
std::vector<int>::iterator it(...);
Run Code Online (Sandbox Code Playgroud)
但是我在官方文档中找不到std :: iterator类的构造函数的任何证据(我也没能在std :: vector <...> :: iterator上找到任何文档)所以我很谨慎使用上面显示的构造函数,即使它编译.
注意
我用std::vector上面的例子,但理想情况下我希望这适用于任何容器,例如std::list或std::deque
为什么以下编译
std::vector<int(*)(double)> func_ptrs;
Run Code Online (Sandbox Code Playgroud)
但事实并非如此
std::vector<int(double)> func_ptrs
Run Code Online (Sandbox Code Playgroud)
?
在第二种情况下,我得到了一个丑陋的STL错误消息,所以我不会把所有内容都放在这里,但是在消息的最后我得到了这个
/usr/include/c++/4.8/bits/stl_construct.h:102:30: error: ISO C++ forbids incrementing a pointer of type ‘int (*)(double)’ [-fpermissive]
for (; __first != __last; ++__first)
Run Code Online (Sandbox Code Playgroud)
这似乎意味着C++将类型转换int(double)为int (*) (double).我的印象是int(*)(double),int(double)无论如何都是等同的?还是我错了?
想要澄清一下.提前致谢.
我想知道我的编译器使用以下代码做了什么
void design_grid::design_valid()
{
auto valid_idx = [this]() {
if ((row_num < 0) || (col_num < 0))
{
return false;
}
if ((row_num >= this->num_rows) || (col_num >= this->num_rows))
{
return false;
}
return true;
}
/* some code that calls lambda function valid_idx() */
}
Run Code Online (Sandbox Code Playgroud)
如果我反复调用上面的(design_grid::design_valid)成员函数函数,那么当我的程序遇到valid_idx每次创建时会发生什么?编译器是否在编译时内联后面调用的代码,以便在valid_idx遇到创建时实际上不执行任何操作?
UPDATE
汇编代码的一部分如下.如果这有点太多了,我会稍后发布另一批有色的代码,以说明哪些部分是哪些.(目前没有一种很好的方法可以与我对代码段进行着色).还要注意我已经更新了我的成员函数的定义和上面的lambda函数,以反映它在我的代码中真正命名的内容(因此,在汇编语言中).
在任何情况下,似乎lambda都是与main函数分开定义的.lambda函数由_ZZN11design_grid12design_validEvENKUliiE_clEii下面的函数表示.反过来,在函数的正下方,外部函数(design_grid::design_valid)由_ZN11design_grid12design_validEv开始表示.稍后_ZN11design_grid12design_validEv,打电话给_ZZN11design_grid12design_validEvENKUliiE_clEii.进行调用的这一行看起来像
call _ZZN11design_grid12design_validEvENKUliiE_clEii #
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但这意味着编译器将lambda定义为函数外的正常design_valid函数,然后将其作为正常函数调用它应该是什么时候?也就是说,每次遇到声明lambda函数的语句时,它都不会创建新对象?我在该特定位置看到lambda函数的唯一迹线是# tmp85, valid_idx.__this在第二个函数中注释的行,就在函数开始时重新调整的基本和堆栈指针之后,但这只是一个简单的movq操作.
.type _ZZN11design_grid12design_validEvENKUliiE_clEii, …Run Code Online (Sandbox Code Playgroud) 我知道在Python中,如果你想要将两个参数传递给一个函数,一个是一个对象,另一个指定必须在对象上调用的实例方法,那么用户可以轻松地传递对象本身,以及方法的名称(作为字符串)然后使用getattr对象上的函数和字符串来调用对象上的方法.
现在,我想知道是否有一种方法(如在C++中,对于那些知道的人)传递对象的位置,以及实际方法(或者更确切地说是对方法的引用,但不是方法名称作为字符串).一个例子:
def func(obj, method):
obj.method();
Run Code Online (Sandbox Code Playgroud)
我试过传递如下:
func(obj, obj.method)
Run Code Online (Sandbox Code Playgroud)
或者作为
func(obj, classname.method)
Run Code Online (Sandbox Code Playgroud)
但是都不起作用(我认识的第二个是一个很长的镜头,但无论如何我试过了)
我知道您也可以定义一个只接受该方法的函数,然后将其称为
func2(obj.method)
Run Code Online (Sandbox Code Playgroud)
但我特别询问您希望引用对象本身的实例,以及对要在对象上调用的所需类实例(非静态)方法的引用.
编辑:
对于那些感兴趣的人,我发现了一个非常优雅的方式,受到下面接受的答案的"启发".我只是定义func为
def func(obj, method):
#more code here
method(obj, parameter); #call method on object obj
Run Code Online (Sandbox Code Playgroud)
并称之为
func(obj_ref, obj_class.method);
Run Code Online (Sandbox Code Playgroud)
其中obj_class是obj_ref是其实例的实际类.
在Python(更具体地说是Python 3.x)中,如果我说x = x,在低级别对x可变(如list)的引用或对不可变(如int)的引用,会发生什么?编译器是否只是忽略了这些废话?
更具体地说,如果我们有以下情况,编译器会做什么:
class A:
def __init__(self):
self.a = self.init_a()
def init_a(self):
self.a = some_value
"""
do stuff with self.a here
"""
return self.a
Run Code Online (Sandbox Code Playgroud)
对于那些没有注意到的人,self.a通过函数有效地分配给自己init_a(self).
我知道class A上面的这个案例看起来很傻,但是我试图通过清楚地初始化__init__(self)函数内部的所有成员变量来保持我的代码清晰可读(在我实现的另一个类中).我只想知道编译器是否优化了这一步,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果(我猜它会被优化掉,但我想成为当然 - 你永远不知道).
c++ ×6
python ×4
pointers ×3
matplotlib ×2
c++11 ×1
class ×1
compilation ×1
containers ×1
iterator ×1
lambda ×1
numpy ×1
object ×1
parameters ×1
performance ×1
pip ×1
plot ×1
python-wheel ×1
reference ×1
stl ×1
templates ×1