【问题标题】:Why can we not return a structure to a function?为什么我们不能将结构返回给函数?
【发布时间】:2017-03-31 12:56:11
【问题描述】:

为什么我们不能返回一个结构体作为返回值?我也想打印?我想打印返回结构的变量。

#include <stdio.h>

struct distance
{
    int feet;
    float inch;
};

distance add(struct distance d1,struct distance d2);

distance d3;
int main()
{
    struct distance dist1, dist2,dist3;
    printf("first distance\n");
    scanf("%d",&dist1.feet);
    scanf("%f",&dist1.inch);
    printf("second distance\n");
    scanf("%d",&dist2.feet);
    scanf("%f",&dist2.inch);
    dist3 = add(dist1,dist2);
    printf("sum of distances= %d\'-%.1f\"",dist3.feet,dist3.inch);
    return dist3;
}

 distance add(struct distance d1,struct distance d2){
    //Adding distances d1 and d2 and storing it in d3
    d3.feet = d2.feet+d1.feet;
    d3.inch = d2.inch+d1.inch;
    if(d3.inch>12){
        d3.inch-=12;
        ++d3.feet;
    }
}

显示以下错误信息 prog.c:7:1:错误:未知类型名称“距离” distance add(struct distance d1,struct distance d2);

【问题讨论】:

  • 我相信你可以做到这一点。但是出于某种原因,您不是 return 来自 add 的任何东西......
  • typedef 'distance' 结构体。
  • 你应该启用编译器警告。
  • add 的返回类型不正确。你应该有:struct distance add(struct distance d1,struct distance d2);。在没有typedef 的情况下,struct distance 的类型是struct distance
  • 是的,我试过了!它没有

标签: c function structure


【解决方案1】:

是的,你当然可以返回一个结构,但你必须使用return 语句实际返回它:

struct distance add(struct distance d1, struct distance d2)
{
  d1.feet += d2.feet;
  d1.inches += d2.inches;
  while(d1.inches > 12)
  {
    ++d1.feet;
    d1.inches -= 12;
  }
  return d1;  /* Return the result. */
}

创建d3(当然不是全局的!)也没有意义,只需使用其中一个参数作为新值,然后使用return

使用循环来调整溢出更好,所以我也这样做了。

最后,typedef 不是 struct distance,所以你不能只说 distance 作为返回类型,它必须像参数一样是 struct distance

【讨论】:

  • 对不起,如果我返回 dist3 结构,它会显示错误 Compilation error time: 0 memory: 10320 signal:0 prog.c:7:1: error: unknown type name '距离'距离添加(结构距离d1,结构距离d2)
  • 好吧,也许您可​​以将错误消息添加到问题中??
  • 您似乎错过了距离之前的“结构”。也许你应该只输入定义“距离”。在顶部,并在所有地方完成所有那些“结构”..
  • @jenny 请阅读我回答中的最后一段,我在其中解决了这个问题。这也是我的答案代码中不存在的错误。
【解决方案2】:

你需要退货

distance add(struct distance d1,struct distance d2){
    struct distance d3;

    //Adding distances d1 and d2 and storing it in d3
    d3.feet = d2.feet+d1.feet;
    d3.inch = d2.inch+d1.inch;
    if(d3.inch>12){
        d3.inch-=12;
        ++d3.feet;
    }
    return d3;
}

【讨论】:

    【解决方案3】:

    解决此错误消息:

    prog.c:7:1: error: unknown type name ‘distance’ distance add(struct distance d1,struct distance d2)

    您需要意识到struct distancedistance 类型之间存在差异。它们不一样。

    仅考虑:

    struct distance
    {
        int feet;
        float inch;
    };
    

    这是不正确的,因为有 no distance 类型:

    distance add(struct distance d1,struct distance d2);
    

    该代码假定distance 是一种类型。它不是。正确的类型是struct distance

    struct distance add(struct distance d1,struct distance d2);
    

    也可以使用typedef 解决这个问题:

    typedef struct distance
    {
        int feet;
        float inch;
    } distance;
    

    就我个人而言,我不喜欢以这种方式隐藏类型 - 我宁愿看到 struct distance 之类的东西并知道它是 struct

    【讨论】:

      【解决方案4】:
      #include<stdio.h>
      
      struct distance
      {
          int feet;
          float inch;
      };
      
      struct distance d1,d2,d3;
      
      struct distance add(struct distance d1, struct distance d2);
      
      
      int main()
      {
          struct distance dist1, dist2,dist3;
          printf("first distance\n");
          scanf("%d",&dist1.feet);
          scanf("%f",&dist1.inch);
          printf("second distance\n");
          scanf("%d",&dist2.feet);
          scanf("%f",&dist2.inch);
          dist3 = add(dist1,dist2);
          printf("sum of distances= %d\'-%.1f\"",dist3.feet,dist3.inch);
      
      }
      
       struct distance add(struct distance d1,struct distance d2){
          //Adding distances d1 and d2 and storing it in d3
          d3.feet = d2.feet+d1.feet;
          d3.inch = d2.inch+d1.inch;
          while(d3.inch>12){
              d3.inch-=12;
              ++d3.feet;
              return d3;
          }
      }
      

      是的,明白了!这是以下输入的最终输出 输入:
      11
      2.3 11 10 这是输出: 距离总和= 23'-0.3"

      【讨论】:

      • 定义全局变量d1d2d3不是个好主意;忽略d1d2 不是一个好主意;在add() 函数中使用d3 是不必要的; add() 函数中的 return 放错了位置(它应该在循环之外)。可能还有其他问题。
      【解决方案5】:
      typedef struct
      {
          int feet;
          float inch;
      } distance;
      

      然后摆脱其他地方的“结构”声明......

      注意:非常感谢@Lundin 的更正:)

      【讨论】:

      • typef struct distance { int feet; float inch; }d1,d2,d3; distance add(distance d1, distance d2);
      • 这是错误的,应该是typedef struct { int feet; float inch; } distance; 或者在整个代码中输入struct distance
      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2019-01-08
      • 2015-11-28
      相关资源
      最近更新 更多