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

動的に定義した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)

A 回答 (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)

「引数の型」と「実際に引数に渡している変数の型」を一致させて下さい。

そうすれば、エラーもワーニングも消えます。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございますm(_ _)m

なるほど、ポインタのポインタ?の理解が足りてませんでした。

count_line(long **array)にすることで、「引数の型」と「実際に引数に渡している変数の型」を一致させることができたのですね。

エラーもワーニングも消すことができました。

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

お礼日時:2009/04/22 17:16

後一つ追記ですが、


整数値変数を初期化する必要はないです。

int x=0; ではなく int x; でOKです。
    • good
    • 0
この回答へのお礼

なるほど。

今まで、変数定義するときは全部「=0」をつけてました^^;

これからは「int=x;」でいきます。

お礼日時:2009/04/22 17:12

関数の引数定義が間違ってます。



long count_line(long array[][2])

ではなく、

long count_line(long **array)

です。

引数を修正してこのプログラムコンパイルしてみると
警告は出ますが、プログラム自体は動くと思います。
    • good
    • 0
この回答へのお礼

指摘していた頂いた通りに修正しコンパイルしましたら、
警告も何も出ずにコンパイルできました^^

プログラムも正常に動作しています。
ありがとうございました~m(_ _)m

お礼日時:2009/04/22 16:58

>しかし、コンパイルすると下のエラーが出てコンパイルできません。



そのエラーメッセージの通りです。
あなたの宣言した

long count_line(long arrau[][2]);

の引数は 2次元配列が「みっしり」並んでいることを想定していますが、
実際に確保した動的配列はそうではないですよね。
    • good
    • 0
この回答へのお礼

なるほど、確かにarray[][2]だと静的に確保した場合ですよね^^;

ん~、同じ指定方法ですとダメみたいですねorz

お礼日時:2009/04/22 16:43

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