2012-09-05 2 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

Это массивы в структуре; они не могут быть назначены. Вы должны определить оператор =() для каждой из структур и использовать memcpy на массивах или скопировать их в элементе цикла по элементу.

0

(если вы хотите, чтобы получить ссылку на ваш глобальный переменный):

Я не уверен, если это правильно (и проблема), но я думаю, что, кроме прототипов функций, массивов и указателей (для массивов 1. элемент) не совсем то же самое. И есть разница между указателем на массив и указатель на 1 элемент массива)

Может принимать адрес массива:

*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 является:

void gettable(recordtype[] targetArr); 

Массивы обеспечивается Другим крупным как указатель на первый элемент, когда речь идет о функциональные параметры. Вы можете снова запросить указатель на весь массив и разыскать его внутри gettable.Но вам всегда нужно копировать элемент.

Вы можете использовать memcopy для выполнения задания как 1-футовый. Современные компиляторы должны генерировать одинаково эффективный код AFAIK.

 Смежные вопросы

  • Нет связанных вопросов^_^