从 C 中的函数返回元组

Posted

技术标签:

【中文标题】从 C 中的函数返回元组【英文标题】:Returning a tuple from a function in C 【发布时间】:2016-03-26 17:50:12 【问题描述】:

我需要一些提示来在 C 中实现这个算法。这是一个最大子数组问题。我制作了多项式时间程序和线性时间程序。我是 C 新手,所以我不知道如何从函数返回多个值,因为该算法需要它。例如算法中的这一行 (left-low,left-high,left-sum)=FIND-MAXIMUM-SUBARRAY(A,low,mid) 其中 FIND-MAX-SUBARRAY( A,low,mid)是递归函数调用。

这是 coremen 的算法:

下面我设置了全局变量 cross-low,cross-high,cross-sum 。我怎样才能为 left-low,left-high,left-sumright-low,right-high,right-sum 做同样的事情?

#include "max_subarray_common.h"
#define SENTINAL -3000

int left_low,left_high,left_sum;
int right_low,right_high,right_sum;
int cross_low,cross_high,cross_sum;


void max_crossing_subarray(int low,int mid,int high)

    int left_sum=SENTINAL;
    int sum=0;
    int max_left=low,max_right=high;
    for(int i=mid;i>=low;i--)
    
        sum=sum+change[i];
        if(sum>left_sum)
        
            left_sum=sum;
            max_left=i;
        
    
    int right_sum=0;
    sum=0;
    for(int j=mid+1;j<=high;j++)
    
        sum=sum+change[j];
        if(sum>right_sum)
        
            right_sum=sum;
            max_right=j;
        
    
    cross_low=max_left;
    cross_high=max_right;
    cross_sum=left_sum+right_sum;

这是我的头文件:

#ifndef max_subarray_h
#define max_subarray_h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

extern int price[];
extern int n;
extern int change[];
extern int from;
extern int to;
extern int max;


void init_change();
void max_subarray_poly();
void max_subarray_crossing();
void max_subarray_rec();
void max_crossing_subarray();

#endif

change[] 是要为其找到子数组的数组。我的输出也应该是这样的:

from=8
to=11
maximum profit=43

【问题讨论】:

您应该在问题文本中包含所有必需的信息。不要只是发布链接! 【参考方案1】:

您可以通过使用关键字“struct”定义一个结构来实现目标,该结构将包含您打算返回的三个变量。为此,请在 c 程序的 Header 部分添加结构定义。

typedef struct left   
  int left_low;  
  int left_high;
  int left_sum;
LEFT;

在你的 main(或你想使用它的地方)定义一个 LEFT 类型的变量 笔记。您的 FIND-MAXIMUM-SUBARRAY 的返回类型将为 LEFT。您还需要将变量“stleft”传递给您的 FIND-MAXIMUM-SUBARRAY 函数。

LEFT stleft;

为 stleft 分配内存

stleft = malloc(sizeof(LEFT));

将要返回的值分配给变量“stleft”

stleft.left_low = max_left;
stleft.left_high = max_left;
stleft.left_sum = left_sum + right_sum;

返回你的变量

return stleft;

在 stleft 中访问 left_low

int newvar1;
newvar1 = stleft.left_low;

更多帮助查找 C 结构

【讨论】:

cross 函数正确设置了全局变量 cross(cross_low,cross_high,cross_sum)。我必须为左右其他全局变量做这件事,以便我可以比较它们! 声明三个全局结构,一个用于'cross',一个用于'left',一个用于'right'。将结构传递给您的例程并返回修改后的结构。修改结构中的值,而不是修改全局变量cross_low等。祝你好运。 不要使用全局变量,它会伤害你的代码。要么传入一个指向已分配结果结构的指针,要么在函数中 malloc 一个结果结构并返回该指针。【参考方案2】:

函数为参数集计算 3 个不同的指标,有多种方式返回多个结果:

添加额外的参数,每个结果一个,作为指向int 的指针或任何更合适的类型。在返回完成代码之前,将结果间接存储到调用者已传递地址的变量中。

向函数添加一个额外的参数,一个指向每个结果一个成员的结构的指针,并在向调用者返回成功代码之前填充此结构。

按值返回这样的结构。这种方法在 C 中不那么惯用,因为它不是原始的 pre-Ansi C 规范的一部分。这是很久以前的事了,30 多年了,但它仍然被许多程序员所不齿。这种方法的另一个缺点是您不能轻易返回失败指示。从 OP 自己对该解决方案的使用可以看出,它会导致非常无效的编码实践。

为结果分配一个结构并将指针返回给调用者。您可以通过返回 NULL 来指示失败,但它比错误代码提供的信息更少。这个结构的生命周期很容易出错:如果不存储返回值,这个指针可能会丢失,一定要在适当的时候注意free它。

由于其他答案中解释的原因,通过全局变量返回此类结果绝对不是一个好的解决方案。上面的第二个选项是我推荐的。

【讨论】:

我真的认为,为了清楚起见,在这种情况下使用结构是比使用数组更好的选择,并且必须跟踪“哪个索引又意味着什么?”问题。 @BobJarvis:我同意 100%,我在 OP 包含代码之前回答了这个问题。让我改一下。

以上是关于从 C 中的函数返回元组的主要内容,如果未能解决你的问题,请参考以下文章

无法为元组列表中的数据返回无

如何在不停止递归的情况下返回递归函数中的值?

Python中的zip函数

元组函数的 Scala 返回类型

Python:返回特定范围内的矩阵值,范围以元组形式给出(从,到)

Python中的zip()与*zip()函数详解