错误:无法将"float*"转换为"float"

error: cannot convert ‘float*’ to ‘float’ in return

本文关键字:quot float 转换 错误      更新时间:2023-10-16

我正在尝试在我的函数中传递一个浮点数数组并在输出列表中返回最小值,但由于某种原因我不断收到此错误,不确定它是什么。知道吗?

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
float minOfList(float *list1) {
float lowest = list1[0];
float lowest2 = 0.0;
float low_values[] = {};
int list_length = sizeof(list1)/sizeof(list1[0]);

for (int item=1; item < list_length; item++) {
if (list1[item]<lowest) {
lowest2 = lowest;
lowest = list1[item];
}
//        cout << lowest << endl;
//        cout << lowest2 << endl;
}
low_values[0] = lowest;
low_values[1] = lowest2;
cout << low_values << endl;
return low_values;
}
int main(int argc, char **argv)
{
float mylist[] = {7.0,1.0, 2.5, 3.3,5.5,6,6};
float values = minOfList(&mylist);
cout << values << " "<< endl;
return 0;
}

原始问题的答案

关于您最初的问题,我复制并粘贴到 godbolt.org,它给出了:

<source>:30:12: error: cannot convert 'float*' to 'float' in return
30 |     return low_values;
|            ^~~~~~~~~~

切换到叮当声:

<source>:30:12: error: cannot initialize return object of type 'float' with an lvalue of type 'float [0]'
return low_values;
^~~~~~~~~~

这意味着您的low_values数组不是浮点数。其实不然。为什么海湾合作委员会谈论float*?因为当你在表达式中使用数组的名称(sizeof and & excluded(时,它就会变成指向第一个元素的指针。指向浮点数的指针不是浮点数。

此代码的真正问题

你说:"我正在尝试在我的函数中传递一个浮点数数组"。你不能。不是在C中,也不是在C++中。该语言不允许具有数组类型的参数。

实际上,您的参数是指向浮点数序列的第一个元素的指针。几个?只有函数外部的代码才能告诉它,因此您必须向函数提供信息。不可能知道指针指向的元素数量。

代码的第一个快速修复是这样,但它被简化以返回列表的最小值。

#include <iostream>
float minOfList(float *list, int len) 
{
float lowest = list[0];
for (int item = 1; item < len; item++) {
if (list[item] < lowest) {
lowest = list[item];
}
}
return lowest;
}
int main(int argc, char **argv)
{
float mylist[] = { 7.0f, 1.0f, 2.5f, 3.3f, 5.5f, 6.f, 6.f };
int list_length = sizeof(mylist) / sizeof(mylist[0]);
float value = minOfList(mylist, list_length);
std::cout << value << "n";
return EXIT_SUCCESS;
}

从这里您可以扩展到返回列表中最低的两个数字,但请记住,您不能从函数返回数组。此外,我有意避免了您必须添加到此函数中的所有错误检查。

这是C,不是C++。请移至C++。

搬到C++

事情可以通过多种方式打开。无论如何,我会尽量保持保守,不使用为您准备好的算法,例如min_element()单一最小情况的算法。

基本思路:

  • std::vector<>而不是耦合指针和元素数
  • 尽可能通过常量引用传递
  • 基于范围
  • std::array<>返回两个浮点数(这可以通过许多其他方式完成(
  • 用于动态创建返回数组的初始值设定项列表
  • auto 让编译器指定函数返回的变量的类型。
#include <iostream>
#include <vector>
#include <array>
float minOfList(const std::vector<float>& list)
{
float lowest = FLT_MAX;
for (const auto& item : list) {
if (lowest > item) {
lowest = item;
}
}
return lowest;
}
std::array<float, 2> two_minOfList(const std::vector<float>& list)
{
float lowest = FLT_MAX;
float second_lowest = FLT_MAX;
for (const auto& item : list) {
if (second_lowest > item) {
if (lowest > item) {
second_lowest = lowest;
lowest = item;
}
else {
second_lowest = item;
}
}
}
return { lowest, second_lowest };
}
int main(int argc, char **argv)
{
std::vector<float> mylist = { 7.0f, 1.0f, 2.5f, 3.3f, 5.5f, 6.f, 6.f };
float value = minOfList(mylist);
std::cout << "Minimum of list is: " << value << "n";
auto tm = two_minOfList(mylist);
std::cout << "Minimums of list are: [" << tm[0] << ", " << tm[1] << "]n";
return EXIT_SUCCESS;
}