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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

3回答

6206閲覧

別のソースファイルの関数を別のソースファイルで使えるようにしたい

gaat

総合スコア8

C++

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

0グッド

1クリップ

投稿2018/01/15 12:30

別のソースコードに記載されている関数の値を別のソースファイルの関数に使いたいのですが、どうやって書けばいいですか?

a.cの中 double GO_MONTE_CARLO::Get_Criticality(int sel_x, int sel_y) { double N_p = (double)play_out_count + DBL_EPSILON; double V_p = set_win_storn_num[sel_x][sel_y]; double W_p = set_white_num[sel_x][sel_y]; double B_p = set_black_num[sel_x][sel_y]; return (V_p / N_p) - (W_p / N_p * (double)white_win_num / N_p + B_p / N_p * (double)black_win_num / N_p); }
b.cの中 double NABI::max_criticality() { int i, j; for (i = 1; i <= MAX_BOARD_SIZE; i++) { for (j = MAX_BOARD_SIZE; j >= 1; j--) { } } return point_criticality[i][j]; }

a.cのGet_Criticality()をb.cのmax_criticality()に入れる

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問の意図がよくわからないですが、C++をあまり勉強していない人が、Cのプログラムのグローバル変数やグローバル関数をクラスの中に入れようとしていると仮定して回答します。
まずポインタか参照をわたさない限り別のクラスのメンバ関数は呼べません。
次にヘッダファイル.hと、ソースファイル.cppを適切に分けないとダメです。
要するに質問にcppファイルしかないところで既にダメです。
そして場合によってはクラスの前方宣言やfriend宣言が必要です。

cpp

1// a.h 2#pragma once 3const int BOARD_SIZE = 19; 4class GO_MONTE_CARLO 5{ 6 friend class NABI; 7 8private: 9 double Get_Criticality(int sel_x, int sel_y) const; 10 double Get_MaxCriticality() const; 11 int play_out_count; 12 double set_win_storn_num[BOARD_SIZE][BOARD_SIZE]; 13 double set_white_num[BOARD_SIZE][BOARD_SIZE]; 14 double set_black_num[BOARD_SIZE][BOARD_SIZE]; 15 double white_win_num, black_win_num; 16};

cpp

1// b.h 2#pragma once 3#include "a.h" 4class NABI 5{ 6public: 7 static double max_criticality(const GO_MONTE_CARLO& gm); 8};

cpp

1// a.cpp 2#include "a.h" 3#include "b.h" 4#include <float.h> 5double GO_MONTE_CARLO::Get_Criticality(int sel_x, int sel_y) const 6{ 7 double N_p = (double)play_out_count + DBL_EPSILON; 8 double V_p = set_win_storn_num[sel_x][sel_y]; 9 double W_p = set_white_num[sel_x][sel_y]; 10 double B_p = set_black_num[sel_x][sel_y]; 11 return (V_p / N_p) - (W_p / N_p * (double)white_win_num / N_p + B_p / N_p * (double)black_win_num / N_p); 12} 13double GO_MONTE_CARLO::Get_MaxCriticality() const 14{ 15 return NABI::max_criticality(*this); 16}

cpp

1// b.cpp 2#include "b.h" 3double NABI::max_criticality(const GO_MONTE_CARLO& gm) 4{ 5 double max_value = 0.0; 6 for (int i = 1; i <= BOARD_SIZE; ++i) { 7 for (int j = 1; j <= BOARD_SIZE; ++j) { 8 double value = gm.Get_Criticality(i - 1, j - 1); 9 if (max_value < value) max_value = value; 10 } 11 } 12 return max_value; 13}

投稿2018/01/15 14:24

編集2018/01/15 15:05
colonq

総合スコア88

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

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

gaat

2018/01/17 12:58

static double max_criticality(const GO_MONTE_CARLO& gm); の部分で型指定子がありませんというエラーがでて詰まってます。
colonq

2018/01/17 14:54

"a.h"の中でGO_MONTE_CARLOが定義されていないとか、"a.h"のファイルの中でどこか間違えて書いているとかではないんですか? 断片的なコードでは動作の確認は無理ですが、一応、GO_MONTE_CARLOクラスにtest関数を足して、適当にmain関数を作って、コンパイルが通ることだけは解答をのせる前に確認してあります。 少なくとも、どうやって書けばよいかについての回答としては十分だと考えます。 おそらく「モンテカルロ法の理論と実践」を見ながらやっているのでしょうけれども、そこに載っているサンプルコードは汚いし遅いし、もともと直接コピーして使うことは想定していないだろうと思います。 面倒でもC++の入門書から初めて、簡単なプログラムなら本を読まないでもかけるようになってから 自分のやりたいことに進んだほうが効率がいいですよ。 普通の人は真剣に勉強してもC言語の学習に3ヶ月そこからC++の学習にさらに3ヶ月くらいはかかります。 本一冊でわかるほど簡単じゃないですよ…
gaat

2018/01/18 03:48

分かりました。アドバイスありがとうございます。
guest

0

こんにちは。

GO_MONTE_CARLOクラスを宣言しているヘッダ・ファイルがあると思います。
そのヘッダ・ファイルをb.cで#includeすれば、GO_MONTE_CARLOクラスをb.cで使えるようになりますので、普通に呼び出せば良いです。

なお、コンパイル/リンクする時に、a.cとb.cがどちらとも1つのバイナリにリンクされるようにすることをお忘れなく。

投稿2018/01/15 14:30

Chironian

総合スコア23272

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

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

0

GO_MONTE_CARLOが名前空間でしたら、プロトタイプ宣言をすればよいかと。

C++

1namespace GO_MONTE_CARLO { 2 double Get_Criticality(int, int); 3}

投稿2018/01/15 12:37

LouiS0616

総合スコア35660

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

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

gaat

2018/01/15 12:40

GO_MONTE_CARLOはクラスとして宣言されています。 class GO_MONTE_CARLO:public GO_RULES
LouiS0616

2018/01/15 12:44

Get_Criticalityはstaticメンバ関数なのですか?
gaat

2018/01/16 02:35

ただのメンバ関数です
LouiS0616

2018/01/16 02:40

それでしたら、インスタンスを介してアクセスする必要があります。 GO_MONTE_CARLOのインスタンスを取り扱う方法としては次の3つがあるかと。 ・ max_criticalityの引数にする (const参照にするのが良いでしょう) ・ NABIのメンバ変数にする ・ グローバル変数として取り扱う モンテカルロ法に詳しくないもので、どれが良いとは言い切れませんが、基本的には上から順に素直な実装かと思います。
gaat

2018/01/16 02:48

アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問