gpt4 book ai didi

c - 具有静态结构返回类型的最大子数组

转载 作者:行者123 更新时间:2023-11-30 16:43:12 25 4
gpt4 key购买 nike

我制作了最大子数组算法,但似乎有问题。由于 C 不能返回多个值,因此函数“maxarr”或“maxcarr”应该在静态结构“rettype”中返回三个值(起始索引、结束索引及其总和)。然而,这些返回值似乎是相同的(我检查了它的内存地址,都是相同的)。我认为发生错误是因为静态类型变量仅声明一次并且不会初始化多次,但我不知道如何纠正它。

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

struct rettype
{
int a;
int b;
int c;
};

struct rettype* maxarr(int i, int j, int* array);
struct rettype* maxcarr(int i, int j, int* array);
int main(void)
{
int array[20];
int temp = 0;
int num = 0;
int len = 0;
struct rettype* ret;
printf("Type length in.\n");
scanf("%d", &len);
while (num<len)
{
printf("%dth element: ", num);
scanf("%d", &array[num]);
num++;
}
ret = maxarr(1, len, array);
printf("Maximum Subarray:\nfrom element %d to element %d with sum of %d\n", ret->a, ret->b, ret->c);
return 0;
}

struct rettype* maxarr(int i, int j, int* array)
{
static struct rettype retb;
static struct rettype ret;
struct rettype* fretr;
struct rettype* fretc;
struct rettype* fretl;
int hi=j;
int mid;
int low=i;
mid = ((hi + low) / 2);
if (i == j) {//base case
retb.a = i;
retb.b = j;
retb.c = *(array + i);
return &retb;
}
fretl = maxarr(i, mid, array);
fretr = maxarr(mid+1, j, array);
fretc = maxcarr(i, j, array);
if (fretl->c>fretr->c && fretl->c>fretc->c)
{
ret.a = fretl->a;
ret.b = fretl->b;
ret.c = fretl->c;
return &ret;
}
else if (fretr->c>fretl->c && fretr->c>fretc->c)
{
ret.a = fretr->a;
ret.b = fretr->b;
ret.c = fretr->c;
return &ret;
}
else
{
ret.a = fretc->a;
ret.b = fretc->b;
ret.c = fretc->c;
return &ret;
}
}
struct rettype* maxcarr(int i, int j, int* array)
{
int mid = (i + j) / 2;
static struct rettype ret;
int a = mid;
int b = mid+1;
int risum = -9999;
int lesum = -9999;
int sum = 0;
while (a-->i)
{
sum += *(array + a);
if (sum>lesum)
{
lesum = sum;
}
}
sum = 0;
while (b++<j)
{
sum += *(array + b);
if (sum>risum)
{
risum = sum;
}
}
sum = 0;
ret.a = a;
ret.b = b;
ret.c = risum + lesum;
return &ret;
}

最佳答案

您正在使用一个静态变量,从中获取地址以返回给调用者。

在这种情况下,您将为返回值共享相同的内存区域,而不是创建单独的内存区域。

为什么不返回结构体的(C 不能返回数组,但幸运的是可以返回结构体):

struct rettype maxcarr(int i, int j, int* array)
{
int mid = (i + j) / 2;
struct rettype ret;
...
return ret;
}

(并为返回时复制的自动变量删除static)

请注意,您必须将此模式应用到您的所有例程中。

关于c - 具有静态结构返回类型的最大子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com