0

在尝试从一个位置复制到另一个位置时,我在使用标准 C 编译器的 Visual Studio 2005 中遇到了编译器问题。

这些类型在文件中定义如下:

definition.h

#define MAX 7

typedef struct{
   char    recordtext[18];
   boolean recordvalid;
}recordtype;

typdef recordtype tabletype[MAX];

typedef struct{
   tabletype table;
}global_s;

让我们假设一个 global_s“对象”在某处被实例化和初始化,并创建了一个指向该结构的指针。

#include "definition.h"

global_s global;
global_s* pglobal = &global;
init(&pglobal);

同时,在另一个文件中(这就是我的问题所在)我正在尝试创建一个本地 tabletype 对象,并用全局表成员填充它,使用 get 方法来保护全局(假设它是“静态的”)

#include "definition.h"

extern global_s* pglobal;

tabletype t;
gettable(&t);

void gettabl (tabletype* pt)
{
   *pt = pglobal->table;
}

当我去编译时,gettable函数中的行会抛出一个编译器错误“错误C2106:'=':左操作数必须是左值。看起来这应该表现为正常的复制操作,事实上,如果我对一个更基本的结构执行类似的操作我没有得到错误。例如,如果我复制一个只包含两个整数的结构。

有没有人对为什么这个操作似乎不正确有一个可靠的解释?

(免责声明:出于示例目的,我已将此代码开发为我的实际代码的清理版本,因此它在语法上可能不是 100% 正确,如果有人指出问题或需要澄清的内容,我将编辑问题。)

4

2 回答 2

0

它是结构中的数组;他们不能被分配。您应该为每个结构定义一个 operator=(),并在数组上使用 memcpy,或者在循环中逐个元素地复制它们。

于 2012-09-10T22:35:22.587 回答
0

(如果您想获得对全局变量的引用):

我不确定这是否正确(以及问题),但我认为除了函数原型之外,数组和指针(指向数组 1. 元素)并不完全相同。指向数组的指针和指向数组的 1. 元素的指针是有区别的)

也许获取数组的地址:

*pt = &(pglobal->table);

无论如何,最好不要获取整个数组的地址,而是获取第一个元素的地址,以便生成的指针可以直接用作记录数组(无需取消引用)

recordtype* gettable (size_t* puLength)
{     
    *puLength = MAX;     
    return &(pglobal->table[0]);        
}

(如果您想要表格的副本):

数组不能在 C90 中就地复制,当然你必须提供目标内存。然后,您将定义一个函数 get table,如下所示:

void gettable (recordtype * const targetArr)
{
    size_t i = 0;
    for (; i < MAX; i++) targetArr[i] = pglobal->table[i];
    return;
}

gettable 的一个完全等效的函数原型是:

void gettable(recordtype[] targetArr);

当涉及到函数参数时,数组通过引用作为指向第一个元素的指针提供。您可以再次请求指向整个数组的指针,并在 gettable 中取消引用它。但是你总是必须逐元素复制。

您可以使用 memcopy 作为 1-liner 来完成这项工作。现代编译器应该生成同样有效的代码AFAIK。

于 2015-01-16T12:48:27.080 回答