2013-09-02 4 views
0

Я довольно новичок в C и задавался вопросом, могу ли я сначала инициализировать массив структур заданного размера, а затем заполнить массив фактическими структурами после объявления. Ниже приведен фрагмент кода, который я хочу сделать, это должно быть довольно просто.Можно заполнить массив структур после объявления?

/* Make rectangle 2D object */ 
struct two_d_obj rect = {0, 4, {0, 0, 1}, {0, 0}, {0, -20.0}, {{0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0}}}; 
struct two_d_obj obj_array[25]; 
obj_array[0] = rect; 

Однако при попытке скомпилировать этот код, я получаю следующие ошибки:

hellomousept2.c:39: error: conflicting types for ‘obj_array’ 
hellomousept2.c:33: error: previous definition of ‘obj_array’ was here 
hellomousept2.c:39: error: invalid initializer 

Опять же, я новичок с C и прежде всего кода в Java, так что любая помощь, чтобы получить меня на правильном пути будет высоко оценена, и спасибо дается заранее.

EDIT: Ниже приведен код для моего two_d_obj структуры

struct two_d_obj 
{ 
    int iType; /*integer signifying shape of object (0 for rect, 1 for circle) */ 
    int num_vertices; /* number of vertices contained in the shape */ 
    double color[3]; /*array containing RGB values signifying color of object */ 
    double center_pos[2]; /*center position of object */ 
    double velocity[2]; /*velocity of object */ 
    double vertex_array[50][2]; /*array of vertice coordinates (read in pairs 
          x coordinate followed by y coordinate) 
          protocol: first pair of coordinates is bottom left 
          vertice, pairs that follow are vertices going 
          counter-clockwise  
          */ 
}; 
+0

Какое вы определите 'two_d_obj'? – pablo1977

+4

Кажется, что вы дважды объявили obj_array. Однажды на линии 33 и снова в строке 39. Это то, что сообщение компилятора пытается вам рассказать. –

+1

@Kevin Lu проблема не в коде, который вы указали, добавьте объявление структуры. – zubergu

ответ

0

Ну, если это структура, вы всегда можете сделать тетсру

struct two_d_obj rect = { ... }; 
struct two_d_obj obj_array[25]; 
memcpy(obj_array,&rect,sizeof(two_d_obj)); 

, если вы хотите, чтобы инициализировать больше членов массива только петля

for (i = 0; i < 25; ++i) 
    memcpy(obj_array + i,&rect,sizeof(rect)); 
0

Да, вы можете это сделать. Структуры могут передаваться в качестве аргументов в функции, могут быть возвращены функциями и могут быть как L, так и R-значением для операторов.

0

Да, вы можете объявить массив, а затем заполнить его. Простой пример с использованием простого типа:

char str[12]; 
char str[0] = 'a'; 

Также можно скопировать значение типов соединений с помощью присваивания (=):

struct foo { 
    int x; 
    int y; 
}; 

struct foo A = { 
    .x = 1, 
    .y = 2 
}; 

struct foo B = A; 

А и В теперь будет два отдельной Структурой с тем же значения. С массивом:

struct foo fooray[10]; 
fooray[0] = A; 

Вы также можете сделать это с помощью инициализации:

struct foo fooray[10] = { A }; 

Значение, первый элемент fooray будет равен предопределенным STRUCT Foo A. Если вы инициализировать массив таким образом (частично), остальные элементы массива будут zero'd вне, следовательно:

struct foo fooray[10] = { { 0, 0 } }; 
// or more simply: 
struct foo fooray[10] = { 0 }; 

будет массив со всеми г ero'd элементы. Обратите внимание, что большинство современных ОС в любом случае будет обладать нулевой стековой памятью по соображениям безопасности, но это не является частью стандарта C, тогда как при использовании инициализации.

0

Использование C99 (или более поздний) «соединение буквальной» позволяет писать:

struct two_d_obj obj_array[25]; 
obj_array[0] = (struct two_d_obj){ 0, 4, {0, 0, 1}, {0, 0}, {0, -20.0}, 
            { {0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0} } }; 

синтаксический соединение буквальные состоят из литой с указанием типа и рамно инициализатором с начальным значением соответствующего для тип, указанный в литье. Он может использоваться везде, где требуется значение того же типа.

Однако ваша непосредственная проблема заключается в том, что непосредственно перед (или, возможно, сразу после) кода в вопросе вы также определили obj_array, и вы не можете определить одно и то же имя дважды в той же области.

Третья строка сообщения компилятора непостижима. Вы узнаете, что первая ошибка на заданной строке обычно является точной; второе и последующее сообщения об ошибках из одной и той же строки (или строки сразу после первой строки с ошибкой) часто являются признаком того, что компилятор запутался из-за первой проблемы и в результате исказил остальную часть строки. Я подозреваю, что предупреждение «недействительный инициализатор» соответствует этой категории. Мы не можем быть уверены, потому что вы не указали обе строки 33 и 39 в своем коде.

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