我注意到调用python参数的方式存在差异.在我处理过的每一种语言中,你都有
foo()
Run Code Online (Sandbox Code Playgroud)
意思是没有参数,或者你喜欢的参数,或者
foo(arg1, arg2,...,argn)
Run Code Online (Sandbox Code Playgroud)
您传入相同数量的参数来定义函数并调用它.然而,在python中,我注意到函数定义,以及调用函数时,可以有两个不同的参数集,这通常包括:
class foo(object):
def bar(self, arg1, arg2):
pass
Run Code Online (Sandbox Code Playgroud)
但是,当我想调用该函数时,我所要做的就是:
zoo = foo()
zoo.bar(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
自我参数在哪里?
谢谢.
像许多3D图形程序一样,我有一堆具有自己的模型坐标的对象(在x,y和z轴上从-1到1).然后,我有一个矩阵,从模型坐标到世界坐标(使用被绘制对象的位置,旋转和比例).最后,我有第二个矩阵将这些世界坐标转换为OopenGL ES 2.0将用于绘制到屏幕的规范坐标.
因此,因为一个对象可以包含许多顶点,所有顶点都使用相同的变换进入世界空间和规范坐标,所以一次计算这两个矩阵的乘积更快,并将每个顶点放在生成的矩阵中,而不是放置每个顶点都通过两个矩阵.
但是,据我所知,在OpenGL ES 2.0着色器中似乎没有办法让它一次计算矩阵,并继续使用它直到两个矩阵中的一个使用直到glUniformMatrix4fv()(或另一个)调用函数来设置统一).因此,似乎计算矩阵的唯一方法是在CPU上执行,然后使用统一结果生成GPU.否则,当像这样的事情:
gl_Position = uProjection * uMV * aPosition;
Run Code Online (Sandbox Code Playgroud)
它会一遍又一遍地计算,这似乎会浪费时间.
那么,哪种方式通常被认为是标准的?还是有一种我完全失踪的不同方式?据我所知,用于在OpenGL ES 2.0编程指南中实现OpenGL ES 1.1管道的着色器仅使用一个矩阵,那么使用更多?
我有一个头文件BKE_mesh.h的以下块:
/* Connectivity data */
typedef struct IndexNode {
struct IndexNode *next, *prev;
int index;
} IndexNode;
void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
const int totvert, const int totface);
void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
const int totvert, const int totedge);
Run Code Online (Sandbox Code Playgroud)
请注意,头文件是为准备在C++文件中使用而准备的,因为它具有:
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
在文件的顶部,以及底部所需的完成.但实现它的类是用C语言编写的.
接下来,每当我尝试#include头文件时,我都会遇到奇怪的错误.如果文件的扩展名为.cpp,则编译得很好,没有任何投诉.但是,如果我这样做:
#include "BKE_mesh.h"
Run Code Online (Sandbox Code Playgroud)
在.c扩展名的文件中,我收到以下错误:
expected ')' before '*' token
Run Code Online (Sandbox Code Playgroud)
对于最后两个函数,具体来说,变量:
ListBase **map
Run Code Online (Sandbox Code Playgroud)
在这两个班级.(注意,在头文件的早期,它已声明,但未定义ListBase).
所以,我的问题是:为什么这是有效的C++代码,而不是C代码?
谢谢.
我有一个vector<vector<Person*>*>*被调用的组(是的,我知道shared_ptr,但我不能在这个上下文中使用它们),另一个叫做partialGroups
无论如何,在方法结束时,我删除了所有内部向量,但不删除了人本身,因为我仍然希望它们有效,所以这里是代码的结尾:
// Deal with remaining partial teams
vector<Person*> *unsortable;
groups->push_back(unsortable);
// Remaining people
for(unsigned int i = 0; i < people.size(); i++) {
unsortable->push_back(people[i]);
}
// Remaining partial groups
for(unsigned int i = 0; i < partialGroups.size();i++) {
for(unsigned int j = 0; j < partialGroups[i]->size(); j++) {
unsortable->push_back(partialGroups[i]->at(j));
}
delete partialGroups[i];
}
return groups;
Run Code Online (Sandbox Code Playgroud)
然后我用这行代码调用该方法:
vector<vector<Person*>*> *currentMatch = sort(*people);
Run Code Online (Sandbox Code Playgroud)
我可以一直运行gdb到返回组; 声明,并查看数据结构,这很好.但是,当我退出该方法时,程序崩溃,堆栈跟踪显示它在向量析构函数本身中崩溃.
到底是什么导致了这个?它不应该是Person析构函数的问题,因为内部向量是指向人的指针.另外,取出删除行并没有什么区别.(是的,我知道它会留下内存泄漏,但它可能有助于诊断问题).
谢谢.
编辑:此外,错误是一个sigabrt