c - 无法在 C 中返回正确的变量
问题描述
我想尝试使用 C 编写 Kadane 算法。我不仅想返回最大子数组值,还想返回开始和结束索引。
这是代码:
#include <limits.h>
#include <stdio.h>
int kadane(int A[], int size){
int current_max = INT_MIN;
int global_max = INT_MIN;
int start, last;
for (int i = 0; i <= size; i++){
if (A[i] > A[i] + current_max){
current_max = A[i];
start = i;
} else {
current_max += A[i];
};
if (current_max >= global_max){
global_max = current_max;
last = i;
};
};
return (start, last ,global_max);
}
int main(){
int sum, size, start, last;
int A[] = {3,-4,5,1,9,-10,11,2,5,-1,2};
size = sizeof(A)/sizeof(A[0]);
start, last, sum = kadane(A, size-1);
printf("start at %d ; end at %d; sum : %d\n", start, last, sum);
return 0;
}
虽然最大和的答案是对的,但是 start 和 last 的值真的很奇怪。我在 kadane 函数的 for 循环中使用 printf 检查 start 和 last 的值,它似乎在那里工作正常。所以我认为这个问题可能与我返回变量的方式有关。
所以我修改了部分代码,如下所示:
int kadane(int A[], int size){
......
......
return (&start, &last ,global_max);
}
然后使用指针来存储它们:
int main(){
.......
.......
int *start;
int *last;
*start, *last, sum = kadane(A, size-1);
printf("start at %d ; end at %d; sum : %d\n", *start, *last, sum);
return 0;
}
然后我收到“Segmentation Fault 11”错误。
我试图理解和搜索我在这里做错了什么,但我找不到它。唯一可行的解决方案是将变量 start 和 last 存储在全局中,这样我就可以在任何地方调用而无需返回。但我觉得这样不是一个合适的解决方案。有人能帮我一下吗?
解决方案
你有两个解决方案:
1:返回一个包含您需要的所有类型的结构。
struct data {
int start;
int last;
int global_max;
};
struct data kadane(int A[], int size){
stuct data test = { 1, 1, 1 };
......
......
return test;
}
void main() {
......
struct data t = kadane(A, ize);
}
2:使用指针传递值。
void kadane(int A[], int size, int *start, int *last, int *global_max) {
......
......
*start = 1;
*last= 1;
*global_max= 1;
}
void main() {
......
int a, b, c;
kadane(A, size, &a, &b, &c);
}
推荐阅读
- powershell - PowerShell ISE 中的 XAML 代码在 Visual Studio Code 中不起作用
- jupyter-notebook - 使用 Google Colab 通过 HTTPS 连接到远程 Jupyter 运行时
- grid - 使用 grid.arrange 为使用 gridExtra::grid.arrange 制作的多个绘图添加标题
- jenkins - 如何将自定义 HTML+js 代码传递到 Jenkins 输入步骤页面?
- batch-file - Batch / REG QUERY 获取找到值的路径
- ionic-framework - Alert Controller - css button
- nativescript - 最新 Sidekick 更新导致 VBoxManage 失败退出代码 126
- php - Symfony 4 外部登录检查
- node.js - 节点快递 cookie 未设置
- ruby - Vagrant:Ruby 脚本返回最后创建的文件的名称