2015-02-08 2 views
0

У меня возникают проблемы с массивом в C, который должен содержать несколько структур, которые я определил ранее;C: Свойства моей структуры не меняются при ссылке из массива?

Struct:

typedef struct 
{ 
    bool alive; 
    struct Vector velocity; 
    struct Vector acceleration; 
    struct Coordinate position; 
    float mass; 
    int ID; 
}Sprite; 

Массив:

Sprite Sprites[10]; 

Для создания Структуры проще, у меня есть функция, которая создает их для меня:

Создать Функция построения:

Sprite createNewSpriteWithID(int ID, int Mass) 
{ 
    Sprite newSprite; 
    newSprite.ID = ID; 
    newSprite.mass = Mass; 
    newSprite.velocity = VectorWithZero(); 
    newSprite.acceleration = VectorWithZero(); 
    newSprite.alive = 1; 
    int index = returnAvailableSpriteIndex(); 
    if (index < 11 && index > -1){ 
     Sprites[index] = newSprite; 
     printf("Sprite inserted at Index: %d\n",index); 
     spriteCount += 1; 
    } else { 
     printf("Notice: Sprite not added"); 
    } 
    return Sprites[index]; // FIXED MY BAD 
} 

Эта функция делает мне новый Struct, а затем присваиваю значения некоторым свойствам. Однако я не занимаюсь этим, потому что я хочу изменить это сам.

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

int main(int argc, const char * argv[]) { 

    // Create a test Sprites. 
    Sprite Sprite_A; 

    // Set Sprite Positions and parameters 
    Sprite_A = createNewSpriteWithID(1,300); 
    setPositionForSprite(&Sprite_A,100,100); 
    printf("\nPOS: %f, %f\n",Sprite_A.position.x,Sprite_A.position.y); 
    return 0; 
} 

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

Set Position:

void setPositionForSprite(Sprite *S, float x, float y) 
{ 
    S->position.x = x; 
    S->position.y = y; 
} 

Это где проблема становится очевидной. Когда я спрайт позицию вскоре после назначения его в Main, он выходит, как предполагалось

100,100

Однако, когда я печатаю спрайты [index_of_Sprite_A], это дает мне значения мусора. Почему это происходит?

я могу это исправить, изменив переключающий положение линии внутри основной для:

setPositionForSprite(&Sprites[0],100,100); 

Но это неосуществимо, как я должен напомнить, что индекс был.

Почему не меняют свойства моей структурной переменной, изменяют их в массиве?

+0

'if (индекс <11..' должен быть' if (index <10..'. –

+0

@SouravGhosh returnAvailableSpriteIndex() возвращает 11, если нет позиции. Поскольку нуль является допустимой позицией, я выбрал ее для возврата числа> 10. 10. – Micrified

+1

Я думаю, что на этот раз я действительно исправил ваш код ...... –

ответ

3

В вашей функции createNewSpriteWithID() вы возвращаете 1.

Снова, Sprite newSprite; является местным для createNewSpriteWithID(). Вы также не можете вернуть адрес newSprite.

Вместо этого у вас должен быть указатель на Sprite, динамически распределять память и возвращать этот указатель.Наряду с этим вам необходимо изменить тип возврата createNewSpriteWithID() на Sprite * и собрать его в другом Sprite *.

Кроме того, с определением, как Sprite Sprites[10];

if (index < 11 && index > -1){ 
     Sprites[index].... 

неправильно. Индекс массива в c начинается с 0. Вам нужно изменить, чтобы

if (index < 10 && index > -1){ 

EDIT

хорошо, ваши изменения не отражаются в исходного массива потому, что с вашей createNewSpriteWithID() функции, что возвращается элемент массива значение, которое затем собирается в локальной переменной внутри вашего main(). Когда вы вызываете setPositionForSprite(), вы передаете адрес локальной переменной в main(), поэтому изменение отражается в локальной переменной в main(), а не в элементе массива.

Чтобы исправить, используйте указатель [т. Е. Верните адрес элемента в массиве], как я предложил выше.

+0

Не должно было быть «return 1», я исправил это в правлении минуту назад. Мой плохой. – Micrified

+0

@Owatch Мое последнее редактирование должно дать вам эту идею. Надеюсь, что это поможет. :-) –

+0

Не буду ли я возвращать адрес локальной переменной «newSprite» тогда? Будет ли это отображаться, когда я получаю доступ к массиву? Я устанавливаю Array [index] = newSprite.Эта копия newSprite в память в Array [Index]? Или будет Array [Index] укажите на newSprite, чтобы я мог изменить его позже? – Micrified

0

Вы изменяете значение во временной переменной в main, а не в массиве.

2

createNewSpriteWithID возвращает структуру по значению. Это означает, что копия сделана.

Возможно, вы хотите вернуть указатель на структуру. Вы также могли бы вернуть createNewSpriteWithID индекс, который был выбран.

Вы также получаете доступ к массиву за пределами границ. Допустимые индексы от 0 до 9 включительно.

+0

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

+0

Спасибо за это сообщение, оценено –

2

Ваша функция createNewSpriteWithID возвращает целочисленное значение, то вы указываете его адрес в качестве аргумента для функции setPositionForSprite. Вот почему вы делаете доступ к номеру, как к объекту вашей структуры.