这是我的代码:
#include <iostream>
using namespace std;
struct galaxy
{
int x_pixel;
int y_pixel;
};
galaxy get_space_ship(int size)
{
galaxy UFO[size];
for(int i=0;i<size;i++)
{
UFO[i].x_pixel = 10;
UFO[i].y_pixel = 10;
}
return UFO[size];
}
galaxy update(galaxy UFO[], int size)
{
for(int i=0;i<size;i++)
{
UFO[i].x_pixel += 100;
UFO[i].y_pixel += 100;
}
return UFO[size];
}
int main()
{
galaxy space_ship[10];
space_ship[10] = get_space_ship(10);
for(int i=0;i<10;i++)
{
cout << space_ship[i].x_pixel << endl;
cout << space_ship[i].y_pixel << endl;
}
space_ship[10] = update(space_ship,10);
for(int i=0;i<10;i++)
{
cout << space_ship[i].x_pixel;
cout << space_ship[i].x_pixel;
}
}
这里我试图为一个数组创建一个带有两个字段(x_pixel,y_pixel)结构的程序,然后初始化它们并更新它们的值并打印它们但没有得到预期的输出。我的代码没有任何汇编错误。请查看我的代码并让我知道我错在哪里,并且还包括一些提示,因为我是新手。 THANX
答案 0 :(得分:2)
C中的数组不像您认为的那样有效。他们不是一等公民,所以你不能通过价值来传递或归还。数组反而变为指向第一个元素的指针。这是一件好事,因为在您的示例中,您不希望来回复制整个数组。这是一个可以满足您需求的工作示例:
struct galaxy
{
int x_pixel;
int y_pixel;
};
void get_space_ship(galaxy* arr, int size)
{
for (int i = 0; i < size; i++)
{
arr[i].x_pixel = 10;
arr[i].y_pixel = 10;
}
}
void update(galaxy* arr, int size)
{
for (int i = 0; i < size; i++)
{
arr[i].x_pixel += 100;
arr[i].y_pixel += 100;
}
}
int main()
{
galaxy space_ship[10];
get_space_ship(space_ship, 10);
for (int i = 0; i < 10; i++)
{
cout << space_ship[i].x_pixel << endl;
cout << space_ship[i].y_pixel << endl;
}
update(space_ship, 10);
for (int i = 0; i < 10; i++)
{
cout << space_ship[i].x_pixel;
cout << space_ship[i].x_pixel;
}
}
但是,由于这些原因,C阵列被认为是一种非常低级且容易出错的构造。更好的方法是使用std :: vector&lt;&gt;或者std :: array&lt;&gt;并通过引用传递它们以保存副本。
std::vector<galaxy> get_space_ship(int size)
{
std::vector<galaxy> ships;
for (int i = 0; i < size; ++i)
ships.push_back(galaxy{ 10, 10 });
return ships;
}
void update(std::vector<galaxy>& ships) // note reference
{
for (auto & ship : ships)
{
ship.x_pixel += 100;
ship.y_pixel += 100;
}
}
int main()
{
auto ships = get_space_ship(10);
for (const auto & ship : ships)
{
cout << ship.x_pixel << endl;
cout << ship.y_pixel << endl;
}
update(ships);
for (const auto & ship : ships)
{
cout << ship.x_pixel;
cout << ship.x_pixel;
}
}
请注意,您不需要多次声明大小,因为您使用的是更高级别的抽象,它知道它的大小。
答案 1 :(得分:0)
您对以下c ++结构存在误解:
space_ship[10]
并不代表“全部十艘宇宙飞船”。它指的是具有索引10(=第11艘宇宙飞船)的宇宙飞船。你没有太多的宇宙飞船,你有十个。std::vector
或std::array
(对于固定数量的元素),这对您来说更容易预测。galaxy_update
没有收到数组的副本,它会直接修改数组。无需返回修改后的数组。建议:正确缩进代码。一个合适的IDE将帮助您。缩进可能看起来很麻烦,但它具有很高的成本/收益比。