質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2814閲覧

c++ コンパイルエラー

tsukagon

総合スコア30

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/15 11:34

前提・実現したいこと

こんにちは。プログラミング初学者です。研究の一環でC++ を使用して任意の値を入力して連立方程式を解くプログラム(ガウスの消去法)を作成したいと思っています。単純に計算を行いたいだけなのですがエラーを検索しても解決方法が見つからず困っています。
プログラムは
main文の中で複数の値を入力して配列に格納

配列を受け取って関数内で連立方程式を解く

3つの値を返す(このときtupleを使用している)

返された値を表示

という感じを実現したいと思っています。
基礎的なことが理解できていないかと思いますがご教授願います。

発生している問題・エラーメッセージ

Compiling test1.cpp and linking to test1...
test1.cpp:15:37: error: return type specification for constructor invalid
double Calc1(double g[][N+1]);//doubleを消去した
^
test1.cpp:26:37: error: return type specification for constructor invalid
double Calc2(double g[][N+1]);//doubleを消去した
^
test1.cpp:37:37: error: return type specification for constructor invalid
double Calc3(double g[][N+1]);//doubleを消去した
^
test1.cpp:48:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc1::Calc1(double array1[][N+1])
^
test1.cpp: In constructor ‘Calc1::Calc1(double ()[4])’:
test1.cpp:86:67: error: returning a value from a constructor
return forward_as_tuple(array1[0][N],array1[1][N],array1[2][N]);
^
test1.cpp: At global scope:
test1.cpp:89:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc2::Calc2(double array2[][N+1])
^
test1.cpp: In constructor ‘Calc2::Calc2(double (
)[4])’:
test1.cpp:127:67: error: returning a value from a constructor
return forward_as_tuple(array2[0][N],array2[1][N],array2[2][N]);
^
test1.cpp: At global scope:
test1.cpp:130:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc3::Calc3(double array3[][N+1])
^
test1.cpp: In constructor ‘Calc3::Calc3(double (*)[4])’:
test1.cpp:168:67: error: returning a value from a constructor
return forward_as_tuple(array3[0][N],array3[1][N],array3[2][N]);
^
test1.cpp: In function ‘int main()’:
test1.cpp:302:15: error: no matching function for call to ‘Calc1::Calc1()’
Calc1 objCalc1;

該当のソースコード

#include<iostream> #include<stdio.h> #include <tuple> #include<math.h> #define N 3 using namespace std; class Calc1 { private: double array1[N][N + 1]; double d; int i, j, k; public: double Calc1(double g[][N+1]);//doubleを消去した }; //構造体を定義 struct DATA{ double x; double y; double z; }; tuple<double,double,double>Calc1::Calc1(double array1[][N+1]) { double a,b,c; /*static double g[N][N + 1] = { { dr1.x, dr1.y, dr1.z, dB1.x}, { dr2.x, dr2.y, dr2.z, dB2.x}, { dr3.x, dr3.y, dr3.z, dB3.x} };*/ // 元の連立方程式をコンソール出力 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%+fx%d ", array1[i][j], j + 1); printf("= %+f\n", array1[i][N]); } // 前進消去 for (k = 0; k < N -1; k++) { for (i = k + 1; i < N; i++) { d = array1[i][k] / array1[k][k]; for (j = k + 1; j <= N; j++) array1[i][j] -= array1[k][j] * d; } } // 後退代入 for (i = N - 1; i >= 0; i--) { d = array1[i][N]; for (j = i + 1; j < N; j++) d -= array1[i][j] * array1[j][N]; array1[i][N] = d / array1[i][i]; } // 結果出力 for (k = 0; k < N; k++) printf("x%d = %f\n", k + 1, array1[k][N]); return forward_as_tuple(array1[0][N],array1[1][N],array1[2][N]); } /* * メイン処理 */ int main() { struct DATA r1,r2,r3,r4,rg,dr1,dr2,dr3,dr4,B1,B2,B3,B4,Bg,dB1,dB2,dB3,dB4; //4つの物体の位置と磁場を入力 cout <<"r1.xを入力して下さい" << endl; cin >> r1.x; cout <<"r1.yを入力して下さい" << endl; cin >> r1.y; cout <<"r1.zを入力して下さい" << endl; cin >> r1.z; cout <<"r2.xを入力して下さい" << endl; cin >> r2.x; cout <<"r2.yを入力して下さい" << endl; cin >> r2.y; cout <<"r2.yを入力して下さい" << endl; cin >> r2.z; cout <<"r3.xを入力して下さい" << endl; cin >> r3.x; cout <<"r3.yを入力して下さい" << endl; cin >> r3.y; cout <<"r3.zを入力して下さい" << endl; cin >> r3.z; cout <<"r4.xを入力して下さい" << endl; cin >> r4.x; cout <<"r4.yを入力して下さい" << endl; cin >> r4.y; cout <<"r4.zを入力して下さい" << endl; cin >> r4.z; cout <<"B1.xを入力して下さい" << endl; cin >> B1.x; cout <<"B1.yを入力して下さい" << endl; cin >> B1.y; cout <<"B1.zを入力して下さい" << endl; cin >> B1.z; cout <<"B2.xを入力して下さい" << endl; cin >> B2.x; cout <<"B2.yを入力して下さい" << endl; cin >> B2.y; cout <<"B2.zを入力して下さい" << endl; cin >> B2.z; cout <<"B3.xを入力して下さい" << endl; cin >> B3.x; cout <<"B3.yを入力して下さい" << endl; cin >> B3.y; cout <<"B3.zを入力して下さい" << endl; cin >> B3.z; cout <<"B4.xを入力して下さい" << endl; cin >> B4.x; cout <<"B4.yを入力して下さい" << endl; cin >> B4.y; cout <<"B4.zを入力して下さい" << endl; cin >> B4.z; cout <<"Bg.xを入力して下さい" << endl; cin >> Bg.x; cout <<"Bg.yを入力して下さい" << endl; cin >> Bg.y; cout <<"Bg.zを入力して下さい" << endl; cin >> Bg.z; //重心の位置を計算 rg.x=(r1.x+r2.x+r3.x+r4.x)/4; rg.y=(r1.y+r2.y+r3.y+r4.y)/4; rg.z=(r1.z+r2.z+r3.z+r4.z)/4; //重心の磁場を計算 Bg.x=(B1.x+B2.x+B3.x+B4.x)/(sqrt(B1.x*B1.x)+sqrt(B2.x*B2.x)+sqrt(B3.x*B3.x)+sqrt(B4.x*B4.x)); Bg.y=(B1.y+B2.y+B3.y+B4.y)/(sqrt(B1.y*B1.y)+sqrt(B2.y*B2.y)+sqrt(B3.y*B3.y)+sqrt(B4.y*B4.y)); Bg.z=(B1.z+B2.z+B3.z+B4.z)/(sqrt(B1.z*B1.z)+sqrt(B2.z*B2.z)+sqrt(B3.z*B3.z)+sqrt(B4.z*B4.z)); //δrを計算 dr1.x=r1.x-rg.x; dr1.y=r1.y-rg.y; dr1.z=r1.z-rg.z; dr2.x=r2.x-rg.x; dr2.y=r2.y-rg.y; dr2.z=r2.z-rg.z; dr3.x=r3.x-rg.x; dr3.y=r3.y-rg.y; dr3.z=r3.z-rg.z; dr4.x=r4.x-rg.x; dr4.y=r4.y-rg.y; dr4.z=r4.z-rg.z; //δBを計算 dB1.x=B1.x-Bg.x; dB1.y=B1.x-Bg.y; dB1.z=B1.x-Bg.z; dB2.x=B2.x-Bg.x; dB2.y=B2.x-Bg.y; dB2.z=B2.x-Bg.z; dB3.x=B3.x-Bg.x; dB3.y=B3.x-Bg.y; dB3.z=B3.x-Bg.z; dB4.x=B4.x-Bg.x; dB4.y=B4.x-Bg.y; dB4.z=B4.x-Bg.z; //二次元配列に値を入力 static double array1[N][N + 1] = { { dr1.x, dr1.y, dr1.z, dB1.x}, { dr2.x, dr2.y, dr2.z, dB2.x}, { dr3.x, dr3.y, dr3.z, dB3.x} }; try { double a,b,c,d,e,f,g,h,i; // 計算クラスインスタンス化 Calc1 objCalc1; // 連立方程式を解く(ガウスの消去法) tie(a,b,c)=objCalc1.Calc1(array1); //要素を表示 cout<<"∇BG="<<endl; cout<<a<<b<<c<<endl; } catch (...) { cout << "例外発生!" << endl; return -1; } // 正常終了 return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

