【问题标题】:returning multiple values from a function [duplicate]从函数返回多个值[重复]
【发布时间】:2011-04-19 06:06:00
【问题描述】:

谁能告诉我如何从一个函数返回多个值?
请举例说明?

【问题讨论】:

  • 为了将来参考,这是 How do I return multiple values from a function in C? 的过于广泛的重复,用于“返回可能异构类型的固定计数”案例。与这个问题重复的许多问题实际上应该与那个问题重复。
  • @AnttiHaapala:没有标签徽章,所以我不能亲自做,但这是有道理的。我已经投票了,但需要更多的选票。如果你有锤子,你可能会检查链接的问题并将真正应该去其他地方的重复重定向。
  • @ShadowRanger 完成。

标签: c


【解决方案1】:

您在这里的选择是返回一个包含您喜欢的元素的结构,或者使函数使用指针来处理参数。

/* method 1 */
struct Bar{
    int x;
    int y;
};

struct Bar funct();
struct Bar funct(){
    struct Bar result;
    result.x = 1;
    result.y = 2;
    return result;
}

/* method 2 */
void funct2(int *x, int *y);
void funct2(int *x, int *y){
    /* dereferencing and setting */
    *x  = 1;
    *y  = 2;
}

int main(int argc, char* argv[]) {
    struct Bar dunno = funct();
    int x,y;
    funct2(&x, &y);

    // dunno.x == x
    // dunno.y == y
    return 0;
}

【讨论】:

  • 将原型直接放在函数定义之前没有多大意义...
【解决方案2】:

你不能直接这样做。您的选择是将多个值包装到一个结构中,或者将它们作为指针参数传递给函数。

例如

typedef struct blah
{
    int a;
    float b;
} blah_t;


blah_t my_func()
{
    blah_t blah;
    blah.a = 1;
    blah.b = 2.0f;
    return blah;
}

或:

void my_func(int *p_a, float *p_b)
{
    *p_a = 1;
    *p_b = 2.0f;
}

