未获得期望输出(Struct with Array)C ++

时间:2017-09-23 17:34:05

标签: c++ arrays struct

这是我的代码:

#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

2 个答案:

答案 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艘宇宙飞船)的宇宙飞船。你没有太多的宇宙飞船,你有十个。
  • 如果你不熟悉指针,避开普通的C ++数组,就会有一些令人惊讶的行为迫使你使用指针。特别是它们很难与它们作为一个整体一起工作。如果您对C / C ++完全不熟悉,我建议使用std::vectorstd::array(对于固定数量的元素),这对您来说更容易预测。
  • 如果你想继续使用常规[]数组,请注意galaxy_update没有收到数组的副本,它会直接修改数组。无需返回修改后的数组。

建议:正确缩进代码。一个合适的IDE将帮助您。缩进可能看起来很麻烦,但它具有很高的成本/收益比。