【问题标题】:Pass struct into function as its individual attributes将结构作为其单独的属性传递给函数
【发布时间】:2017-02-27 19:18:21
【问题描述】:

我想将一个结构传递给一个(递归)函数,并且每次调用该函数时,我都想更改它获得的属性的值,而不更新前一个作用域中的实际值。

这里是一些示例代码。这将是实现这一点的正确方法吗? (“函数”文件中的函数调用需要具体帮助。

头文件

typedef struct Pos {
  int x;
  int y;
} Pos;

bool func1(Pos vars, int step);

主要

int main(int argc, char ** argv) {
  Pos vars = {.x = 0, .y = 0};

  if (func1(vars, 0)) {
    return EXIT_SUCCESS;
  }
  return EXIT_FAILURE;
}

功能

bool func1(Pos vars, int step) {
  if (step == 2) {
    return true;
  }

  func1({.x += 1, .y += 2}, step+1);

  printf("%d %d", vars.x, vars.y);

  return true;
}

【问题讨论】:

  • 不通过地址传递的参数会被自动复制,所以每次调用都有一个副本,不会影响调用者的副本。
  • func1({.x += 1, .y += 2}, step+1); --> func1((Pos){vars.x + 1, vars.y + 2}, step+1);func1((Pos){vars.x += 1, vars.y += 2}, step+1); ?
  • @BLUEPIXY 这正是我想要的,谢谢。

标签: c


【解决方案1】:

您需要使用“复合文字”,它看起来像初始化器之前的强制转换:

bool func1(Pos vars, int step) {
    if (step == 2) {
        return true;
    }

    func1((Pos){.x = vars.x + 1, .y = vars.y + 2}, step+1);

    printf("%d %d", vars.x, vars.y);

    return true;
}

此功能已添加到 C99 — 但由于您尝试使用指定的初始化程序,因此这对您来说可能不是问题。


我看到 BLUEPIXYcomment 中指出了这个符号,我在添加这个答案之后才阅读。
我制作了这个社区 Wiki。

【讨论】:

    【解决方案2】:

    这是一个代码,也许它可以帮助你

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    
    typedef struct Pos {
        int x;
        int y;
    } Pos;
    
    Pos * initializeStruct (int x1, int y1) {
        Pos * vars = new Pos();
        vars->x = x1 + 1;
        vars->y = y1 + 2;
        return vars;
    }
    
    bool func1(Pos *, int );
    
    int main(int argc, char ** argv) 
    {
        Pos *vars = new Pos();
        vars->x = 0;
        vars->y = 0;
    
        if (func1(vars, 0)) {
            return 1;
        }
        return 0;
    }
    
    bool func1(Pos *vars, int step) {
        if (step == 2) {
            return true;
        }
        func1(initializeStruct(vars->x, vars->y), step+1);
    
        printf("%d %d\n", vars->x, vars->y);
    
        return true;
    }
    

    【讨论】:

    • 请注意,您对标记为 C 的问题给出了仅 C++ 的答案。这不是非常有建设性的。 (另外,sn-p 标记对 C 或 C++ 代码没有帮助——不要在此类问题上使用它。)
    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多