首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C中的函数返回元组

从C中的函数返回元组
EN

Stack Overflow用户
提问于 2015-12-20 15:10:12
回答 2查看 1.4K关注 0票数 0

我需要一些提示来实现这个算法在C。这是一个最大子阵问题。我编制了多项式时间程序和线性时间程序。我对C很陌生,所以我不知道如何根据这个算法的要求从一个函数返回多个值。例如,算法(左-低,左-高,左-和)=查找-最大值-SUBARRAY(A,low,mid)中的这一行,其中FIND-MAX-SUBARRAY(A,low,mid)是一个递归函数调用。

这是核心人员的算法:

下面我设置了全局变量交叉低,交叉高,交叉和。我怎样才能对左-低,左-高,左-和-右-低,右-高,右和做同样的事情?

代码语言:javascript
复制
#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;
}

这是我的头文件:

代码语言:javascript
复制
#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[]是要为其查找子数组的数组。而且,我的输出应该如下所示:

代码语言:javascript
复制
from=8
to=11
maximum profit=43
EN

回答 2

Stack Overflow用户

发布于 2015-12-20 15:50:48

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

代码语言:javascript
复制
typedef struct left {  
  int left_low;  
  int left_high;
  int left_sum;
}LEFT;

定义一个变量,类型留在您的主(或您想使用它的地方)注意。返回类型的查找-最大值-SUBARRAY将留下。您还需要将变量‘st左侧’传递给查找-最大值-SUBARRAY函数。

代码语言:javascript
复制
LEFT stleft;

将内存分配给st左侧

代码语言:javascript
复制
stleft = malloc(sizeof(LEFT));

将要返回的值赋值给变量“st左侧”

代码语言:javascript
复制
stleft.left_low = max_left;
stleft.left_high = max_left;
stleft.left_sum = left_sum + right_sum;

返回变量

代码语言:javascript
复制
return stleft;

在st左侧访问left_low

代码语言:javascript
复制
int newvar1;
newvar1 = stleft.left_low;

有关查找C结构的更多帮助

票数 4
EN

Stack Overflow用户

发布于 2015-12-20 15:32:51

该函数为参数集计算3个不同的指示符,有多种方法返回多个结果:

  • 添加额外的参数,为每个结果添加一个参数,作为指向int或其他更合适类型的指针。在返回完成代码之前,将结果间接存储到其地址已由调用方传递的变量中。
  • 向函数添加一个额外的参数,指向每个结果都有一个成员的结构,并在向调用方返回成功代码之前填充该结构。
  • 按值返回这样的结构。这种方法在C中不那么惯用,因为它不是以前Ansi C规范的一部分。这是很久以前的事了,30多年了,但许多程序员仍然对此不屑一顾。此方法的另一个缺点是无法轻松返回故障指示。从OP本身对该解决方案的使用可以看出,它可能导致非常无效的编码实践。
  • 为结果分配一个结构,并将指针返回给调用者。您可能会通过返回NULL来指示失败,但它比错误代码所提供的信息少。此结构的生命周期容易出错:如果返回值未被存储,则此指针可能丢失,必须在适当的时间注意free

通过全局变量返回这样的结果肯定不是一个好的解决方案,原因在其他答案中解释过。上述第二个方案是我建议的方案。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34382393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档