简化C函数中的宏(动态分配的数组和MPI_Recv)

时间:2015-10-21 01:00:08

标签: c mpi

我在C中有一个函数(my_malloc只是一个包装器,可以测试分配是否可用):

#define MAXIMUM {                   \
    int value = 0;                  \
    for (int i = 0; i < n; i++) {   \
        if (value < (*numbers)[i]) {\
            value = (*numbers)[i];  \
        }                           \
    }                               \
    return value;                   \
}

int maximum1(int n, int **numbers) MAXIMUM;

int maximum2(int n, int (*numbers)[n]) MAXIMUM;

然后我这样称呼它(n在数组中的一些元素中):

int *numbers = my_malloc(n * sizeof(int *));
// array numbers is filled
int value = maximum1(n, &numbers);

int numbers[n];
// array numbers is filled
int value = maximum2(n, &numbers);

可以用它做些什么来使它更干净吗?我想只有一个最大功能。

以下是所有问题的开始:

int numbers[n]; 
//int *numbers = my_malloc(n * sizeof(int *)); 
// There is no way, I could find, to use dynamically allocated array...
// the pointer of numbers array changes after calling MPI_Recv...
// only a fixed array worked here, otherwise exactly two  
// elements are received all the time...meh 

//printf("address before: %p\n", numbers); 
MPI_Recv(numbers, n, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); 
//printf("address after: %p\n", numbers); //<-- changing when using malloc
value = maximum2(n, &numbers);


// Copying contents of the static array to dynamically allocated 
// one works (just maximum1 is required)
//int *numbers = my_malloc(n * sizeof(int *)); 
//for (i = 0; i < n; i++)  
    //numbers[i] = numbers_old[i]; 
//value = maximum1(n, &numbers);

未注释是当前的工作状态。这些评论提出了两个有效的解决方案:

  1. 创建固定数组并将其内容复制到动态分配的数组(然后只需要一个最大函数,但它是一个愚蠢的解决方案)
  2. 仅使用具有maximum2功能的固定数组
  3. 修改

    经过几个小时的头痛,它确实看起来神奇地工作,没有明显的变化,所以我不确定发生了什么......

    my_malloc功能:

    void *my_malloc(size_t size) {
        void *p = malloc(size);
        if (p == NULL) {
            printf("Memory allocation unsuccessful.\n");
            exit(EXIT_FAILURE);
        }   
        return p;
    }
    

1 个答案:

答案 0 :(得分:3)

首先,你的内存分配存在问题:假设my_malloc()只是,正如你所说,“测试分配是否成功的包装器”,那么你会期望像int *numbers = my_malloc(n * sizeof(int));这样的东西。 ,不像int *numbers = my_malloc(n * sizeof(int *));。前者是正确的,而后者(幸运)只能在sizeof(int) == sizeof(int*)的机器上工作。我觉得这会产生你所有的问题。

然后我不明白你为什么要创建这个繁琐的MAXIMUM宏和两个不同的函数maximum1()maximum2。这个单一功能会出现什么问题?

int maximum(int n, int *numbers) {
    int value = 0;
    for (int i = 0; i < n; i++) {
        if (value < numbers[i]) {
            value = numbers[i];
        }
    }
    return value;
}

如果动态或静态地分配numbers,这应该可以正常工作。

尝试修复这些问题,您将在获得更可靠的代码方面取得进展。

编辑:我忘了提到这个新的maximum()函数应该这样调用:

int numbers[n]; // works also with: int *numbers = my_malloc(n * sizeof(int));
int value = maximum(n, numbers);