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
。
这就是为什么你访问数字,作为你的结构的对象..
我在使用 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
。
这就是为什么你访问数字,作为你的结构的对象..