1. ホーム
  2. c++

[解決済み] c++のエラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要があります"

2022-02-09 05:55:01

質問

この件に関して、あなたの助けが必要です。 私の関数は:(それが動作する方法は真です。)

#include <iostream>              
using namespace std;

#define V 4  
#define INF 999 
int floydWarshall(int graph[][V]){  

        int dist[V][V], i, j, k;  


        for (i = 0; i < V; i++)  
            for (j = 0; j < V; j++)  
                dist[i][j] = graph[i][j];  

        for (k = 0; k < V; k++)  
        {  

            for (i = 0; i < V; i++)  
            {  

                for (j = 0; j < V; j++)  
                {  

                    if (dist[i][k] + dist[k][j] < dist[i][j])  
                        dist[i][j] = dist[i][k] + dist[k][j];  
                }  
            }  
        }  

        return dist[V][V];  
    }

で、この行は、array must be initialized with brace-enclosed initializer というエラーになっています。

int dist[V][V] = floydWarshall(graph[][V]);

解決方法は?

C言語の配列は、他の変数やオブジェクトのように使うことができない場合が多くあります。C 配列を値として関数に渡したり、関数から C 配列を返したりすることはできません。これは、最初の要素へのポインタに崩壊します。したがって std::array はC++で導入された。これは、あなたのコードでCの配列から期待されることを正確に実行します。

#include <array>

constexpr int V = 4;

auto floydWarshall(std::array<std::array<int, V>, V> graph){
    for (int k = 0; k < V; k++) {
        for (int i = 0; i < V; i++) {  
            for (int j = 0; j < V; j++) {  
                if (graph[i][k] + graph[k][j] < graph[i][j])  
                    graph[i][j] = graph[i][k] + graph[k][j];  
            }  
        }  
    }  
    return graph;  
}

std::array を使用すると、配列のコピーを関数に渡すことができ、手動でコピーする必要がなくなります。動的なメモリ割り当てやポインタを使用する代わりに、配列のコピーを返すことができます。

でこの関数を使用します。

auto dist = floydWarshall(graph);

ここで graph は、タイプ std::array<std::array<int, V>, V> .