プロが教える店舗&オフィスのセキュリティ対策術

関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。

A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。

良い方法は無いでしょうか?

A 回答 (5件)

下のように書けばよいと思います。



#include <stdio.h>

void func(int arr[4][4]);
void func2(int (*arr)[4]);

int main(void)
{
int array[4][4];

func(array);
func2(array);
return 0;
}

void func(int arr[4][4])
{

}

void func2(int (*arr)[4])
{

}
    • good
    • 1
この回答へのお礼

関数プロトタイプを呼び出す際の引数にも、宣言時の引数にも同じようにhairetsu[4][4]と記載するのかと思っていました。

例に書いていただいた通り、関数プロトタイプを呼び出す引数の[4][4]を消してみたらうまくいきました。

勉強になりました。ありがとうございます。

お礼日時:2009/05/26 20:33

配列の情報全体を渡したいのか、一要素の情報だけでよいのかによって解決方法は変わります。



元のコードでは、hairetsuは、hairetsu[0][0]~hairetsu[3][3]までしかありませんから、にもかかわらずhairetsu[4][4]と書けば、未定義の動作を引き起こしてしまいます。
    • good
    • 0
この回答へのお礼

関数プロトタイプを呼び出す際の引数にも、宣言時の引数にも同じようにhairetsu[4][4]と記載するのかと思っていました。

なるほど、宣言時とは違う意味になってしまうのですね・・・

勉強になりました。ありがとうございます。

お礼日時:2009/05/26 19:52

kansuA() が示されたので、B も C もということで、3つの関数を作ってみました(BorlandC++5.5.1)。



解決の糸口になればよろしいのですが・・。

注:あえて関数側の引数名は、いっしょにしています。

  実際の場面では、( main とも含め)それぞれ別の名前が間違いが少ないかと・・。

#include <stdio.h>

double kansuA( double [ 5 ][ 5 ] ); // [][ 5 ] でも
double kansuB( double [ 5 ] );   // [] でも
double kansuC( double );

int main()
{
 double result;
 double hairetsu[ 5 ][ 5 ];

 hairetsu[ 3 ][ 1 ] = 9.111;
 hairetsu[ 3 ][ 2 ] = 90.0;
 hairetsu[ 4 ][ 4 ] = -99.111;

 result = kansuA( hairetsu );  // [ 0 ][ 0 ] - [ 4 ][ 4 ] の25ケ

 printf( "A %lf\n", result );

 result = kansuB( hairetsu[ 3 ] ); // [ 3 ][ 0 ] - [ 3 ][ 4 ] の5ケ

 printf( "B %lf\n", result );

 result = kansuC( hairetsu[ 4 ][ 4 ] ); // #1「補足」と同じの1ケ

 printf( "C %lf\n", result );

 return( 0 );
}
double kansuA( double hairetsu[][ 5 ] ) // [ 5 ][ 5 ] でも
{
 return( hairetsu[ 3 ][ 1 ] + hairetsu[ 3 ][ 2 ] );
}
double kansuB( double hairetsu[] ) // [ 5 ] でも
{
 return( hairetsu[ 1 ] + hairetsu[ 9 ] ); // ★[ 9 ]注目
}
double kansuC( double hairetsu )
{
 return( hairetsu );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

関数プロトタイプを呼び出す際の引数にも、宣言時の引数にも同じようにhairetsu[4][4]と記載するのかと思っていました。

呼び出す際は、[4][4]の部分は省略するのですね・・・

勉強になりました。ありがとうございます。

お礼日時:2009/05/26 19:53

resultA = kansuA(hairetsu[4][4]);


とかくとhairetsu[4][4]はdouble型になりますのでkansuAの引数として宣言しているdouble[4][4]と型が合わずにエラーが出ます。
resultA = kansuA(hairetsu);
と書くか、関数の仕様を
void kansuA(double foo);
とするのがよろしいかと。
    • good
    • 0
この回答へのお礼

むむむ なにやら難しいですね・・

どうも引数とか配列とか、「値を渡す」ということを理解できていないようです。。。

今回は、引数の[]を外したらうまくコンパイルできましたが、教えていただいたことをメモして後学に生かしたいと思います。

ありがとうございました。

お礼日時:2009/05/26 20:32

具体的にどんなコードを書いたのか、補足してください。

この回答への補足

初心者でうろ覚えですが、以下のような感じです。
よろしくお願いします。
void kansuA(double hairetsu[4][4]);
void main (int argc, char**argv)
{
double resultA;
double hairetsu[4][4];
hairetsu[1][1] = 90;
hairetsu[1][2] = 0;
hairetsu[1][3] = 0;
hairetsu[2][1] = 0;
hairetsu[2][2] = 0;
hairetsu[2][3] = 0;
hairetsu[3][1] = 45;
hairetsu[3][2] = 90;
hairetsu[3][3] = 0;

resultA = kansuA(hairetsu[4][4]);
return 0;
}
---------------------------------
void kansuA(double hairetsu[4][4]){
なにかしらの処理
}

補足日時:2009/05/25 21:18
    • good
    • 0
この回答へのお礼

ご指摘の通りソースを書いたところ、皆さんから貴重な意見を頂けました。

後学に生かそうと思います。

お礼日時:2009/05/26 20:34

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A