重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

全対最短経路(フロイドのアルゴリズム)のプログラムを作成したんですが、以下のようなメッセージが出てしまい、どこが悪いのかさっぱりわかりません。どなたかご教授願えないでしょうか?

<プログラム>
#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

A 回答 (3件)

>2次元配列の1次元目はサイズが決まっている必要があります。

次元数Nを指定してください

ちなみに要素数が不定でいいのは、n次元配列のn次元目のみです。
で、次元数Nじゃなくて要素数Nね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/31 07:53

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)へのポインタ」
# ということになります。
# ちなみに、配列とポインタの読替えは再帰的には行われませんので
# ご注意を。。。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/31 07:52

>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])
こうしとけば確実です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!