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

通知
すべてクリア

[解決済] 関数のエラー

固定ページ 2 / 2

sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

>void CKteiView::hyouzi(CDC* pDC)(int x1[],int y1[],int a,int b,int c,int d,char
e[])
>
この宣言だと、

>error C2091: 関数は関数を返せません。
>
が出ちゃうんですよね?
関数は、「関数へのポインタ」なら返せますが、
この宣言だと、返してるのはポインタではないということでは?
YuOさんの最初の書き込み、とても重要だと思いますが。

結局CKteiView::hyouziという関数は、いくつの引数を必要とすると思いますか?


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

ごめんなさい、私の書き込み語弊がありますね。
関数内でデバイスコンテキストとっても別にかまわないわけだし。

YuOさんのいう
>関数の呼び出しについて,ちゃんとわかっていますか?

は、
『C++のにおける関数呼び出しというものの機構を理解していますか?』
という意味なことは、わかりますか?


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

>『C++のにおける関数呼び出しというものの機構を理解していますか?』
>という意味なことは、わかりますか?
いまいちわからないのですが

>関数内でデバイスコンテキストとっても別にかまわないわけだし。
デバイスコンテキストを取得するってゆうのはどのように
取得するのでしょうか。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

> error C2660: 'hyouzi' : 関数が不正な 7 個の実引数をともなって呼び出されまし
た。

> これはどういったエラーなのでしょうか。

宣言と定義の記述に食い違いがあるんでしょう。

.h と .cpp ファイルの、houzi() 関数の記述(=引数など)を見比べてください。

まーおそらくは .h の方でしょう。

例)
--hoge.h--
class CHoge
{
protected:
void houji(CDC* pDC,int x1[],int y1[],int a,int b,int c,int d,char e[]);
}
--hoge.h--

--hoge.cpp--
void CHoge::houji(CDC* pDC,int x1[],int y1[],int a,int b,int c,int d,char e[])
{
// TODO: ここに処理を記述します。
}
--hoge.cpp--


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

ちょっと錯綜しちゃってますね。

まず
関数っていうのは
0個以上の引数を渡して、
関数内の処理をして
1個、もしくは0個の値を返す。
というものである。
↑これはOK?

んで、
関数は
戻り値 関数名(引数並び);
として宣言する。

呼び出すとき、引数は宣言時の型か、
それへと暗黙に変換できる型の変数を宣言したとおりに渡す必要がある。
関数の宣言と定義は違う。(ちょっと微妙な表現ですが)
定義は宣言と同じシグネチャで行わなければ、オーバーロードとなる。
↑これはOK?

さらに
C++ではクラス毎にメンバ関数というものを作ることができ
ヘッダで宣言したものを実装ファイルで定義する(ことができる)。
このとき、クラス宣言時に宣言したシグネチャと違うものは定義できない。
↑これはOK?

以下、ここまではわかってるものとしてすすめます。
ここまでがわかっていないようでしたら入門書をもう一度読まれることをお勧めします。

で、

>void CKteiView::hyouzi(CDC* pDC)(int x1[],int y1[],int a,int b,int c,int
d,char e[])

という関数ですが、これは
戻り値 関数名(引数並び);
になってませんよね。

でもコンパイラから見るとこれは

戻り値 関数名(引数並び);

になっていて、まぁいろいろあって

CKteiViewクラスのhyouziという名前の
CDC*型の引数をとって
「int[]2つ, int4つ、char[]1つをうけて値を返さない関数 」
を返す関数

という意味になってしまいます

C++では関数を返すことはできないのでこれはエラーになります。
関数へのポインタを返すことはできるのですが、かなり込み入ったことをするのでなければ
普通そういうことはしません。

werさんは関数、あるいは関数ポインタを返す関数を作成したかったわけではありませんよね?
以下関数を返したかったわけではないと仮定して話を進めます。
関数を返したかったのであれば
・・・すみませんが『10年早いんだYO!!』とだけ言っておきます。

ここまできてやっと本題らしいことに入れますが、

引数については、woodさん、渋木宏明(ひどり) さん諸氏のおっしゃるとおりです。
本当に必要な引数を宣言し、同じシグネチャで実装し、その型で呼んでください。

デバイスコンテキストは、Windowsの表示デバイスを抽象化するもののため
どこに表示したいかによって異なります。

CKteiViewがCViewの派生クラスであるとして、そのViewのクライアント領域でいいのであれ
ば、
CWnd::GetDC(),もしくはCClientDCを使用するといいでしょう。


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

ご返答ありがとうございます。
実際やりたかったことはOnDraw関数に

  if(d==0)pDC->TextOut(x1[a],y1[a],e);
if(d==1)pDC->TextOut(x1[a],y1[a]-c,e);
if(d==2)pDC->TextOut(x1[a]-b,y1[a]-c,e);
if(d==3)pDC->TextOut(x1[a]-b,y1[a],e);
を書いていたんですがこれを違う関数を作り
表示させたかったんです。


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

皆様すいませんでした。
CClientDCをつかい表示できました。
ありがとうございました。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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