2012-09-05 36 views
0

我在尝试执行从一个位置到另一个位置的结构副本时,在Visual Studio 2005中使用标准C编译器时遇到了编译器问题。结构副本问题

的类型是在一个文件中定义如下:

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:‘=’:左操作数必须是左值看起来好像这应该表现为正常的复制操作,事实上,如果我在更基本的结构上执行类似的操作,我不会收到错误。例如,如果我复制只包含两个整数的结构RS。

有没有人有一个坚实的解释,为什么这个操作似乎是不正确的? (免责声明:我已将此代码作为我的实际代码的清理版本用于示例目的,因此它在语法上可能不是100%正确,如果有人指出问题或需要澄清的问题,我将编辑该问题)

回答

0

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

0

(如果你想获得一个关于你的全局变量):

我不知道,如果这是正确的(和问题),但我认为,除了函数原型,数组和指针(以数组1.元素)并不完全相同。还有就是数组和指针数组的元素1)

也许走的是数组的指针ADRESS之间的差异:

*pt = &(pglobal->table); 

反正它可能是最好不要取的地址整个阵列但第一元素的地址,使得所得到的指针可以直接被用作记录阵列(没有解除引用它)

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

(如果希望表的副本):

数组不能在C90中就地复制,当然你必须提供目标内存。然后,您可以定义一个函数来获取表是这样的:

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

一个完全等效的函数原型gettable是:由refernce提供

void gettable(recordtype[] targetArr); 

数组作为指针的第一个元素,当它涉及到功能参数。您可以再次请求一个指向整个数组的指针,并在gettable中对其进行解引用。但是你总是必须复制元素。

您可以使用memcopy将其作为单线程工作。现代编译器应该生成同样有效的代码AFAIK。