2017-01-16 2 views
1

Я пытаюсь создать объект (typedef struct) в C из нескольких массивов dyanimc, но у меня есть несколько вопросов, присваивающих значения членам, мой код ниже :Создание структуры объекта/typedef с использованием динамических массивов в C

#define MAX_SHIPS  200 

    typedef struct enemy { 
     int enemyX[MAX_SHIPS]; 
     int enemyY[MAX_SHIPS]; 
     int enemyDistance[MAX_SHIPS]; 
     int enemyHealth[MAX_SHIPS]; 
     int enemyType[MAX_SHIPS]; 
    }enemy; 

^определите MAX_SHIPS и создайте объект врага.

number_of_friends = 0; 
    number_of_enemies = 0; 

    if (number_of_ships > 1) 
    { 
     for (i=1; i<number_of_ships; i++) 
     { 
      if (IsaFriend(i)) 
      { 
       friendX[number_of_friends] = shipX[i]; 
       friendY[number_of_friends] = shipY[i]; 
       friendHealth[number_of_friends] = shipHealth[i]; 
       friendFlag[number_of_friends] = shipFlag[i]; 
       friendDistance[number_of_friends] = shipDistance[i];   
       friendType[number_of_friends] = shipType[i];   
       number_of_friends++; 
      } 
      else 
      {     
       int x; 
       for (x = 0; x < number_of_ships; x++) 
       { 
        enemy[x].enemyX = shipX[i]; 
        enemy[x]. enemyY = shipY[i]; 
        enemy[x].enemyDistance = shipDistance[i]; 
        enemy[x].enemyHealth = shipHealth[i]; 
        enemy[x].enemyType = shipType[i]; 
       } 

На данный момент я нахожу ошибку int x expected an identifier.

   enemyX[number_of_enemies] = shipX[i]; 
       enemyY[number_of_enemies] = shipY[i]; 
       enemyHealth[number_of_enemies] = shipHealth[i]; 
       enemyFlag[number_of_enemies] = shipFlag[i]; 
       enemyDistance[number_of_enemies] = shipDistance[i]; 
       enemyType[number_of_enemies] = shipType[i];         
       number_of_enemies++;     
       } 
      } 
     } 

^Код Я хочу удалить/заменить созданием структуры врага.

ответ

0

извините за задержку ответа/ответа, как сказал @Schwern, то структура оказалась довольно неудобно среди других вещей. В итоге я обнаружил, что проще всего написать отдельные, более мелкие функции для каждого из атрибутов.

Но опять же, спасибо за ответы ребята :)

0

Этот код должен быть

else 
{ 
    enemy.enemyX[number_of_enemies] = shipX[i]; 
    enemy.enemyY[number_of_enemies] = shipY[i]; 
    enemy.enemyDistance[number_of_enemies] = shipDistance[i]; 
    enemy.enemyHealth[number_of_enemies] = shipHealth[i]; 
    enemy.enemyType[number_of_enemies] = shipType[i]; 
    number_of_enemies++; 
} 

Обратите внимание, что квадратные скобки теперь в конце struct членов.

1

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

Вместо этого сделайте одну структуру Ship. Затем вы можете передать только указатель и использовать одну и ту же структуру для дружественных и вражеских кораблей. Вы можете хранить дружественные и вражеские корабли в списках указателей Ship без копирования всех данных.

#include <stdio.h> 
#include <stdlib.h> 

/* A structure to store ships */ 
typedef struct { 
    int x; 
    int y; 
    int distance; 
    int health; 
    int type; 
} Ship; 

/* No matter how simple the struct, always write functions to 
    create and destroy it. This makes using it simpler, and it 
    shields your code from making future changes to the struct. */ 
Ship *Ship_new() { 
    /* Use calloc(), rather than malloc(), to guarantee everything 
     is initialized to 0 rather than dealing with garbage. */ 
    return calloc(1, sizeof(Ship)); 
} 

void Ship_destroy(Ship *ship) { 
    free(ship); 
} 

/* Constants are easier to debug than macros */ 
const int MAX_FRIENDLIES = 200; 
const int MAX_ENEMIES = 200; 

int main() { 
    /* Store just a list of pointers to Ships. This is more 
     flexible and saves a lot of memory. */ 
    Ship *friendlies[MAX_FRIENDLIES]; 
    Ship *enemies[MAX_ENEMIES]; 

    /* Make new ships for demonstration purposes */ 
    Ship *enemy = Ship_new(); 
    Ship *friendly = Ship_new(); 

    /* Just to demonstrate setting values */ 
    enemy->x = 5; 
    enemy->y = 10; 
    enemy->health = 100; 
    enemy->type = 5; 

    friendly->x = 99; 
    friendly->y = 23; 
    friendly->health = 50; 
    friendly->type = 10; 

    /* Assign them to their lists. Since it's a list of Ship * 
     we only need to copy the pointer, not all the data. */ 
    friendlies[0] = friendly; 
    enemies[0] = enemy; 

    /* Make use of them. friendlies[0] and friendly point to the 
     same ship, not a copy. */ 
    printf("Friendly #1 health: %d\n", friendlies[0]->health); 
    printf("Enemy #1 health: %d\n", enemies[0]->health); 
} 
Смежные вопросы