【讨论】:

    【解决方案3】:

    首先,退后一步,问问为什么需要返回多个值。如果这些价值观彼此之间没有某种关联(无论是在功能上还是在操作上),那么您需要停下来重新考虑您在做什么。

    如果各种数据项是更大的复合数据类型的一部分(例如邮寄地址,或销售订单中的行项目,或由多个属性描述的其他类型),则定义一个结构类型来表示该复合类型的单个值

    struct addr { // struct type to represent mailing address
      char *name;
      int streetNumber;
      char *streetName;
      char *unitNumber; 
      char *city;
      char state[3];
      int ZIP;
    };
    
    struct addr getAddressFor(char *name) {...}
    
    struct point2D {
      int x;
      int y;
    };
    
    struct polygon2D {
      size_t numPoints;
      struct point2D *points;
    };
    
    struct point2D getOrigin(struct polygon2D poly) {...}
    

    不要定义一个结构来收集彼此不相关的随机项目;这只会让你和任何需要维护你的代码的人感到困惑。

    如果数据项在功能上不相关,但在某种程度上在操作上相关(例如,数据加上状态标志加上关于操作或作为单个输入操作的一部分的项的元数据),那么使用多个可写参数。最明显的例子是标准库中的*scanf() 函数。还有strtod()strtol() 函数,它们转换数字的字符串表示形式;它们返回转换后的值,但也将未转换的第一个字符写入单独的参数:

    char *str = "3.14159";
    double value;
    char *chk;
    
    value = strtod(str, &chk);
    if (!isspace(*chk) && *chk != 0)
      printf("Non-numeric character found in %s\n", str);
    

    您可以结合使用这些方法;这是一个受我目前正在做的工作启发的例子:

    typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status;
    
    typedef struct bounds {...} Bounds; 
    
    tyepdef struct metadata {
      size_t bytesRead;
      size_t elementsRead;
      size_t rows;
      size_t cols;
    } Metadata;
    
    typedef struct elevations {
      size_t numValues;
      short *elevations;
    } Elevations;
    
    Elevations elevs;
    Metadata meta;
    Bounds b = ...; // set up search boundary
    
    Status stat = getElevationsFor(b, &elevs, &meta);
    

    我请求高程数据的服务返回一维值序列;数组的维度作为元数据的一部分返回。

    【讨论】:

      【解决方案4】:

      您可以使用结构来做到这一点:

      #include <stdio.h>
      
      struct dont { int x; double y; };
      
      struct dont fred(void)
      {
              struct dont b;
              b.x = 1;
              b.y = 91.99919;
              return b;
      }
      
      int main(int argc, char **argv)
      {
              struct dont look = fred();
              printf("look.x = %d, look.y = %lf\n", look.x, look.y);
              return 0;
      }
      

      【讨论】:

      • +1 尽可能使用自变量来显示问题的所有单独部分,并发布整个程序
      【解决方案5】:

      您不能从 C 函数返回多个值。 你可以

      1. 返回具有多个值的数据结构,如结构或数组。
      2. 将指针传递给函数并修改函数内部指针的值。您需要传递 x 个指针,其中 x 是您需要的返回值的数量

      【讨论】:

      • 函数不能返回数组,只能返回结构体(结构体的字段之一可以是数组)。
      • 你可以传递一个指向数组的指针并修改内容
      • 您可以返回一个指向数组的指针,尽管这不是非常常见或有用的 IME。
      【解决方案6】:

      要从函数返回多个值,我们应该使用指针。这是一个例子,你可以通过它更好地理解它

      int* twoSum(int* nums, int numsSize, int target) {
      
      int i,j,*a;
      a=(int*)malloc(2*sizeof(int));
      for(i=0;i<numsSize;i++)
      for(j=i+1;j<numsSize;j++)
      if(nums[i]+nums[j]==target)
       {
           a[0]=i;
           a[1]=j;
       return a;
       }
      

      }

      【讨论】:

        【解决方案7】:

        我是 C 的初学者,所以我没有使用数组、指针和结构的经验。为了从我的函数中获取多个值,我只使用了一个全局变量。

        这是我的代码:

        #include <stdio.h>
        
        double calculateCharges( double hourCharges );
        
        // Global variable for totalCharges-function and main-function interaction
        double totalCharges = 0;
        
        int main ( void ) {
        
            double car1 = 0;
            double car2 = 0;
            double car3 = 0;
            double totalHours = 0;
        
            printf( "%s", "Hours parked for Car #1: ");
            scanf( "%lf", &car1 );
        
            printf( "%s", "Hours parked for Car #2: ");
            scanf( "%lf", &car2 );
        
            printf( "%s", "Hours parked for Car #3: ");
            scanf( "%lf", &car3 );
        
            totalHours = car1 + car2 + car3;
        
            printf( "%s", "Car\tHours\tCharge\n");
        
            printf( "#1\t%.1f\t%.2f\n", car1, calculateCharges( car1 ));
            printf( "#2\t%.1f\t%.2f\n", car2, calculateCharges( car2 ));
            printf( "#3\t%.1f\t%.2f\n", car3, calculateCharges( car3 ));
            printf( "TOTAL\t%.1f\t%.2f\n", totalHours, totalCharges);
        }
        
        double calculateCharges( double hourCharges ) {
        
            double charges = 0; 
        
            if( hourCharges <= 3.0 ) {
                charges = 2;
            } else if ( hourCharges >= 24.0) {
                charges = 10.00;
            } else {
                charges = ((hourCharges - 3.0)*0.5) + 2.0;
            }
        
            totalCharges += charges;
        
            return charges;
        
        }
        

        【讨论】:

        • 如果这行得通,太好了!继续你的快乐方式,不要理我。但是,如果您想听,请不要使用全局变量!这意味着如果您使用该名称调用变量并且没有意识到它已被占用,或者您有两个函数都借用该变量等,您可能会得到令人讨厌的结果......有更好的方法来解决手头的问题,我建议你学习它们。
        • 几年后,我不得不告诉你@Stegosaurus,你是对的
        【解决方案8】:

        方法一是使用数组

        方法二是使用指针

        方法3是使用结构

        【讨论】:

        • C 中不能返回数组,所以选择 2 和 3。
        猜你喜欢
        • 2015-07-07
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2019-09-17
        相关资源
        最近更新 更多