本来は関数が複数あるのですが質問の文字数状カットしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

google翻訳
test1.cpp:15:37: error: コンストラクターの戻り型の指定が無効です
double Calc1(double g[][N+1]);//doubleを消去した
^

投稿2021/04/15 11:36

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukagon

2021/04/15 11:43

ご回答ありがとうございます。 ”コンストラクターの戻り型の指定が無効”とはクラスの定義内の関数の宣言の仕方が間違えているということでしょうか?” class Calc1 { private: double array1[N][N + 1]; double d; int i, j, k; public: double Calc1(double g[][N+1]);←←←この部分 };
y_waiwai

2021/04/15 11:46

クラス名と同じ名前のメソッドはコンストラクタといいます コンストラクタは特別なメソッドなんでそのような使い方はできません ここらへんの基本的な文法をもちっと学びましょう。
tsukagon

2021/04/15 12:17

ご回答ありがとうございます。 コンストラクタの基礎について理解できておりませんでした。 精進いたします。
guest

0

ベストアンサー

Calc1クラスでCalc1関数を宣言しているが、これはコンストラクタとみなされるので別関数名にする。
別関数名に変更したとしてCalc1クラスで宣言しているCalc1(の別名)関数の戻り値が違うのでそれも注意。
あとCalc1の定義を見ると戻り値はforward_as_tupleで行けるのだろうか。
make_tupleでないとダメなように見える

投稿2021/04/15 11:54

編集2021/04/15 11:57
ardin

総合スコア546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukagon

2021/04/15 12:32 編集

回答ありがとうございます。質問失礼します。 ご指摘の通り関数名をgaussCalc1に変え、make_tupleに変更しました。その結果以下のエラーが出ています。 ---------------------------------------------------------------------------------------------------------------- error: prototype for ‘std::tuple<double, double, double> Calc1::gaussCalc1(double (*)[4])’ does not match any in class ‘Calc1’ tuple<double,double,double>Calc1::gaussCalc1(double array1[][N+1]) ^~~~~ test1.cpp:15:16: error: candidate is: double Calc1::gaussCalc1(double (*)[4]) double gaussCalc1(double g[][N+1]); ---------------------------------------------------------------------------------------------------------------- ここで、”Calc1クラス内で宣言しているCalc1(の別名)関数の戻り値が違うのでそれも注意”と言いますのはCalc1クラス内での戻り値の型doubleと関数定義内での戻り値が一致していないということでしょうか?
ardin

2021/04/16 00:15

そうです。 宣言でdouble型の戻り値を期待したgaussCalc1を宣言しているのに、定義されたものはtupleになっています。 もし意味が分からないのならば、基本的な文法の話なので一度基礎から学んでみましょう。
tsukagon

2021/04/17 03:13

ありがとうございます。もう一度基礎から学んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問