从 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-sum 和 right-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 中的函数返回元组的主要内容,如果未能解决你的问题,请参考以下文章