簡體   English   中英

C ++返回值類型與函數類型不匹配

[英]C++ Return value type does not match the function type

我試圖返回一個矩陣,並且在方法中給了我錯誤:返回值類型與函數類型不匹配。

這是矩陣:

float obstaculos[20][4];

方法如下:

float** getObstaculos() {
    return obstaculos;
}

您知道可能是什么問題嗎?

float obstaculos[20][4];

…是一個float值數組的數組。 由於sizeof要求,它是內存中連續的float值序列。

float**

…是指向float的指針。 float值的單個序列( obstaculos矩陣)自然可以轉換為直接指針(即指向第一項),但是該內存中沒有存儲可以獲取指向該指針的指針的指針。

因此,一種可能性是

using Row = float[4];
Row obstaculos[20];

Row* getObstaculos() {
    return obstaculos;
}

但是最好定義一個矩陣,例如

#include <array>

using Row = std::array<float, 4>;
using Matrix = std::array<Row, 20>;

Matrix obstaculos;

Matrix* getObstaculos() {
    return &obstaculos;
}

如果您確實需要一個指針數組,那么您可能希望使矩陣最初是該形式的。


修訂:如果需要,這是一種計算指向行的指針的數組的方法:

using Row_data_pointers = std::array<float*, std::tuple_size<Matrix>::value>;

auto data_pointers( Matrix& m )
    -> Row_data_pointers
{
    Row_data_pointers result;
    for( int i = 0; i < int( std::tuple_size<Row_data_pointers>::value ); ++i )
    {
        result[i] = &m[i][0];
    }
    return result;
}

盡管float*float[N]相似的類型(它們可以類似的方式使用,並且第一個可以從第二個隱式初始化),但這不適用於嵌套數組

為什么會這樣呢?

float**類型是指向指針的指針。 當您像2D數組/矩陣(應用了兩個下標運算符)一樣使用它時,第一個指針應指向一個指針數組,該指針指向更多數組(例如,單個行)。

但是, float[N][M]是整個矩陣的連續內存塊。 沒有(行)指針的數組,也不能通過強制轉換為float**隱式創建,因此,根據標准,這種強制轉換是不可能的。

你能做什么?

您可以返回對多維數組引用 為此,首先為您的矩陣創建一個typedef: typedef float matrix[20][4]; 然后使用返回類型matrix&

避免使用嵌套數組 使用一維數組並在訪問時計算索引(例如, matrix[row * N + col]而不是matrix[row][col] )。 將這個索引計算隱藏在一個矩陣類中,該矩陣類將為第一個operator[]返回一個輔助對象。

更好: 使用線性代數庫來處理矩陣,例如本征。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM