C:当从数组引用时,我的结构的属性不会改变?

C: My struct's properties don't change when referenced from an Array?

我在使用 C 中的数组时遇到问题,该数组应该包含我之前定义的几个结构;

结构体:

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的函数,它将一个位置分配给传递的精灵指针的位置属性。

设置位置:

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

这就是问题变得明显的地方。当我在 Main 中分配位置后不久对其进行 sprite 时,它​​按预期出现

100,100

但是,当我打印 Sprites[index_of_Sprite_A] 时,它给了我垃圾值。为什么会这样?

我可以通过将 main 中的 change-position 行更改为:

来修复它
setPositionForSprite(&Sprites[0],100,100);

但这是不可行的,因为我必须回忆索引是什么。

为什么更改我的结构变量的属性不会更改数组中的它们?

您更改了 main 中临时变量的值,而不是数组中的值。

在您的 createNewSpriteWithID() 函数中,您正在 returning 1

同样,Sprite newSprite; 对于 createNewSpriteWithID() 是本地的。您也不能 return newSprite 的地址。

相反,您需要有一个指向 Sprite 的指针,动态分配内存并 return 该指针。除此之外,您需要将 createNewSpriteWithID() 的 return 类型更改为 Sprite * 并在另一个 Sprite *.

中收集相同的类型

此外,定义如 Sprite Sprites[10];

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

错了。 c 中的数组索引从 0 开始。您需要更改为

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

编辑

好吧,您的更改没有反映在 原始数组 中,因为从您的 createNewSpriteWithID() 函数,您正在 returning 数组元素值,然后收集在您的main() 中的局部变量中。当您调用 setPositionForSprite() 时,您传递的是 main() 中局部变量的地址,因此更改反映在 main() 中的局部变量中,而不是数组元素中.

要纠正,请使用指针 [即 return 数组中元素的地址],正如我上面所建议的。

createNewSpriteWithID return 结构值。这意味着制作了一个副本。

也许您的意思是 return 指向结构的指针。您也可以选择 createNewSpriteWithID return 索引。

您似乎也越界访问了数组。有效索引为 0 到 9(含)。

你的函数 createNewSpriteWithID returns 一个整数值,然后你将它的地址作为参数传递给函数 setPositionForSprite。 这就是为什么你访问数字,作为你的结构的对象..