gpt4 book ai didi

c - 如何在 c 中的未知类型数组中查找最大元素(使用指向函数的指针)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:35 25 4
gpt4 key购买 nike

我正在尝试编写一个通用函数,它获取任何类型的数组(intfloatstring)并返回它是最大元素(如果它是一个字符串数组 - 然后是字典编排)。我设法编译了它,但是当我运行它时,我得到了 segmentation fault (core dumped)。谁能告诉我我的代码有什么问题?

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

void *maxElement(void **arr, int size, int(*comp)(void*, void*)) {
int i = 0;
void *max = NULL;

for (i = 0; i < size; i++) {
if (comp(arr[i], arr[i + 1])) {
max = (void*)arr[i];
} else
max = (void*)arr[i + 1];
}
return (void*)max;
}

int compareInt(void *a, void *b) {
int *temp_a = (int*)a, *temp_b = (int*)b;

if (*temp_a > *temp_b)
return 1;
return 0;
}

int main() {
int i;
int *result = 0;
int array[4] = { 1, 3, 7, 0 };
float array_f[4] = { 1.23, 6.57, 9.89, 11.56 };
float result_f = 0;
char string[5][6] = { "jess", "ron", "tom", "mia", "alex" };
char answer[6];

result = (int*)maxElement((void*)array, 4, &compareInt);
printf("result: %d\n", *result);
return 0;
}

最佳答案

您走在正确的轨道上。以下是您的代码中缺少的一些部分:

  • 数组参数的类型应该是void*,而不是void**

  • maxElement 函数应该获取元素的数量元素的大小,例如qsort()

  • maxElement 函数有缺陷:它找不到最大值并访问数组末尾之后的元素。

这些是可选的,但建议更改:

  • 数组参数应该是 const 限定的,因为您没有修改它。

  • 您应该返回元素索引以避免不必要的转换,并且所有索引和大小变量的类型都应为 size_t

  • 为了与qsortbsearch 保持一致,比较函数应该采用const void* 参数并返回0 对于比较相等的元素,如果第一个参数小于第二个参数则为负值,否则为非零正值。

对应的代码如下:

#include <stdio.h>
#include <string.h>

size_t maxElement(const void *arr, size_t count, size_t size,
int(*comp)(const void*, const void*)) {
size_t i, res = 0;
const unsigned char *p1 = arr;
const unsigned char *p2 = p1 + size;

for (i = 1; i < count; i++, p2 += size) {
if (comp(p1, p2) < 0) {
p1 = p2;
res = i;
}
}
return res;
}

int compareInt(const void *p1, const void *p2) {
const int *i1 = p1, *i2 = p2;
return (*i1 > *i2) - (*i1 < *i2);
}

int compareFloat(const void *p1, const void *p2) {
const float *f1 = p1, *f2 = p2;
return (*f1 > *f2) - (*f1 < *f2);
}

int compareChars(const void *p1, const void *p2) {
const char *s1 = p1, *s2 = p2;
return strcmp(s1, s2);
}

int compareString(const void *p1, const void *p2) {
const char * const *s1 = p1;
const char * const *s2 = p2;
return strcmp(*s1, *s2);
}

int main(void) {
size_t result;
int array[4] = { 1, 3, 7, 0 };
float array_f[4] = { 1.23, 6.57, 9.89, 11.56 };
char array_s[5][6] = { "jess", "ron", "tom", "mia", "alex" };
const char *array_str[5] = { "jess", "ron", "tom", "mia", "alex" };

result = maxElement(array, sizeof(array) / sizeof(*array),
sizeof(*array), compareInt);
printf("int result: %d\n", array[result]);

result = maxElement(array_f, sizeof(array_f) / sizeof(*array_f),
sizeof(*array_f), compareFloat);
printf("float result: %f\n", array_f[result]);

result = maxElement(array_s, sizeof(array_s) / sizeof(*array_s),
sizeof(*array_s), compareChars);
printf("string result: %s\n", array_s[result]);

result = maxElement(array_str, sizeof(array_str) / sizeof(*array_str),
sizeof(*array_str), compareString);
printf("string result: %s\n", array_str[result]);

return 0;
}

请注意 array_sarray_str 之间的区别,array_s 是一个定长字符数组数组,一个字符串指针数组。它们需要不同的比较功能。

关于c - 如何在 c 中的未知类型数组中查找最大元素(使用指向函数的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45152411/

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