我试图使一个数组在结构内镜像另一个相同类型的数组,确保两个数组都指向相同的地址。
我最初尝试的内容:
duonrektoqf dr_qf;
dr_qf.loko = dr[0];
在阅读了一些有关此问题的信息后,我后来尝试了
duonrektoqf dr_qf;
dr_qf.loko = &(dr[0][0]);
两者都使用相同的error: assignment to expression with array type
Relevent数据类型:
typedef mpq_t vektoro[3];
typedef vektoro duonrektoqq[2];
typedef float vektorof[3];
typedef struct duonrektoqf {
vektoro loko;
vektorof vkt;
} duonrektoqf;
当前分配代码:
duonrektoqf dr_qf;
dr_qf.loko = &(dr[0][0]);
dr_qf.vkt[0] = (float) mpf_get_d(dr[1][0]);
dr_qf.vkt[1] = (float) mpf_get_d(dr[1][1]);
dr_qf.vkt[2] = (float) mpf_get_d(dr[1][2]);
duonrektoqq dr
是传递给函数的变量。
我希望dr_qf.loko
指向与dr[0]
和dr[0][0]
相同的位置。我希望当我将dr[0][0]
更改为4/5时,dr_qf.loko[0]
也将为4/5。我还期望dr_qf.loko
不会占用比简单指针所需更多的内存,因为该数组已经存在,并且我将不必运行复杂的gmp分配函数来初始化的全新版本数组。这是光线追踪器,我已经在使用数字库,因此性能非常重要!
我还希望dr_qf.vkt
数字是其mpq_t副本的浮点版本,这似乎不是问题。这仅与上下文相关。
dr_qf.loko
实际发生的事情是我得到了错误error: assignment to expression with array type
。
strcmp
,就像在类似线程中建议的那样,在这里将无法工作,因为这不是字符串,而且我不想复制整个内容...
编辑:尝试&(dr_qf.loko) = &(dr[0][0]);
,得到error: lvalue required as left operand of assignment
。
编辑:我认为这可能是指向数组的指针真正有意义的少数情况之一。我要尝试brb!
编辑:将类型更改为指向数组的指针有效。谢谢!
编辑:更改标题以反映意图后,我不知道如何将其取消标记为重复项(也许我应该将其发布为新问题?这需要一段时间),所以我将将这个问题的答案放在这里:
将dr_qf.loko设置为数组意味着将数组实际存储在结构dr_qf中!我们不想要那个!相反,我们需要一个指向数组的指针!
因此,类型将如下更改:
typedef struct duonrektoqf {
vektoro *loko;
vektorof vkt;
} duonrektoqf;
然后,赋值函数更改为:
duonrektoqf dr_qf;
dr_qf.loko = &(dr[0]);
dr_qf.vkt[0] = (float) mpf_get_d(dr[1][0]);
dr_qf.vkt[1] = (float) mpf_get_d(dr[1][1]);
dr_qf.vkt[2] = (float) mpf_get_d(dr[1][2]);
每当我们要访问dr_qf.loko中的元素时,我们将使用指向该元素的指针,例如:
mpq_set_si(*(dr->loko)[0], -1, 1);