C 从函数返回多个值

C 从函数返回多个值,c,C,有人能告诉我如何从函数返回多个值吗? 请举例说明?你不能直接这么做。您可以选择将多个值包装到一个结构中,或者将它们作为指针参数传递给函数 e、 g 或: 你不能直接这么做。您可以选择将多个值包装到一个结构中,或者将它们作为指针参数传递给函数 e、 g 或: 您在这里的选择是返回一个包含您喜欢的元素的结构,或者使函数使用指针处理参数 /* method 1 */ struct Bar{ int x; int y; }; struct Bar funct(); struct Bar

有人能告诉我如何从函数返回多个值吗?

请举例说明?

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

e、 g

或:


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

e、 g

或:


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

/* 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;
}

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

/* 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;
}

您可以使用以下结构执行此操作:

#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;
}
#包括
结构不{intx;double y;};
结构(无效)
{
结构b;
b、 x=1;
b、 y=91.99919;
返回b;
}
int main(int argc,字符**argv)
{
struct don look=fred();
printf(“look.x=%d,look.y=%lf\n”,look.x,look.y);
返回0;
}

您可以使用以下结构进行操作:

#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;
}
#包括
结构不{intx;double y;};
结构(无效)
{
结构b;
b、 x=1;
b、 y=91.99919;
返回b;
}
int main(int argc,字符**argv)
{
struct don look=fred();
printf(“look.x=%d,look.y=%lf\n”,look.x,look.y);
返回0;
}

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

  • 返回具有多个值的数据结构,如结构或数组。
  • 将指针传递给函数并修改函数中指针的值。您需要传递x个指针,其中x是您需要的返回值的数量
    不能从C函数返回多个值。 你也可以

  • 返回具有多个值的数据结构,如结构或数组。
  • 将指针传递给函数并修改函数中指针的值。您需要传递x个指针,其中x是您需要的返回值的数量
    首先,后退一步,询问为什么需要返回多个值。如果这些价值观在某种程度上彼此不相关(无论是功能上还是操作上),那么你需要停下来重新思考你在做什么

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

    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);
    

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

    首先,后退一步,询问为什么需要返回多个值。如果这些价值观在某种程度上彼此不相关(无论是功能上还是操作上),那么你需要停下来重新思考你在做什么

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

    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);
    

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

    方法1使用数组

    方法2使用指针


    方法3使用结构

    方法1使用数组

    方法2使用指针


    方法3使用结构

    我是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;
    
    }
    
    #包括
    双倍计算费用(双倍小时费用);
    //totalCharges函数和主函数交互的全局变量
    双重总费用=0;
    内部主(空){
    双car1=0;
    双car2=0;
    双car3=0;
    双倍总小时=0;
    printf(“%s”,“停车时间为1:”);