函数中错误的最小和最大分配
False min and max assignments in function
我有一个函数应该使用结构在数组中找到最小值和最大值。
但不知何故,该函数将错误的值分配给最小和最大变量。有人可以解释我哪里有错误吗?非常感谢你。 P.S。在我的作业中,函数不需要取数组的第一个元素
min_max_t min_max(unsigned int *array, int size)
{
min_max_t flag;
flag.min = array[1];
flag.max = array[1];
printf("Flag.min: %d | ", flag.min);
printf("Flag.max: %d\n", flag.max);
for (int i = 1; i < size; i++)
{
printf("i = %d - [A:%d - Min:%d - Max:%d]\n", i, array[i], flag.min, flag.max);
if(array[i] > flag.max)
{
flag.max = array[i];
}
else if (array[i] < flag.min)
{
flag.min = array[i];
}
printf("i = %d - [A:%d - Min:%d - Max:%d]\n\n", i, array[i], flag.min, flag.max);
}
return flag;
}
Screenshot of function process
对于初学者来说,函数应该这样声明
min_max_t min_max( const unsigned int *array, size_t size );
和结构 min_max_t 应该包含两个数据成员,它们将存储索引到最小和最大元素。例如
typedef struct min_max_t
{
size_t min;
size_t max;
} min_max_t;
否则,当用户作为第二个参数 0 传递时,函数可能会调用未定义的行为。
数组中的索引从 0 开始。因此您在函数中跳过了传递数组的第一个元素。
由于数组具有 unsigned int
类型的元素,因此表达式 -1
被隐式转换为 unsigned int
类型的最大值。因此,您需要决定是否确实要处理无符号整数数组或有符号整数数组。
在 printf
的调用中使用转换说明符 %d
而不是 %u
来输出类型为 unsigned int 的对象,如果对象的值确实如此,则可以调用未定义的行为不适合 int 类型的对象。
因此您的函数可以如下所示
typedef struct min_max_t
{
size_t min;
size_t max;
} min_max_t;
min_max_t min_max( const unsigned int *array, size_t size )
{
min_max_t flag = { .min = 0, .max = 0 };
printf( "Flag.min: %zu | ", flag.min );
printf( "Flag.max: %zu\n", flag.max );
for ( size_t i = 1; i < size; i++ )
{
printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n", i, array[i], array[flag.min], array[flag.max] );
if ( array[flag.max] < arra[i] )
{
flag.max = i;
}
else if ( array[i] < array[flag.min] )
{
flag.min = i;
}
printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n\n", i, array[i], array[flag.min], array[flag.max] );
}
return flag;
}
寻找最小值和最大值的逻辑没有错。
您的代码的问题是您使用 %d
打印 unsigned int。打印 unsigned int 值时使用 %u
.
您可能考虑处理的另一个问题是函数参数 size
的非法值。您的函数要求 size
至少为 2。为避免未定义的行为,您可能需要检查它。
例如,您可以在函数的开头添加
assert(size >= 2);
或
if (size < 2)
{
// return some suitable value
}
也就是说,您也可以只记录要求 size
至少为 2 的函数。在 C 语言中,为函数设置此类契约要求并不少见。几个 stdlib 函数有这样的要求。
顺便说一句:如果您添加 size
检查,您可能还应该检查 array
是否为 NULL。
顺便说一句:您的屏幕截图表明您向函数传递了一个 int 数组。如果这是真的,那么你的调用者代码中就有一个错误。不要将 int 数组传递给需要 unsigned int 数组的函数。
我有一个函数应该使用结构在数组中找到最小值和最大值。 但不知何故,该函数将错误的值分配给最小和最大变量。有人可以解释我哪里有错误吗?非常感谢你。 P.S。在我的作业中,函数不需要取数组的第一个元素
min_max_t min_max(unsigned int *array, int size)
{
min_max_t flag;
flag.min = array[1];
flag.max = array[1];
printf("Flag.min: %d | ", flag.min);
printf("Flag.max: %d\n", flag.max);
for (int i = 1; i < size; i++)
{
printf("i = %d - [A:%d - Min:%d - Max:%d]\n", i, array[i], flag.min, flag.max);
if(array[i] > flag.max)
{
flag.max = array[i];
}
else if (array[i] < flag.min)
{
flag.min = array[i];
}
printf("i = %d - [A:%d - Min:%d - Max:%d]\n\n", i, array[i], flag.min, flag.max);
}
return flag;
}
Screenshot of function process
对于初学者来说,函数应该这样声明
min_max_t min_max( const unsigned int *array, size_t size );
和结构 min_max_t 应该包含两个数据成员,它们将存储索引到最小和最大元素。例如
typedef struct min_max_t
{
size_t min;
size_t max;
} min_max_t;
否则,当用户作为第二个参数 0 传递时,函数可能会调用未定义的行为。
数组中的索引从 0 开始。因此您在函数中跳过了传递数组的第一个元素。
由于数组具有 unsigned int
类型的元素,因此表达式 -1
被隐式转换为 unsigned int
类型的最大值。因此,您需要决定是否确实要处理无符号整数数组或有符号整数数组。
在 printf
的调用中使用转换说明符 %d
而不是 %u
来输出类型为 unsigned int 的对象,如果对象的值确实如此,则可以调用未定义的行为不适合 int 类型的对象。
因此您的函数可以如下所示
typedef struct min_max_t
{
size_t min;
size_t max;
} min_max_t;
min_max_t min_max( const unsigned int *array, size_t size )
{
min_max_t flag = { .min = 0, .max = 0 };
printf( "Flag.min: %zu | ", flag.min );
printf( "Flag.max: %zu\n", flag.max );
for ( size_t i = 1; i < size; i++ )
{
printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n", i, array[i], array[flag.min], array[flag.max] );
if ( array[flag.max] < arra[i] )
{
flag.max = i;
}
else if ( array[i] < array[flag.min] )
{
flag.min = i;
}
printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n\n", i, array[i], array[flag.min], array[flag.max] );
}
return flag;
}
寻找最小值和最大值的逻辑没有错。
您的代码的问题是您使用 %d
打印 unsigned int。打印 unsigned int 值时使用 %u
.
您可能考虑处理的另一个问题是函数参数 size
的非法值。您的函数要求 size
至少为 2。为避免未定义的行为,您可能需要检查它。
例如,您可以在函数的开头添加
assert(size >= 2);
或
if (size < 2)
{
// return some suitable value
}
也就是说,您也可以只记录要求 size
至少为 2 的函数。在 C 语言中,为函数设置此类契约要求并不少见。几个 stdlib 函数有这样的要求。
顺便说一句:如果您添加 size
检查,您可能还应该检查 array
是否为 NULL。
顺便说一句:您的屏幕截图表明您向函数传递了一个 int 数组。如果这是真的,那么你的调用者代码中就有一个错误。不要将 int 数组传递给需要 unsigned int 数组的函数。