【问题标题】:Passing an element of an array of structs to a function将结构数组的元素传递给函数
【发布时间】:2013-12-24 16:42:17
【问题描述】:

我试过这段代码,但它不起作用。我只想发送struct grid 的元素p,而不是整个结构体。

struct grid{ 
  int p; 
  int s; 
}

void create(int a[9][9]); 
{ 
  a[0][2] = 4; 
}

int main() 
{
  struct grid a[9][9]; 
  create(a.s); 
}

【问题讨论】:

  • int, int[][9] 是两种不同的类型。你不能混用。要访问数组的成员,需要使用[] 运算符。
  • 选择一种语言并坚持下去。 C 和 C++ 是两种语言,算数吧。
  • 在不重新构建程序的情况下,没有简单的方法可以在 C 中完成您的要求。
  • C 风格的 2D 数组是一个需要避免的噩梦。
  • 结构数组的元素是一个结构。结构的元素可以是整数。您不能从结构数组中选择整数数组。

标签: c++ c function struct


【解决方案1】:

正如其他人指出的那样,您需要的东西不能以这种方式完成。解决此问题的一种方法是在将矩阵传递给方法之前对其进行转换:

using namespace std;

struct grid{ 
    int p; 
    int s; 
};

void create(int a[9][9])
{ 
    a[0][2] = 4; 
}

void ExtractS(struct grid a[9][9], int s[9][9])
{
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            s[i][j] = a[i][j].s;
}

int main() 
{
    struct grid a[9][9]; 
    int s[9][9];
    ExtractS(a, s);
    create(s);
}

但这带来的问题比它回答的要多:

  • 必须将数据返回到原始结构矩阵,否则 create 所做的更改将丢失
  • 这种方法效率很低,因为它复制了所有数据

也许你应该修改设计并使create函数接收grid元素的矩阵。

【讨论】:

  • 您可以使转换采用对int 的引用矩阵,而不是仅使用int,这样不会丢失更改,但范围界定可能是个问题。
【解决方案2】:

初始说明: void create(int a[9][9]) 实际上变成了
void create(int a[][9])void create(int (*a)[9])

你可能想要void create(int (&amp;a)[9][9])

正如你所拥有的 struct grid { int p; int s; };struct grid a[9][9];

你应该这样初始化:

void create(grid (&g)[9][9])
{
    g[0][2].s = 4;
}

或将您的结构更改为

struct grid {
    int p[9][9];
    int s[9][9];
};

然后有

void create(grid &g)
{
    g.s[0][2] = 4;
}

void create(int (&a)[9][9])
{
    a[0][2] = 4;
}

您分别致电create(g)create(g.s)

【讨论】:

    【解决方案3】:

    你基本上有三个选择,切换到两个矩阵,把维度放在结构中,或者让create() 取一个结构数组:

    两个数组:

    void create(int a[9][9]) 
    { 
      a[0][2] = 4; 
    }
    
    int main() 
    {
      int p[9][9];
      int s[9][9]; 
      create(s); 
    }
    

    -- 或 -- 将维度放入结构中:

    struct grid{ 
      int p[9][9]; 
      int s[9][9]; 
    };
    
    void create(int a[9][9])
    { 
      a[0][2] = 4; 
    }
    
    int main() 
    {
      struct grid a; 
      create(a.s); 
    }
    

    -- 或 -- 传递一个结构数组

    struct grid{ 
      int p; 
      int s; 
    };
    
    void create(struct grid[9][9] * a) 
    { 
      (*a)[0][2].s = 4; 
    }
    
    int main() 
    {
      struct grid a[9][9]; 
      create(&a); 
    }
    

    你不能从结构的数组或矩阵中挑选元素

    【讨论】:

      【解决方案4】:

      您将一个整数传递给一个函数,该函数需要一个指向 2D array 的指针作为参数,

      接受结构体grid的成员变量s作为参数的函数原型如下,

      void create(int a); 
      

      您的程序中的函数定义中还有一个不需要的分号。

      void create(int a[9][9]); <-- No need
      { 
          a[0][2] = 4; 
      }`
      `
      

      【讨论】:

      • 但我认为他实际上想发送 9x9 的 esses,而不仅仅是一个数字,在 ; tho 上很明显。
      • 他的struct 定义中也缺少分号。
      猜你喜欢
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多