動的に定義した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)
No.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)
「引数の型」と「実際に引数に渡している変数の型」を一致させて下さい。
そうすれば、エラーもワーニングも消えます。
詳しい説明ありがとうございますm(_ _)m
なるほど、ポインタのポインタ?の理解が足りてませんでした。
count_line(long **array)にすることで、「引数の型」と「実際に引数に渡している変数の型」を一致させることができたのですね。
エラーもワーニングも消すことができました。
本当にありがとうございました。
No.3
- 回答日時:
後一つ追記ですが、
整数値変数を初期化する必要はないです。
int x=0; ではなく int x; でOKです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のサフィックスについて
-
初期化関数でmallocしたい
-
他のフォームから別のフォーム...
-
エクセルVBAでテキストボッ...
-
【VB6.0】 あるフォームから他...
-
perlによるxmlファイルの取得
-
タイムアウトする仕組みを作りたい
-
C#のループでtextboxに値を入れ...
-
sublimit textっていうエディタ...
-
三項でたとえば交換って
-
VS CodeでTEXファイルにPDF形式...
-
pthread_cond_waitとptherad_co...
-
二点の座標から距離や角度を求...
-
【VB.NET】テキストボックスに...
-
VB.NETでのイベントの途中終了
-
VB6のFriendについて
-
verilogのcase文
-
アクセスできない保護レベルエ...
-
【VBS】クリップボード操作につ...
-
レコードセットにnullの場合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のサフィックスについて
-
「ずっと憧れていました」は英...
-
初期化関数でmallocしたい
-
変数の型でlong longとunsigned...
-
1) A uniform ladder 10.0 m lo...
-
三項でたとえば交換って
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
レコードセットにnullの場合
-
エクセルVBAでテキストボッ...
-
Functionの戻り値を配列にした...
-
プログラムの素朴な質問です 分...
-
VB.NETでのイベントの途中終了
-
sublimit textっていうエディタ...
-
アクセスできない保護レベルエ...
-
チェックボックスを操作できな...
-
String型の値にスラッシュをつ...
-
Excel VBAでsub,dimは何の略?
おすすめ情報