関数

[戻る]
hai 2002/11/20(水) 12:30:49
#include<stdio.h>

int sum(int a)
{
  int i;
  i=a+30;
  return(i);
}

void main(void)
{
  int q;
  q=30;
  printf("%d"sum(q));
}

といったことをしたいのですがどうすればいいのでしょうか?

2002/11/20(水) 12:49:42
printf("%d"sum(q)); ではなく

printf("%d\n", sum(q)); ではどうですか

2002/11/20(水) 12:51:47
int sum(int a)
{
  return(a+30);
}

なんてのは?

hai 2002/11/20(水) 12:55:02
すいません これをVC++でやりたいのですが

wood 2002/11/20(水) 12:59:26
ご質問の内容がよく理解できないのですが
何に困っているのでしょうか
コンパイル方法をどうしたらよいかとか
結果がうまく表示できないとか
具体的にどんなことで困っているのでしょうか?

島さんの回答も改行を付けただけのような気がしますけど

wood 2002/11/20(水) 13:01:57
タッチの差だったみたいですね
コンソールアプリの作り方を知りたいと言うことでよろしいのでしょうか?

hai 2002/11/20(水) 13:05:04
VC++(MFC AppWizard(exe))の関数の使い方についてしりたいのですが
最初に書いたプログラムの書き方をおしえてもらいたいのです

tib 2002/11/20(水) 13:05:28
>島さんの回答も改行を付けただけのような気がしますけど
「カンマをつけただけ」の間違いでは?
私には「ごく基本的な文法エラーの指摘」に見えます。

YuO [E-Mail] 2002/11/20(水) 13:19:03
VC++とMFCはイコールではないですよ。
あと,Developer StudioとVC++もイコールではないです。
#後者はよく間違えているひとがいますが……。

ちなみに,
> VC++(MFC AppWizard(exe))の関数の使い方についてしりたいのですが
関数の使い方はC/C++そのものです。

haiさんが提示したプログラムであれば,
vcvars32.batを実行後cl test.cのようにすれば(ソースファイル名がtest.cの場合),
コンパイルとリンク(エラーがなければ)を行い,test.exeが出来上がります。

2002/11/20(水) 13:31:10
島です

改行を加えたのはコンソールアプリなので、出力文字列の後にプロンプトが続くのは
見づらいだろうと考えたからです。',' に関しては hai さんが転記するときの間違いか
このことでコンパイラーが起こっていることが問題点なのかが判断できなかったので
そーっと付け加えることにしたのでした

hai 2002/11/20(水) 14:07:04
ちょっとよくわからないのですが
最初に示したプログラムをCApplView クラスの描画 の
ところにかけばいいのでしょうか?

mf 2002/11/20(水) 14:20:26
> VC++(MFC AppWizard(exe))の関数の使い方についてしりたいのですが

プロジェクト名を Print (適当) でSDIのプロジェクトを作るとおおよそ次のようになります。
SumはCPrintViewクラスのメンバー関数です。
printfが、CString::Formatや、pDC->TextOutに置き換わります。

int CPrintView:Sum(int a)
{
  return(a+30);
}
void CPrintView::OnDraw(CDC* pDC)
{
    CPrintDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。
    int q;
    q=30;
    CString str;
    str.Format("%d", Sum(q));
    pDC->TextOut(10, 10, str);
}

mf 2002/11/20(水) 14:56:15
int CPrintView::Sum(int a) です。
 : が抜けました。ごめんなさい

hai 2002/11/20(水) 15:04:07
すいません
C:\Program Files\Microsoft Visual Studio\MyProjects\test3\test3View.cpp(64) : 
error C2660: 'Sum' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\MyProjects\test3\test3View.cpp(113) : 
error C2511: 'Sum' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
C:\Program Files\Microsoft Visual Studio\MyProjects\test3\test3View.cpp(119) : 
error C2511: 'Sum' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
ってゆうエラーがでるのですが。

mf 2002/11/20(水) 15:17:05
test3View.h に関数Sumのプロトタイプを宣言してください。

// インプリメンテーション
public:
    int Sum(int a);

mf 2002/11/20(水) 15:55:34
int Sum(int a) の定義と、実装部分、それを呼び出している部分は一致してますか?

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

hai 2002/11/20(水) 17:11:29
// 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 2002/11/20(水) 17:17:05
[[解決]]
宣言していれば問題ないですね。

e 2002/11/20(水) 17:19:12
ごめんなさい、間違えて解決ボタン押してしまいました。
他人でも押せるんですね・・・失礼しました。

mf 2002/11/20(水) 17:37:31
>これではダメなんでしょうか?

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

hai 2002/11/20(水) 17:46:15
でも動かないんですが先ほどのエラーがでます。

e 2002/11/20(水) 17:50:07
宣言していれば問題ないですね。

mf 2002/11/20(水) 18:00:03
Test3View.h の Sumの宣言部分のコードはどうなってます?

mf 2002/11/20(水) 19:51:16
// 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 2002/11/20(水) 22:07:27
また最初から作ってみました
その手順は
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 [E-Mail] 2002/11/20(水) 22:36:06
C++の基礎は学びましょう。
メンバ関数の宣言と定義が異なるのでエラーが出ているのです。

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

wood 2002/11/20(水) 22:36:08
「CTttView.h」と言うヘッダファイルがあるはずです
その中に
class CTttView  のような宣言があるはずです
そこから少し下のほうを見ると

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

int sum(int);

にすればいいはずです

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

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

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

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

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

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

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

hai 2002/11/20(水) 23:04:16
>int CTttView::sum(int a)
>{
>直したのが原因です

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

tib 2002/11/20(水) 23:23:13
woodさんのアドバイスをよく読みましょう。

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

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

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

hai 2002/11/21(木) 00:09:33
変更しなかった場合どう書けばよかったのでしょうか?

tib 2002/11/21(木) 00:25:03
こういう条件なら
  関数名:sum
  リターン値の型:int
  引数:なし
TttView.h
  class CTttView : (略)
  {
    ...
    int sum();
    ...
  }

TttView.cpp
  int CTttView::sum()
  {
    ...
  }




こういう条件なら
  関数名:sum
  リターン値の型:int
  引数:int型の引数をひとつ
TttView.h
  class CTttView : (略)
  {
    ...
    int sum( int a );
    ...
  }

TttView.cpp
  int CTttView::sum( int a )
  {
    ...
  }

hai 2002/11/21(木) 01:11:14
2つの引数を使うときはどうすればいいのでしょうか?

tib 2002/11/21(木) 01:22:06
少しは「応用して試してみる」ということはできませんか? 試した上でうまく行かなかっ
たのなら、うまくいかなかったソースをココに転記してみてください。

複数の引数を使う場合はカンマで区切ればいいのです。

hai 2002/11/21(木) 01:26:39
やってみたところできました 
ありがとうございました

古いスレッドには追加発言できません。