ページ 11

関数の分割ファイルです

Posted: 2011年6月26日(日) 12:41
by gyao
こんにちは
C言語初心者で教科書を見ながら作ったのですが
手詰まりになってしまいました。
よろしくお願いします。

コード:

static int factorial(int);

void main() {
  int n;
  for (n = 1; n <= 10; n++ ) {
    printf( "%2d! = %7d\n", n, factorial(n));
  }
}

static int factorial(int n){
  int r;
  if (n <= 1) r = 1;
  else r = n*factorial(n-1);
  return r;
}
このプログラムをファイル分割するのですが
試行錯誤の結果、このようになりました。

f.hファイル

コード:

extern int f11(int);
f.cppファイル

コード:

int factorial(int);
int f11(int x){
  int r;
  if (x <= 1) r = 1;
  else r = x*factorial(x-1);
  return r;
}
mainファイル

コード:

#include<stdio.h>
#include"f.h"
void main(){
	int n;
	for (n = 1; n <= 10; n++ ) {
	printf( "%2d! = %7d\n", n, f11(n));
	}
}
どなたか、よろしくお願いします。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 13:34
by 初級者
試行錯誤の結果、「現在どういう問題が発生しているのか」を書いてほしいです。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 13:34
by softya(ソフト屋)
codeタグを利用してくださいね。 付けておきました。

factorial関数を別ファイルに分けるだけでよいので、f11関数が出てくる必要はありません。
もしかして再帰呼び出しを理解されていないのではないですか?

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 13:58
by gyao
使い方わからなかったのですいません.。
ビルドをすると「外部参照1が未解決です」と出てしまいます。
f.cppファイルとmainファイルをいろいろ変えてみたのですが上手くいきません。
基礎が出来てないと思うのですが教科書で
足し算や引き算などはファイル分割出来るのですが
階乗の計算はどのようにすればよいのでしょうか?

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 14:02
by softya(ソフト屋)
factorialにおいての関数の再帰呼び出しがどう行われているか把握していれば、これは起きない問題ですね。
どうでしょうか?再帰呼び出しって説明できますか?

[追記]
教科書と言うがどういうものか分からないので、どういう順番でC言語を学ばれたかが分かりませんが関数については学ばれたんですよね?
※ このサイトに来ている人は大半教科書で学んでいない(サイトやC言語の入門書籍)と思われるので、教科書と言われてもピンと来ないひとが多いかも知れません。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 14:14
by gyao
ある関数の中から関数を呼び出すということなのですが
それがf11なのかという…。
f11の関数を作って呼び出すのかなと思ってます。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 14:36
by softya(ソフト屋)
関数から関数の自分自身を呼び出すのが再帰呼び出しです。
元のコードは再帰呼び出しとして記述されていますが、ご自身でファイル分割した段階のソースコードでは本来の意味が失われています。

[追記]f11と言う名前の関数が登場すると再帰呼び出しとして破綻するという意味です。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 16:11
by non
よろしければ、ファイル分割をしている理由も、教えてください。
教科書に載っているのもめずらしいと思いまして。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 16:52
by box
単純に、こうするだけでいいんじゃないでしょうか。

コード:

void main() {
  int n;
  for (n = 1; n <= 10; n++ ) {
    printf( "%2d! = %7d\n", n, factorial(n));
  }
}
----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 -----

コード:

int factorial(int n){
  int r;
  if (n <= 1) r = 1;
  else r = n*factorial(n-1);
  return r;
}

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 18:23
by gyao
boxさんありがとうございます。
出来ました。

ファイル分割の例題をやって
今回の宿題がでたのですが
例題は

f.cppファイル

コード:

int f11(int x, int y ) {
  return x+y;
}

int f22(int x, int y ) {
  return x-y;
}
f.hファイル

コード:

extern int f11(int, int);
extern int f22(int, int);
mainファイル

コード:

include<stdio.h>
#include "f.h"
void main() {
  int a, b;
  a = 7;
  b = 3;
  printf("f11(%d, %d)=%d\n", a, b, f11(a,b));
  printf("f22(%d, %d)=%d\n", a, b, f22(a,b));
}
です。
例題ではf.cppファイルとmainファイルの変数が違うのと
定義された関数factorialは使わないでf11みたいな関数を
自分で作らなくてはいけないのかと思ってました。
今でもプログラムは動きましたがちょっとよくわかりません。

基礎の基礎だと思うんですけど、授業が教科書のレベル超えてて苦戦してます。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 18:55
by non
授業の課題でしたか。

一番最初のプログラムで
>static int factorial(int);
staticがついてますが、これについては、どのような説明を受けましたか。?
参考までに教えてください。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 19:33
by gyao
static変数はプログラムの開始時に静的記憶域ひ確保されて
ファイル内だけに限定される、と思います。
外部からみられると書き換えられる可能性があるから危険とか…記憶寿命が…
すいません、ちょっとあやふやです。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 19:43
by softya(ソフト屋)
とりあえず答えが分かっても理解しないと意味が無いと思うので再帰呼び出しは理解しておいてください。
それとファイル分割は関数化をちゃんと理解して、externやらリンカの働きを理解する必要があります。
分からないところがあったら聞いてください。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 20:15
by non
staticの理解は私もその程度です。なぜ、最初のプログラムは単一ファイルなのにstaticがついているのかと
思ったので、質問させていただきました。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 20:24
by box
gyao さんが書きました:static変数
えっと、最初に投稿されたコードでのfactorial関数のことを書かれたんだと思いますが、
変数ではなくて関数ですよね。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 20:35
by あたっしゅ
gyao さんが書きました:static変数はプログラムの開始時に静的記憶域ひ確保されて
ファイル内だけに限定される、と思います。
外部からみられると書き換えられる可能性があるから危険とか…記憶寿命が…
すいません、ちょっとあやふやです。
「変数」と「関数」の区別がついていますか ? 「static変数」と「static関数」は、違いますよ。

Re: 関数の分割ファイルです

Posted: 2011年6月26日(日) 21:44
by gyao
softyaさん、nonさん、boxさん、あたっしゅさん
ありがとうございます。

プログラム何度も書いて覚えます。

つまづいたら、また、よろしくお願いします。