”与XXX类型冲突,XXX的上一个声明在此“ 怎么解决啊【最大子数组有关问题算法】

”与XXX类型冲突,XXX的上一个声明在此“ 如何解决啊?【最大子数组问题算法】
本帖最后由 u010955432 于 2013-07-16 20:27:22 编辑
   这是最大子数组问题的一个C语言实现。采用分治策略实现。
   我看的是《算法导论》第四章的一个问题。第一节提到了分治的算法。我在网上查了下,发现有很多种解法。其中暴力解决的方法虽然有O(n^2)的时间复杂度,但是非常容易理解。然后又在《编程之美》上面发现了同样很好理解的,复杂度为O(n)的算法,很妙啊。
   但我想试着用递归实现,于是就按照书上的思路,几乎完全参考另一篇帖子,写下了下面代码。我把声明,函数实现部分,主函数分成了三个文件,分别是merge.h, merge.c, main.c, 代码贴在下面。一开始,我写在一个源文件里面,编译通过,可以得到正确结果。但是拆开后,就会有如标题所示的提示,怎么也调试不好。烦请经验丰富的高手帮我指点下。
   编译器是gcc。

//merge.h
#ifndef INT_MIN
#define INT_MIN (-((int)(~0U>>1))-1)
#endif

typedef struct {
int start;
int end;
int sum;
} subarray;

void find_max_subarray(int *, int, int, void *);
void find_max_cross_subarray(int *, int, int, int, void *);



//merge.c
#include <stdio.h>
#include <string.h>
#include "merge.h"

void find_max_cross_subarray(int *a, int low, int mid, int high, void *p)
{
subarray *sa = (typeof(sa))p;
int max_left, max_right;
int left_sum, right_sum;
int sum;
int i;

left_sum = INT_MIN;
sum = 0; 
for (i = mid; i >=low; i--) {
sum += a[i];

if (sum > left_sum) {
max_left = i;
left_sum = sum;
}
}

right_sum = INT_MIN;
sum = 0;
for (i = mid+1; i <= high-1; i++) {
sum += a[i];

if (sum > right_sum) {
max_right = i;
right_sum = sum;
}
}

sa->start = max_left;
sa->end = max_right;
sa->sum = left_sum + right_sum;
}

void find_max_subarray(int *a, int low, int high, void *p)
{
subarray *sa = (typeof(sa))p;
subarray *left_sa, _left_sa;
subarray *right_sa, _right_sa;
subarray *cross_sa, _cross_sa;
subarray *tmp;
int mid = (low + high) / 2;

if (low > high) {
fprintf(stderr, "Invalid argument.\n");
return;
}

memset(sa, 0, sizeof(*sa));

if (high == low) {
sa->sum = a[low];
sa->start = sa->end = low;