简化 C 函数中的宏(动态分配的数组和 MPI_Recv)
Simplifying macro in C function (dynamically allocated array and MPI_Recv)
我有一个 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);
未注释的为当前工作状态。评论提出了两个可行的解决方案:
- 创建固定数组并将其内容复制到动态分配的数组(然后只需要一个最大函数,但这是一个愚蠢的解决方案)
- 仅使用具有 maximum2 函数的固定数组
编辑
经过几个小时的头痛后,它确实神奇地正常工作,没有明显的变化,所以我不确定发生了什么....
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;
}
首先,您的内存分配有问题:假设 my_malloc()
正如您所说的 "a wrapper with testing if the allocation was successful",那么您会期望 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);
我有一个 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);
未注释的为当前工作状态。评论提出了两个可行的解决方案:
- 创建固定数组并将其内容复制到动态分配的数组(然后只需要一个最大函数,但这是一个愚蠢的解决方案)
- 仅使用具有 maximum2 函数的固定数组
编辑
经过几个小时的头痛后,它确实神奇地正常工作,没有明显的变化,所以我不确定发生了什么....
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;
}
首先,您的内存分配有问题:假设 my_malloc()
正如您所说的 "a wrapper with testing if the allocation was successful",那么您会期望 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);