• ベストアンサー

C言語でのプログラム

全対最短経路(フロイドのアルゴリズム)のプログラムを作成したんですが、以下のようなメッセージが出てしまい、どこが悪いのかさっぱりわかりません。どなたかご教授願えないでしょうか? <プログラム> #include<stdio.h> #define NC 999 /* It should be large enough. */ #define N 5 void floyd(int, int [][], int [][], int [][]); int W[N][N] = { { 0, 1, NC, 1, 5 }, { 9, 0, 3, 2, NC }, { NC, NC, 0, 4, NC }, { NC, NC, 2, 0, 3 }, { 3, NC, NC, NC, 0 }, }; int P[N][N]; int D[N][N]; main() { floyd(N, W, D, P); } void floyd(int n, int W[][], int D[][], int P[][]) { int i, j, k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ P[i][j] = 0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ D[i][j] = W[i][j]; } } for(k=0;k<n;k++){ for(i=0;i<n;j++){ for(j=0;j<n;j++){ if(D[i][k]+D[k][j]<D[i][j]){ P[i][j] = k; D[i][j] = D[i][k] + D[k][j]; } } } } printf("?nall pairs of the shortest pathes:?n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%3d ", D[i][j]); } printf("?n"); } printf("?n"); } <エラーメッセージ> In function `floyd': :30: error: invalid use of array with unspecified bounds :36: error: invalid use of array with unspecified bounds :43: error: invalid use of array with unspecified bounds :44: error: invalid use of array with unspecified bounds :45: error: invalid use of array with unspecified bounds :54: error: invalid use of array with unspecified bounds

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>2次元配列の1次元目はサイズが決まっている必要があります。次元数Nを指定してください ちなみに要素数が不定でいいのは、n次元配列のn次元目のみです。 で、次元数Nじゃなくて要素数Nね。

ken6791
質問者

お礼

レスおくれまして、すいませんでした。 貴重なご意見のおかげで、無事完成しました。 ありがとうございました。

その他の回答 (2)

  • ency
  • ベストアンサー率39% (93/238)
回答No.3

taka_tetsu さんに補足します。 [No2 taka_tetsu さんの回答より] > ちなみに要素数が不定でいいのは、n次元配列のn次元目のみです。 > で、次元数Nじゃなくて要素数Nね。 要するに、こんな感じですよね。 void floyd(int n, int W[][N], int D[][N], int P[][N]) ちなみに、この本当の意味は次のようになります。 # ほら、C って配列をそのまま関数に渡すことできないから、 # 先頭要素のポインタを渡すでしょう? void floyd(int n, int (*W)[N], int (*D)[N], int (*P)[N]) このように、配列の仮定義に限り、配列とポインタは同義になります。 # この場合、「配列(要素数N)の配列」=「配列(要素数N)へのポインタ」 # ということになります。 # ちなみに、配列とポインタの読替えは再帰的には行われませんので # ご注意を。。。

ken6791
質問者

お礼

レスがおそくなりまして、申し訳ありませんでした。 無事にできました。 ありがとうございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>void floyd(int n, int W[][], int D[][], int P[][]) 2次元配列の1次元目はサイズが決まっている必要があります。次元数Nを指定してください。 void floyd(int n, int W[N][N], int D[N][N], int P[N][N]) こうしとけば確実です。

関連するQ&A

専門家に質問してみよう