在任何内容之前,以下是完整代码的链接:
笔记
:代码已修复。请参阅旧版本以查找错误代码。
我一直试图通过在如下参数中引用向量来初始化向量(如线性代数):
int buildNormalVector(double x, double y, double z, Vector **v)
{
(*v) = (Vector *)malloc(sizeof(Vector *));
(*v)->x = x;
(*v)->y = y;
(*v)->z = z;
(*v)->base = (Basis *)malloc(sizeof(Basis *));
buildSimpleVector(1, 0, 0, &((*v)->base->i));
buildSimpleVector(0, 1, 0, &((*v)->base->j));
buildSimpleVector(0, 0, 1, &((*v)->base->k));
return v;
}
其中
Vector
是这样的:
typedef struct Vector Vector;
typedef struct SimpleVector SimpleVector;
typedef struct Basis Basis;
struct Vector {
double x;
double y;
double z;
Basis *base;
};
struct Basis {
SimpleVector *i;
SimpleVector *j;
SimpleVector *k;
};
struct SimpleVector {
double x;
double y;
double z;
};
请注意此行:
buildSimpleVector(1, 0, 0, &((*v)->base->i));
下面是我如何初始化每个
SimpleVector
这将作为一个基础:
int buildSimpleVector(double x, double y, double z, SimpleVector **v)
{
(*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
(*v)->x = x;
(*v)->y = y;
(*v)->z = z;
return 0;
}
我一直在努力找到正确的方法来传递对
i, j, k
该向量的向量基。我试过了
&(*((*v)->base)->k)
也一样,但对我来说,这太令人困惑了,而且不起作用。上面的示例可以正常工作,但只有一半的时间可以正常工作,并且在这一行出现读取访问冲突错误:
(*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
有时程序会通过所有测试,有时不会(这是这个问题中最奇怪的部分)。
我确信要改变
Vector *v
必须通过如下引用传递在main中声明的
Vector **v
然后我就可以
(*v) = malloc and change it..
更改原始值,并且由于运算符的优先级,需要使用括号。当我传递
SimpleVector
或者当我分配
矢量
?我可以这样做吗?
Vector *v;
buildNormalVector( 1, 2, 3, &v);
关于结构、指针和内存分配的问题可能太多了,所以如果您知道任何可以解释所有这些概念的好书或网页,我将不胜感激!
编辑
:
我一直在使用Visual Studio 2017编译和运行该程序