関数 – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] 関数

固定ページ 2 / 3

mf
 mf
(@mf)
ゲスト
結合: 22年前
投稿: 9
 

int Sum(int a) の定義と、実装部分、それを呼び出している部分は一致してますか?

関数の戻り値や、パラメータの型及び数が、上の3つの個所で一致してますか?


返信引用
hai
 hai
(@hai)
ゲスト
結合: 23年前
投稿: 26
Topic starter  

// CTest3View クラスの描画

void CTest3View::OnDraw(CDC* pDC)
{
CTest3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q;
char b[100];
q=30;

sprintf(b,%d, Sum(q));
pDC->TextOut(10, 10, b);

}

               略

// CTest3View クラスのメッセージ ハンドラ

int CTest3View::Sum(int a)
{
return(a+30);

}

これではダメなんでしょうか?


返信引用
e
 e
(@e)
ゲスト
結合: 22年前
投稿: 3
 

宣言していれば問題ないですね。


返信引用
e
 e
(@e)
ゲスト
結合: 22年前
投稿: 3
 

ごめんなさい、間違えて解決ボタン押してしまいました。
他人でも押せるんですね・・・失礼しました。


返信引用
mf
 mf
(@mf)
ゲスト
結合: 22年前
投稿: 9
 

>これではダメなんでしょうか?

CStringをcharの配列に変えても、もちろん OK


返信引用
hai
 hai
(@hai)
ゲスト
結合: 23年前
投稿: 26
Topic starter  

でも動かないんですが先ほどのエラーがでます。


返信引用
e
 e
(@e)
ゲスト
結合: 22年前
投稿: 3
 

宣言していれば問題ないですね。


返信引用
mf
 mf
(@mf)
ゲスト
結合: 22年前
投稿: 9
 

Test3View.h の Sumの宣言部分のコードはどうなってます?


返信引用
mf
 mf
(@mf)
ゲスト
結合: 22年前
投稿: 9
 

// CTest3View クラスのメッセージ ハンドラ

int CTest3View::Sum(int a)
{
return(a+30);

}

>これではダメなんでしょうか?

「クラスのメッセージ ハンドラ と言う表現」が気になります。
メッセージ ハンドラではなくて、メンバ関数なんですが。

ClassViewのCTest3Viewを右クリックしてメンバ関数の追加で、自動で追加してくれま
す。
それを、haiさんのコードと比べてください。

あるいは、呼び出すより上に実装部分と宣言部分を兼ねて記述して、
ローカルな関数にしてもいいかと。

int Sum(int a)
{
return(a+30);
}
/////////////////////////////////////////////////////////////////////////////
// CTest3View クラスの描画
void CTest3View::OnDraw(CDC* pDC)
{
CTest3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q;
char b[100];
q=30;

sprintf(b,%d, Sum(q));
pDC->TextOut(10, 10, b);
}


返信引用
hai
 hai
(@hai)
ゲスト
結合: 23年前
投稿: 26
Topic starter  

また最初から作ってみました
その手順は
MFC AppWizard(exe)をつくり
CtttViewにsumというメンバ関数をint型でpublicを選択し作りました。
そして
// CTttView クラスのメッセージ ハンドラ

int CTttView::sum()
{
}
という画面がでてきたのでこれを
// CTttView クラスのメッセージ ハンドラ

int CTttView::sum(int a)
{
return(a+30);

}
と書きました。
次に
// CTttView クラスの描画のところで

// CTttView クラスの描画

void CTttView::OnDraw(CDC* pDC)
{
CTttDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q=30;
char b[100];
sprintf(b,%d,sum(q));
pDC->TextOut(100,100,b);

}

と書きました。

これでエラーが
C:\Program Files\Microsoft Visual Studio\MyProjects\ttt\tttView.cpp(63) : error
C2660: 'sum' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\MyProjects\ttt\tttView.cpp(112) :
error C2511: 'sum' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
コードを生成中...
cl.exe の実行エラー
とでました。

長くてすみませんm(__)m


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

C++の基礎は学びましょう。
メンバ関数の宣言と定義が異なるのでエラーが出ているのです。

おそらく,宣言は
int CTttView::sum (void);
で,定義が
int CTttView::sum (int);
という状態なのでしょう。
CTttView.hの中から,
int sum();
または
int sum(void);
と書いてあるところを
int sum(int);
に修正すればたぶんエラーが出なくなると思います。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

「CTttView.h」と言うヘッダファイルがあるはずです
その中に
class CTttView のような宣言があるはずです
そこから少し下のほうを見ると

int sum(); と成っているところありませんか
ここが間違っているんです

int sum(int);

にすればいいはずです

cppファイルの方だけ
>int CTttView::sum()
>{
>}

ここを
>int CTttView::sum(int a)
>{
と直したのが原因です

ヘッダファイルもキチンと直しましょう

>error C2511: 'sum' : オーバーロードされたメンバ関数が '<Unknown>' にありませ
>ん。

今回の場合は、
同じ名称で引数の数が違う場合
同じクラス宣言内では関数のオーバーロードが行われたものとして
コンパイラが勘違いしているメッセージのようです

つまりクラス宣言時の引数の数と実態となる関数の引数が合わないことを示しています

誰かもう少しフォローしてくれるとうれしいです


返信引用
hai
 hai
(@hai)
ゲスト
結合: 23年前
投稿: 26
Topic starter  

>int CTttView::sum(int a)
>{
>直したのが原因です

これはなおさなくてもよかったのでしょうか?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

woodさんのアドバイスをよく読みましょう。

「.hファイルを変更せずに、cppファイルだけ変更したのがいけない。」

と言っているのです。.hファイルでの関数宣言と、.cppでの関数定義で、リターン値の
型、引数の数・型・順番は完全に一致してなくてはならないのです。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>これはなおさなくてもよかったのでしょうか?
関数に引数を与えるかどうかを決めることは、プログラムを設計する上で非常に重要な事
です。「直す必要があったかどうか」ではなく、「あなたがその関数に引数を与える必要
があると決めたかどうか」です。そんなのはあなたにしか解りません。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました