- ベストアンサー
動的配列の受け渡しについて
動的に定義した2次元配列を受け渡す方法がわからなくて困ってます。 配列に-1以外が入っている場合の行数を数えるプログラムを作成しています。 しかし、コンパイルすると下のエラーが出てコンパイルできません。 error:cannot convert 'long int **' to 'long int (*)[2] for argument '1' to 'long int count_line(long int (*)[2])' #include <stdio.h> long count_line(long arrau[][2]); int main(void){ long** test = new long* [100]; for(long num1=0 ; num1<100 ; num1++){ test[num1] = new long [2]; } for(int i=0 ; i<100 ; i++){ test[i][0]=-1; test[i][1]=-1; } for(int num2=0 ; num2<10 ; num2++){ test[num2][0]=1; test[num2][1]=1; } int x=0; x = count_line(test); printf("x=%d\n",x); } long count_line(long array[][2]){ long count=0; long end=0; long roop=0; while(end!=-1){ if(array[roop][1]!=-1){ count++; } end=array[roop][1]; roop++; } return(count); } どなたかお助けをー(T_T)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>long count_line(long arrau[][2]); 配列arrauは、メモリ上に以下のように並んでいる事になります。 arrau {long long} arrau+?{long long} arrau+?{long long} arrau+?{long long} arrau+?{long long} arrau+?{long long} (以下略、個数不明) > long** test = new long* [100]; 一方、testは、以下のようになります。 test{long *(どこかのアドレス1を指している)} どこかのアドレス1 {long *(どこかのアドレス2を指している)} どこかのアドレス1+?{long *(どこかのアドレス3を指している)} どこかのアドレス1+?{long *(どこかのアドレス4を指している)} (以下、100個、繰り返し) どこかのアドレス2{long long} どこかのアドレス3{long long} どこかのアドレス4{long long} (以下、不連続にバラバラに100個存在する) 「どっからどう見ても、メモリ上のデータの並び方が違う」とは思いませんか? コンパイラは「データの並びが全然違うから、引数を言われた形には変換できません。無理っす」って言ってエラーを吐きます。 >どなたかお助けをー(T_T) 「引数の型」と「実際に引数に渡している変数の型」を一致させて下さい。 そうすれば、エラーもワーニングも消えます。
その他の回答 (3)
- googoo131
- ベストアンサー率45% (5/11)
後一つ追記ですが、 整数値変数を初期化する必要はないです。 int x=0; ではなく int x; でOKです。
お礼
なるほど。 今まで、変数定義するときは全部「=0」をつけてました^^; これからは「int=x;」でいきます。
- googoo131
- ベストアンサー率45% (5/11)
関数の引数定義が間違ってます。 long count_line(long array[][2]) ではなく、 long count_line(long **array) です。 引数を修正してこのプログラムコンパイルしてみると 警告は出ますが、プログラム自体は動くと思います。
お礼
指摘していた頂いた通りに修正しコンパイルしましたら、 警告も何も出ずにコンパイルできました^^ プログラムも正常に動作しています。 ありがとうございました~m(_ _)m
- koko_u_u
- ベストアンサー率18% (216/1139)
>しかし、コンパイルすると下のエラーが出てコンパイルできません。 そのエラーメッセージの通りです。 あなたの宣言した long count_line(long arrau[][2]); の引数は 2次元配列が「みっしり」並んでいることを想定していますが、 実際に確保した動的配列はそうではないですよね。
お礼
なるほど、確かにarray[][2]だと静的に確保した場合ですよね^^; ん~、同じ指定方法ですとダメみたいですねorz
お礼
詳しい説明ありがとうございますm(_ _)m なるほど、ポインタのポインタ?の理解が足りてませんでした。 count_line(long **array)にすることで、「引数の型」と「実際に引数に渡している変数の型」を一致させることができたのですね。 エラーもワーニングも消すことができました。 本当にありがとうございました。