質問概要
C++にて関数定義を試みているのですが、なぜかうまくいきません。
配列を引数にしていますが、そこでエラーが出てしまいます。
また、カウント変数としてi,jを定義していますが宣言していないことになっているようです。
実現したいこと
単に行列の各要素を手入力してもらい、入力された行列を一覧として表示するだけです。
手入力に関する処理を関数として独立させようとしています。
しかし、引数であるカウント変数と二次元配列の箇所で謎のエラーが出てしまいます。
発生している問題・エラーメッセージ
PS C:\Users\motch\java> g++ Function1_C++_20221223.cpp -o Function1_C++_20221223 ; .\Function1_C++_20221223 Function1_C++_20221223.cpp:6:44: error: array bound is not an integer constant before ']' token double matrix_input(int i,int j,double x[NN][NN]); ^ Function1_C++_20221223.cpp:6:48: error: array bound is not an integer constant before ']' token double matrix_input(int i,int j,double x[NN][NN]); ^ Function1_C++_20221223.cpp:62:44: error: array bound is not an integer constant before ']' token double matrix_input(int i,int j,double x[NN][NN]) ^ Function1_C++_20221223.cpp:62:48: error: array bound is not an integer constant before ']' token double matrix_input(int i,int j,double x[NN][NN]) ^ Function1_C++_20221223.cpp: In function 'double matrix_input(...)': Function1_C++_20221223.cpp:64:20: error: 'i' was not declared in this scope cout << "x["<< i <<"]["<< j <<"]?----------->"; ^ Function1_C++_20221223.cpp:64:31: error: 'j' was not declared in this scope cout << "x["<< i <<"]["<< j <<"]?----------->"; ^ Function1_C++_20221223.cpp:65:12: error: 'x' was not declared in this scope cin >> x[i][j];
該当のソースコード
以下がソースコードの冒頭の抜粋です。
C++
1#include <iostream> 2using namespace std; 3int NN=10; 4 5 6double matrix_input(int i,int j,double x[NN][NN]); 7//double matrix_display 8//double matrix_multiple 9
以下が関数の定義部分です。
C++
1double matrix_input(int i,int j,double x[NN][NN]) 2{ 3 cout << "x["<< i <<"]["<< j <<"]?----------->"; 4 cin >> x[i][j]; 5 6 return x[i][j]; 7 8}
いずれも
double matrix_input(int i,int j,double x[NN][NN]);
に問題があるようです。
試したこと、確認したこと
教科書を見直しましたが、この書き方で間違っていないようです。
何が原因なのでしょうか???
以上よろしくお願いいたします。
ちょっと焦点が違いますが下記のQAが参考になります。C/C++では関数の引数が配列の場合、先頭のアドレスを渡すだけなので、要素数が変数ではコンパイラがコンパイル時に要素のアドレスを計算することができません。
https://teratail.com/questions/19591
質問からは外れてしまう気もしますが、
> C/C++では関数の引数が配列の場合、先頭のアドレスを渡すだけ
は真ですが、
> 要素数が変数ではコンパイラがコンパイル時に要素のアドレスを計算することができません
は言い切るのはどうでしょう。C++ではダメですが、可変長配列という(冷遇されている?)Cのオプション規格があるので。
gcc/clangのCであれば
void func(int n, char s[][n]){
printf("%s",s[0]);
}
int N=10;
int main(void){
char str[][N]={"Hello", "world"};
func(N,str);
return 0;
}
は通ったりします。
C99ですね。それは知っていますが、それはコンパイル時に要素のアドレスを計算できているのですか?実行時に計算しているのではないですか?そしてこの質問はC++の質問です。
> それはコンパイル時に要素のアドレスを計算できているのですか?
うん、言われてみれば。もっとも、C++で定数だったとしても関数の引数に渡された配列(ポインタ)のアドレスは「計算」できないけれど(引数で渡される値をコンパイル時に計算できるわけがない)。
> そしてこの質問はC++の質問です。
C/C++では...というコメントがついたので「いやCはちょっと違うよね」というコメントをさらに重ねたものでした。C++は...という話だったら黙っていたのですけれど。CとC++で違いがあるところの一つですから。
> 関数の引数に渡された配列(ポインタ)のアドレスは「計算」できないけれど
それも違います。私は要素のアドレスと言っています。
回答2件
あなたの回答
tips
プレビュー